From b5d0d31b0caf3bdb8d90b48211f4561815204cdf Mon Sep 17 00:00:00 2001 From: sin365 <353374337@qq.com> Date: Fri, 28 Jun 2024 18:08:25 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E5=AE=A2=E6=88=B7=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AxibugEmuOnline.Client/Assets/Aya.UNes.asmdef | 13 + .../Assets/Aya.UNes.asmdef.meta | 7 + AxibugEmuOnline.Client/Assets/LICENSE.md | 674 ++++++++ AxibugEmuOnline.Client/Assets/LICENSE.md.meta | 7 + AxibugEmuOnline.Client/Assets/Plugins.meta | 8 + .../Assets/Plugins/Google.Protobuf.dll | Bin 0 -> 381952 bytes .../Assets/Plugins/Google.Protobuf.dll.meta | 33 + .../HaoYueNet.ClientNetworkNet.Standard2.dll | Bin 0 -> 21504 bytes ...YueNet.ClientNetworkNet.Standard2.dll.meta | 33 + .../HaoYueNet.ServerNetwork.Standard2.dll | Bin 0 -> 25088 bytes ...HaoYueNet.ServerNetwork.Standard2.dll.meta | 33 + .../NoSugarNet.ClientCore.Standard2.dll | Bin 0 -> 59904 bytes .../NoSugarNet.ClientCore.Standard2.dll.meta | 33 + .../Assets/Plugins/NoSugarNet.DataHelper.dll | Bin 0 -> 5632 bytes .../Plugins/NoSugarNet.DataHelper.dll.meta | 33 + .../Assets/Plugins/System.Buffers.dll | Bin 0 -> 21376 bytes .../Assets/Plugins/System.Buffers.dll.meta | 33 + .../Assets/Plugins/System.Memory.dll | Bin 0 -> 142752 bytes .../Assets/Plugins/System.Memory.dll.meta | 33 + .../Plugins/System.Numerics.Vectors.dll | Bin 0 -> 163712 bytes .../Plugins/System.Numerics.Vectors.dll.meta | 33 + ...System.Runtime.CompilerServices.Unsafe.dll | Bin 0 -> 16768 bytes ...m.Runtime.CompilerServices.Unsafe.dll.meta | 33 + AxibugEmuOnline.Client/Assets/Resources.meta | 8 + .../Assets/Resources/Mario.bytes | Bin 0 -> 40976 bytes .../Assets/Resources/Mario.bytes.meta | 7 + .../Assets/Resources/Texture.meta | 8 + .../Texture/RenderTexture.renderTexture | 39 + .../Texture/RenderTexture.renderTexture.meta | 8 + AxibugEmuOnline.Client/Assets/Runtime.meta | 8 + .../Assets/Runtime/Controller.meta | 8 + .../Assets/Runtime/Controller/IController.cs | 15 + .../Runtime/Controller/IController.cs.meta | 11 + .../Assets/Runtime/Controller/KeyConfig.cs | 22 + .../Runtime/Controller/KeyConfig.cs.meta | 11 + .../Runtime/Controller/NesController.cs | 83 + .../Runtime/Controller/NesController.cs.meta | 11 + .../Assets/Runtime/Core.meta | 8 + .../Assets/Runtime/Core/Addressable.cs | 62 + .../Assets/Runtime/Core/Addressable.cs.meta | 11 + .../Assets/Runtime/Core/CPU.Core.cs | 81 + .../Assets/Runtime/Core/CPU.Core.cs.meta | 11 + .../Assets/Runtime/Core/CPU.IORegisters.cs | 44 + .../Runtime/Core/CPU.IORegisters.cs.meta | 11 + .../Assets/Runtime/Core/CPU.Instructions.cs | 463 ++++++ .../Runtime/Core/CPU.Instructions.cs.meta | 11 + .../Assets/Runtime/Core/CPU.Memory.cs | 165 ++ .../Assets/Runtime/Core/CPU.Memory.cs.meta | 11 + .../Assets/Runtime/Core/CPU.Registers.cs | 89 ++ .../Assets/Runtime/Core/CPU.Registers.cs.meta | 11 + .../Assets/Runtime/Core/CPU.cs | 65 + .../Assets/Runtime/Core/CPU.cs.meta | 11 + .../Assets/Runtime/Core/Cartridge.cs | 66 + .../Assets/Runtime/Core/Cartridge.cs.meta | 11 + .../Assets/Runtime/Core/Emulator.cs | 44 + .../Assets/Runtime/Core/Emulator.cs.meta | 11 + .../Assets/Runtime/Core/PPU.Core.cs | 394 +++++ .../Assets/Runtime/Core/PPU.Core.cs.meta | 11 + .../Assets/Runtime/Core/PPU.Memory.cs | 130 ++ .../Assets/Runtime/Core/PPU.Memory.cs.meta | 11 + .../Assets/Runtime/Core/PPU.Registers.cs | 261 +++ .../Assets/Runtime/Core/PPU.Registers.cs.meta | 11 + .../Assets/Runtime/Core/PPU.cs | 10 + .../Assets/Runtime/Core/PPU.cs.meta | 11 + .../Assets/Runtime/Core/Utility.cs | 35 + .../Assets/Runtime/Core/Utility.cs.meta | 11 + .../Assets/Runtime/Input.meta | 8 + .../Assets/Runtime/Input/BaseInput.cs | 11 + .../Assets/Runtime/Input/BaseInput.cs.meta | 11 + .../Assets/Runtime/Input/DefaultInput.cs | 49 + .../Assets/Runtime/Input/DefaultInput.cs.meta | 11 + .../Assets/Runtime/Mapper.meta | 8 + .../Assets/Runtime/Mapper/AxROM.cs | 26 + .../Assets/Runtime/Mapper/AxROM.cs.meta | 11 + .../Assets/Runtime/Mapper/BaseMapper.cs | 67 + .../Assets/Runtime/Mapper/BaseMapper.cs.meta | 11 + .../Assets/Runtime/Mapper/CNROM.cs | 32 + .../Assets/Runtime/Mapper/CNROM.cs.meta | 11 + .../Assets/Runtime/Mapper/Camerica.cs | 27 + .../Assets/Runtime/Mapper/Camerica.cs.meta | 11 + .../Assets/Runtime/Mapper/ColorDreams.cs | 29 + .../Assets/Runtime/Mapper/ColorDreams.cs.meta | 11 + .../Assets/Runtime/Mapper/DxROM.cs | 39 + .../Assets/Runtime/Mapper/DxROM.cs.meta | 11 + .../Assets/Runtime/Mapper/GxROM.cs | 29 + .../Assets/Runtime/Mapper/GxROM.cs.meta | 11 + .../Assets/Runtime/Mapper/Jaleco.cs | 29 + .../Assets/Runtime/Mapper/Jaleco.cs.meta | 11 + .../Assets/Runtime/Mapper/MMC1.cs | 170 ++ .../Assets/Runtime/Mapper/MMC1.cs.meta | 11 + .../Assets/Runtime/Mapper/MMC2.cs | 33 + .../Assets/Runtime/Mapper/MMC2.cs.meta | 11 + .../Assets/Runtime/Mapper/MMC3.cs | 182 +++ .../Assets/Runtime/Mapper/MMC3.cs.meta | 11 + .../Assets/Runtime/Mapper/MMC4.cs | 73 + .../Assets/Runtime/Mapper/MMC4.cs.meta | 11 + .../Assets/Runtime/Mapper/Mapper094.cs | 17 + .../Assets/Runtime/Mapper/Mapper094.cs.meta | 11 + .../Assets/Runtime/Mapper/Mapper155.cs | 11 + .../Assets/Runtime/Mapper/Mapper155.cs.meta | 11 + .../Assets/Runtime/Mapper/Mapper180.cs | 21 + .../Assets/Runtime/Mapper/Mapper180.cs.meta | 11 + .../Assets/Runtime/Mapper/NROM.cs | 23 + .../Assets/Runtime/Mapper/NROM.cs.meta | 11 + .../Assets/Runtime/Mapper/Nina003006.cs | 32 + .../Assets/Runtime/Mapper/Nina003006.cs.meta | 11 + .../Assets/Runtime/Mapper/UxROM.cs | 22 + .../Assets/Runtime/Mapper/UxROM.cs.meta | 11 + .../Assets/Runtime/Renderer.meta | 8 + .../Assets/Runtime/Renderer/IRenderer.cs | 13 + .../Assets/Runtime/Renderer/IRenderer.cs.meta | 11 + .../Assets/Runtime/Renderer/UnityRenderer.cs | 71 + .../Runtime/Renderer/UnityRenderer.cs.meta | 11 + .../Assets/Runtime/UNESBehaviour.cs | 281 ++++ .../Assets/Runtime/UNESBehaviour.cs.meta | 11 + AxibugEmuOnline.Client/Assets/Scene.meta | 8 + .../Assets/Scene/AxibugEmuOnline.Client.unity | 660 ++++++++ .../Scene/AxibugEmuOnline.Client.unity.meta | 7 + AxibugEmuOnline.Client/Assets/Script.meta | 8 + .../Assets/Script/AppAxibugEmuOnline.cs | 47 + .../Assets/Script/AppAxibugEmuOnline.cs.meta | 11 + .../Assets/Script/Common.meta | 8 + .../Assets/Script/Common/Helper.cs | 22 + .../Assets/Script/Common/Helper.cs.meta | 11 + .../Assets/Script/Common/ProtoBufHelper.cs | 21 + .../Script/Common/ProtoBufHelper.cs.meta | 11 + .../Assets/Script/Event.meta | 8 + .../Assets/Script/Event/EEvent.cs | 8 + .../Assets/Script/Event/EEvent.cs.meta | 11 + .../Assets/Script/Event/EventSystem.cs | 242 +++ .../Assets/Script/Event/EventSystem.cs.meta | 11 + .../Assets/Script/Manager.meta | 8 + .../Assets/Script/Manager/AppChat.cs | 31 + .../Assets/Script/Manager/AppChat.cs.meta | 11 + .../Assets/Script/Manager/AppGame.cs | 76 + .../Assets/Script/Manager/AppGame.cs.meta | 11 + .../Assets/Script/Manager/AppLogin.cs | 46 + .../Assets/Script/Manager/AppLogin.cs.meta | 11 + .../Assets/Script/Manager/LogManager.cs | 53 + .../Assets/Script/Manager/LogManager.cs.meta | 11 + .../Assets/Script/Manager/UserDataManager.cs | 58 + .../Script/Manager/UserDataManager.cs.meta | 11 + .../Assets/Script/Network.meta | 8 + .../Assets/Script/Network/NetMsg.cs | 98 ++ .../Assets/Script/Network/NetMsg.cs.meta | 11 + .../Assets/Script/Network/NetworkHelper.cs | 131 ++ .../Script/Network/NetworkHelper.cs.meta | 11 + .../Assets/Script/Protobuf.meta | 8 + .../Protobuf/ProtobufAxibugEmuOnline.cs | 1398 +++++++++++++++++ .../Protobuf/ProtobufAxibugEmuOnline.cs.meta | 11 + .../Assets/Script/UNESTest.cs | 45 + .../Assets/Script/UNESTest.cs.meta | 11 + .../AxibugEmuOnline.Client.sln | 20 + README.md | 59 +- 154 files changed, 8111 insertions(+), 1 deletion(-) create mode 100644 AxibugEmuOnline.Client/Assets/Aya.UNes.asmdef create mode 100644 AxibugEmuOnline.Client/Assets/Aya.UNes.asmdef.meta create mode 100644 AxibugEmuOnline.Client/Assets/LICENSE.md create mode 100644 AxibugEmuOnline.Client/Assets/LICENSE.md.meta create mode 100644 AxibugEmuOnline.Client/Assets/Plugins.meta create mode 100644 AxibugEmuOnline.Client/Assets/Plugins/Google.Protobuf.dll create mode 100644 AxibugEmuOnline.Client/Assets/Plugins/Google.Protobuf.dll.meta create mode 100644 AxibugEmuOnline.Client/Assets/Plugins/HaoYueNet.ClientNetworkNet.Standard2.dll create mode 100644 AxibugEmuOnline.Client/Assets/Plugins/HaoYueNet.ClientNetworkNet.Standard2.dll.meta create mode 100644 AxibugEmuOnline.Client/Assets/Plugins/HaoYueNet.ServerNetwork.Standard2.dll create mode 100644 AxibugEmuOnline.Client/Assets/Plugins/HaoYueNet.ServerNetwork.Standard2.dll.meta create mode 100644 AxibugEmuOnline.Client/Assets/Plugins/NoSugarNet.ClientCore.Standard2.dll create mode 100644 AxibugEmuOnline.Client/Assets/Plugins/NoSugarNet.ClientCore.Standard2.dll.meta create mode 100644 AxibugEmuOnline.Client/Assets/Plugins/NoSugarNet.DataHelper.dll create mode 100644 AxibugEmuOnline.Client/Assets/Plugins/NoSugarNet.DataHelper.dll.meta create mode 100644 AxibugEmuOnline.Client/Assets/Plugins/System.Buffers.dll create mode 100644 AxibugEmuOnline.Client/Assets/Plugins/System.Buffers.dll.meta create mode 100644 AxibugEmuOnline.Client/Assets/Plugins/System.Memory.dll create mode 100644 AxibugEmuOnline.Client/Assets/Plugins/System.Memory.dll.meta create mode 100644 AxibugEmuOnline.Client/Assets/Plugins/System.Numerics.Vectors.dll create mode 100644 AxibugEmuOnline.Client/Assets/Plugins/System.Numerics.Vectors.dll.meta create mode 100644 AxibugEmuOnline.Client/Assets/Plugins/System.Runtime.CompilerServices.Unsafe.dll create mode 100644 AxibugEmuOnline.Client/Assets/Plugins/System.Runtime.CompilerServices.Unsafe.dll.meta create mode 100644 AxibugEmuOnline.Client/Assets/Resources.meta create mode 100644 AxibugEmuOnline.Client/Assets/Resources/Mario.bytes create mode 100644 AxibugEmuOnline.Client/Assets/Resources/Mario.bytes.meta create mode 100644 AxibugEmuOnline.Client/Assets/Resources/Texture.meta create mode 100644 AxibugEmuOnline.Client/Assets/Resources/Texture/RenderTexture.renderTexture create mode 100644 AxibugEmuOnline.Client/Assets/Resources/Texture/RenderTexture.renderTexture.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Controller.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Controller/IController.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Controller/IController.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Controller/KeyConfig.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Controller/KeyConfig.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Controller/NesController.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Controller/NesController.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Core.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Core/Addressable.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Core/Addressable.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.Core.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.Core.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.IORegisters.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.IORegisters.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.Instructions.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.Instructions.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.Memory.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.Memory.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.Registers.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.Registers.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Core/Cartridge.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Core/Cartridge.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Core/Emulator.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Core/Emulator.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Core/PPU.Core.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Core/PPU.Core.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Core/PPU.Memory.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Core/PPU.Memory.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Core/PPU.Registers.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Core/PPU.Registers.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Core/PPU.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Core/PPU.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Core/Utility.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Core/Utility.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Input.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Input/BaseInput.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Input/BaseInput.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Input/DefaultInput.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Input/DefaultInput.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Mapper.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Mapper/AxROM.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Mapper/AxROM.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Mapper/BaseMapper.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Mapper/BaseMapper.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Mapper/CNROM.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Mapper/CNROM.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Mapper/Camerica.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Mapper/Camerica.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Mapper/ColorDreams.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Mapper/ColorDreams.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Mapper/DxROM.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Mapper/DxROM.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Mapper/GxROM.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Mapper/GxROM.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Mapper/Jaleco.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Mapper/Jaleco.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Mapper/MMC1.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Mapper/MMC1.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Mapper/MMC2.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Mapper/MMC2.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Mapper/MMC3.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Mapper/MMC3.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Mapper/MMC4.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Mapper/MMC4.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Mapper/Mapper094.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Mapper/Mapper094.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Mapper/Mapper155.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Mapper/Mapper155.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Mapper/Mapper180.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Mapper/Mapper180.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Mapper/NROM.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Mapper/NROM.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Mapper/Nina003006.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Mapper/Nina003006.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Mapper/UxROM.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Mapper/UxROM.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Renderer.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Renderer/IRenderer.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Renderer/IRenderer.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Renderer/UnityRenderer.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/Renderer/UnityRenderer.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/UNESBehaviour.cs create mode 100644 AxibugEmuOnline.Client/Assets/Runtime/UNESBehaviour.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Scene.meta create mode 100644 AxibugEmuOnline.Client/Assets/Scene/AxibugEmuOnline.Client.unity create mode 100644 AxibugEmuOnline.Client/Assets/Scene/AxibugEmuOnline.Client.unity.meta create mode 100644 AxibugEmuOnline.Client/Assets/Script.meta create mode 100644 AxibugEmuOnline.Client/Assets/Script/AppAxibugEmuOnline.cs create mode 100644 AxibugEmuOnline.Client/Assets/Script/AppAxibugEmuOnline.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Script/Common.meta create mode 100644 AxibugEmuOnline.Client/Assets/Script/Common/Helper.cs create mode 100644 AxibugEmuOnline.Client/Assets/Script/Common/Helper.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Script/Common/ProtoBufHelper.cs create mode 100644 AxibugEmuOnline.Client/Assets/Script/Common/ProtoBufHelper.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Script/Event.meta create mode 100644 AxibugEmuOnline.Client/Assets/Script/Event/EEvent.cs create mode 100644 AxibugEmuOnline.Client/Assets/Script/Event/EEvent.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Script/Event/EventSystem.cs create mode 100644 AxibugEmuOnline.Client/Assets/Script/Event/EventSystem.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Script/Manager.meta create mode 100644 AxibugEmuOnline.Client/Assets/Script/Manager/AppChat.cs create mode 100644 AxibugEmuOnline.Client/Assets/Script/Manager/AppChat.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Script/Manager/AppGame.cs create mode 100644 AxibugEmuOnline.Client/Assets/Script/Manager/AppGame.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Script/Manager/AppLogin.cs create mode 100644 AxibugEmuOnline.Client/Assets/Script/Manager/AppLogin.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Script/Manager/LogManager.cs create mode 100644 AxibugEmuOnline.Client/Assets/Script/Manager/LogManager.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Script/Manager/UserDataManager.cs create mode 100644 AxibugEmuOnline.Client/Assets/Script/Manager/UserDataManager.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Script/Network.meta create mode 100644 AxibugEmuOnline.Client/Assets/Script/Network/NetMsg.cs create mode 100644 AxibugEmuOnline.Client/Assets/Script/Network/NetMsg.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Script/Network/NetworkHelper.cs create mode 100644 AxibugEmuOnline.Client/Assets/Script/Network/NetworkHelper.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Script/Protobuf.meta create mode 100644 AxibugEmuOnline.Client/Assets/Script/Protobuf/ProtobufAxibugEmuOnline.cs create mode 100644 AxibugEmuOnline.Client/Assets/Script/Protobuf/ProtobufAxibugEmuOnline.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/Script/UNESTest.cs create mode 100644 AxibugEmuOnline.Client/Assets/Script/UNESTest.cs.meta create mode 100644 AxibugEmuOnline.Client/AxibugEmuOnline.Client.sln diff --git a/AxibugEmuOnline.Client/Assets/Aya.UNes.asmdef b/AxibugEmuOnline.Client/Assets/Aya.UNes.asmdef new file mode 100644 index 0000000..dd9bddb --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Aya.UNes.asmdef @@ -0,0 +1,13 @@ +{ + "name": "AxibugEmuOnline.Client.UNES", + "references": [], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": true, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Aya.UNes.asmdef.meta b/AxibugEmuOnline.Client/Assets/Aya.UNes.asmdef.meta new file mode 100644 index 0000000..11f4d03 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Aya.UNes.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3fe77f1eed9fc0847a86648f644fe815 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/LICENSE.md b/AxibugEmuOnline.Client/Assets/LICENSE.md new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/LICENSE.md @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/AxibugEmuOnline.Client/Assets/LICENSE.md.meta b/AxibugEmuOnline.Client/Assets/LICENSE.md.meta new file mode 100644 index 0000000..f0c8496 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/LICENSE.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8b0730be05596c544807c9992169cb68 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Plugins.meta b/AxibugEmuOnline.Client/Assets/Plugins.meta new file mode 100644 index 0000000..926dfd4 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 69eb869b06dab98439f07da4549fb7cb +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Google.Protobuf.dll b/AxibugEmuOnline.Client/Assets/Plugins/Google.Protobuf.dll new file mode 100644 index 0000000000000000000000000000000000000000..7663c313cb9e24f3c80190a0b2509d839ad1fd5f GIT binary patch literal 381952 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⁢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 literal 0 HcmV?d00001 diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Google.Protobuf.dll.meta b/AxibugEmuOnline.Client/Assets/Plugins/Google.Protobuf.dll.meta new file mode 100644 index 0000000..794d80b --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/Google.Protobuf.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 2c61c2e567bd4e146b4c09946e815a55 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Plugins/HaoYueNet.ClientNetworkNet.Standard2.dll b/AxibugEmuOnline.Client/Assets/Plugins/HaoYueNet.ClientNetworkNet.Standard2.dll new file mode 100644 index 0000000000000000000000000000000000000000..c3c4a9054b8382903afa0146193f59e88d636096 GIT binary patch literal 21504 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 TRge5O^$%*vzbpR(c;Np4%$%eVUu%E! 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 literal 0 HcmV?d00001 diff --git a/AxibugEmuOnline.Client/Assets/Plugins/HaoYueNet.ServerNetwork.Standard2.dll.meta b/AxibugEmuOnline.Client/Assets/Plugins/HaoYueNet.ServerNetwork.Standard2.dll.meta new file mode 100644 index 0000000..07f0863 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/HaoYueNet.ServerNetwork.Standard2.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: bba3137572a9a52478aa945ce387a192 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Plugins/NoSugarNet.ClientCore.Standard2.dll b/AxibugEmuOnline.Client/Assets/Plugins/NoSugarNet.ClientCore.Standard2.dll new file mode 100644 index 0000000000000000000000000000000000000000..58d737f359fbc6eab24fb155f8c685328015cb17 GIT binary patch literal 59904 zcmd4434B!5*+2f=duPjJvXV>|$N~ZmA%q=8P!j?|*q4By&=8UV0wFifOb`sgP?d^B zajDj}z6w>VR@-W|F4ZcyReZJLTJ=?=YAagX+SazN`1?N3Id|qxKx=>R=f6bfxzBRW zbDr~@=RD`!bMFju&bX8;BJ$w##TP{P;>v%u0>2vcLY!Uk%WS$UE7OlL1i}L@et0tL+zxzKY znkSe+vy)1Mp+KcUAz*iXM%3tH|68;&X}S~*fS%#1RFjBqN`Njn2mqP%Roe|p{wj%9 z*2Lnm7EsDI^vwt2O%W$SErzQm7HzjtkZmQ{EIv4#EFwrP(Uf!!(O=Mi{$txr^3tU? z(cp`mLwKe(Xwx z^o!+W2&W*nLm`DRD=3_BtVbb5v41I~ICfU1h)QCAR7hzo8WK+b*c%EN5L=cdoU+*S z3Mr4x$resU?AHpZjMe1`XJG7pMk4(%0+9lM@Wpv>T>p!wiu(>AcFag2`0(KYe~KtR zfLZ29N)BYCh|&YWBvDWiy7)AuDAQp^pv70}3{PP$n^6=SCfDNFsd6oe&EsnU{^DWX zIKou57pZhBXx0igXazg8g75WFP<$XOsbC@$6gw8&q!m2Vr$Whr>|}*G?h3Ey3V-ZV zq4Ypbvcf7seqP-^{H5X00E&ZBEP4+l~&PZT1CbIM31iV^w+8pJb<{;HQxLx z<4*2lTt(&q1ck2o@qbV=Uc^ye4A3h{qjc*)&K;*kyij77fFHI?0jo+Qh;CoiMl;ro zwtFHdrBNgrj~VIDh5C&$llj?5i=6XH;;rl*(Akmf{kGe zR%b(nP)nbo(>^ZER+x)`V|P^dv&thF;Gm`G$PnP# z$^xq**O9TcT9z^q1xlR);yVl_DyIxZfk93I@uL(_=7yBDmVLaK20vPKKHCL9h8;iV z`iit&h>qaWrH*OB7n_p&lvyGadxklcQYMK|Y;lBryoWFfE)DuHA1vC)j>4Zc!l+W= zQynrD63K=~R0s)Aj6ovQVWb9%3yUGhTRN0d0x<$v#%F3zh#`^TXkX199=B>x9Ag%p z#dg3q!&`k7x#Kf^376;i$T8lXmI0W0D2|Ylx~H&X(^}3NjZ@F zs(z^R3@mU`4)i)G^f=i^&D|N|ZH`UEE9W1s*CUm!Zm!rPwXJTh*(24h?s1GWKzX=J z=O4x}1LBBn$v>>5PYMwhvJ30%BN7%w+(aLdupr_VC4ULRnJC1D!=D^GCbjFnq~#&R zKjMI4Dy2ja!eBCVF%gDfGITM~DKHsI+LG?-PD?W4b}vG^9-WK0p;XEcsuE+zd5D`! ziG*@Q+-OQ9lq2G%C3`U<$t{RZ+gdF4NFIXNqq$#}hrUDV&y1w3M7{_*`9hookY+0i z6xYX%s3Qpp_OM;p`OBZmNh!-X*N9=rr#hUJ$t-Y; z(jk=+h(VacI;

i806^oS4KZ0##ySS{4)_yl1c|25TfQMST_d<3qlRASb4LS7NG^ z#3Y(jVq#PhlO!LuR}zy@aE>c6v1O8&Fjs?IIhB|$Lt=UWijMeh%^B!CuKo zrCZ0drLMhDv6Glif)>o_I0^)NCZUwx0KH^JCPRcQaw3>L41jY1dqT3P)eT&y7{)lo zoXiT55x9nA1VO;yx>cMRu+o~5dM>8&+?3=Py7nliLT=d%)#T>dy8RQ-K5u7CX(cAI*ejDjbiqiT1lnAs4#R>O(AVZZ^TM%F z%?r`WkuOSXVWl=uc>zNfM0B%-+M9@)V2_MwYS|TA8(^!%_hc-&B^=pDV>UXE8Jw>j)k_-1%7dlKgX z=zLlnmpE}e7bSU**B`a39yTNMxsz5mTJ!WU01m~T9tObCWgWMSaojFY3Z#a_E!W~e z<{H8fgabI6$9^f7|7Y5Iwg@cCW~lbji-l&WVwjuKO;@m)@FlNNvvKw5c;(6xuZ(cK zVxGtf#acwb2zJUkkWJ}{gf46Us?bfgh2~(twB*|FG98(U*35{sh4mr1-(`l5Yi@e#IjUXvCOD!3r|BABHWy0Ux{pPC>h2NA^Sdv z!bf~R=P;g*;_(>(y%MgaTan??qPEnD+7@U*_EmSHaFmmMFE=Am?upgS%pQ?g-G~Jp zw2X1kuIBoPQ7+JDXC^F;)*K$~^<41Dv}j!mmSr*-H?PR$LDzXi^rDl=eT%k zHzZUgI*L7%RFyzv+`a4mw5n7Vx6{zOiG0b9AWxT(ckxkqKtDEIL zQpoD&0zFd7>P9N{^e{jf1gH)q#yF5Ra}x+8uGlA#gar}n=_3*rM66a)q#zu0xg2!g zWTh&{oerPzUs?oqLvGm&QxO>H5hgaWmE6__{eB&%tTYv;LRG3b zl?GBGZb%2K8Q}&b$uh#(7af$?=Jq7E8Ts8LD~2 zP3fj9&?j|%$NQ0ho=03&W&|Vd{Rrz20V6Jf^h2f!>;9^#(q}&+ExGn1OzZuKw1r8K z+>bCr$y9Tg1k#gZ??*(lM6&3_!l=Su)CynpIs867a3ValXMlTjjEiQDSW$chtWwUE z8%I%kC3px!m!BnynRZ2SO1A~S4^P{VNL3ZVjHdP@+?>QL0x=ljhLSPM`;mPpe8hJ@ z$1LI|7+(m`E5Ta2wUL{5-3^vGG5bSkNyaSJlpEN5s~g$d)58GxGR7GIKa+6=z_I<( z@yi&;?~O{C)Ru5%4IIB*TNr|X!779y2nTdN2lP)_fy${!Kk}Ehe%u7PWiwRKeT&cx z6@9DF3{|wVVcJj??MinPnw@xOWfInmxWYQZT1CK!Tfpi?z=%sA4v~q#&3@HH;5`=h zAo6EM!~)kmU|P=uvB5nLn4x82hI^r4hMpsA0PoqQ|EW2``Px}0q*a*<(w;LHRJVmM zZ6*2AobaU`hu^2u>2rtkH2Z?h`s4NRIjo6OV6k`igQ;geAPO;lC#U4i0BfbZD ziXjsR#UYT2^TbHv%t|?aTOtJf*B{{`#qk2DROrIu{?_mJEnQ;cdSKy+aAu-0& z>H(!dYRIJFT0E_|hA;%-S=5hb(IZ?weObW03cSrwO_aStGgK3Wo6=3|iQ?R+I`f3< zO4KvriuwpE5dkAEfpkQs11tZk>Ck6gkd|EYfoUD{(w2KZFhj>Yx56o9+#xhTo?gI~T>~gfkG1EuIG3!2h zU686Ogc(f*EjO16T5c#Aw7f1L91yhoIA{_2!8mSYgS`^1rCX5^u*FY3F|EjOqV_jX z7DrytFM)@c zb-7t$mg%npc`%MGQ)?4u}r#P=x2ERuRKj+G?XE5Ta26)R_Y%m$s9 zeG6)E!y3UZBiLi3Sn6K+_uLh$dp(#v41jN7oB?nytZG=@ZNOD1GsdC(2iA+o<%$xy zf`Gxbg&_zStS5ELZ1F>UVR4ifa+LptRdJkRcP4*n`{T`79RQ@uKZ`lu^Wb8Y(@GD+6e%6**J0_UVhvNIMfV8iqQhvNA?Szl=$L{FAiqs(~&~8>Tj_$z-+X-l}_?}CGc(BjLSo{1oW@!-VlLIFp&pV$B@WFUc z1+5gadqI!+jp>u;`aK+TW~2z})c&IZZD9a)%)Xdv%g1f`y$_2wu0;Ag$4`Mgs1B3~k^Wf|NcnuNA2nF}6)Y67qWm7^?s8$5!?4{=Oz-w?~bf-fHXN?am0 zqF8Y2`EXL@g-A6%`lx$j9^{_-_#32R&IaZoGoJdM+OOqb238Oep*dr8~6rI9>f zW;Z87uYCb5$hCaHMyvWhLMEaD*ddEe5LJAmo4uI@A;!+kVz?qa+QXA9+|M(-)+b*f z3FUcwXY}*tfxoOK%b({Bgng0iP(D0Y2u#O3?=s<-mM0Jyiq`TxMN4_|W{kPN3QVss z)m(|ghC7Btzz{f9xS;^D*jt z``^`pCi#nRf-Swgn3>ghJL)X%TMM&ze#AQ%!$^7J>luSvJ@Ep@II7~?7(<^u=b|~! zk-{?A7>D9uFHH7q6>t%-b{mUAQ0RgqzG~EpV?7Sqn45}QWM2xj>PO-d(<%yw?aRQZ z4oRINeyS3z5U|2{1XiAxgT9vsOTuf&2y9 z*J2(+4%ygvXRxjC=ql4=@8()3qCQq1%)OIFfSAGa?x0VAV<3{c{_h$XKNY`xp-`fSyv;W6C~LRYruv7f?J2 zC6T--%?yt{1nh%lnW`Ui&<}r~&Er9_kM|BlcQ~n5=Dh=L^d{p zED75P!eA9#g2{_SRh}FYGGbG&e1THqFLNJi!-gsr8F}3%~rl||n-i!C0-$dI3q;2CEO}pCU zjS${2J$Sm?5c|hq!Zhw>fcH+0QTA=XtFyF;_D?_!O{@4*=C}<^+LuM^&Q|taqN-b> zY=jrPSlPF7uPys$P=I|aUS9Hg3LE*w*OY&ht%{G0u1mo7HWr~RjvcJ8>9NBbV_!FW zP{tSQOdq*X<*C-wZH*H~!*f*Jp64)p9vOrxxkp$C9asynhO*i2VHJjbI}GBlQVr)l zb+#GE_|9_?-b5s~&+n_6_8lmAOn+t2Dbtm|xKC_zIk)G`V@x-RYuWeMr$cq7-|9h< z@%TMGyfyN5?`OjPIT}zlw?jvTTL;chq>z0l$`p;%BN4v~)B+{R42S%9{}P!oIJ`g? z{so9E&-@JgZXhlN;ZX;R`gslp1Jypix+BW-==-Z08r_uY3&$q^={$=}isX6^l=UEw z0=<_}WK$>QB8_6Ne;>G|>6% z2PvKtF8g*oY^j7_`s7=@*EVEA?ayI*ruY$EfqYBG2fMFF zARAt+)15NXZ$ApAWMaSl7|`&jHx33fs(k@9L}Ihg zi(8uaR6J(T;1Q`gRR^8NA4{jwBE1if&ejxnFLW?J-pDiGtvgT!J&ykB@k;*~myRlj zcn&J?hzQZ@!H+>y_M%?=dG02{)Oi{t>3;><;QL#z{v8hF$ZjrU*)O1Yb;O}w1m&?` z0t}BFp3eL&nAjvqt@z6zaI4Nd`xO?*+LVd*Bj~>;Xj;BVlWvnwJ=LG1P}&^pP^!&W zp#_;j8O1F7e*i{c2dG%DvAjy1b)F7&!z8{U&1fX(tDfbvUq^w=;lr?G9RwB%BrqEN zJ@y+Q4))8Er6t)g$vjq#KQrb5=9w9p)U?oHfjOmpShNDF4GJG+gYu6=TZ>9+o=rI0@~A%q`5t zi3f%WCzbxOZ=eq{ZpW(kZD>vWn|cdSzna^NU5~x1wR0_e75O9E#MW8WwO6A2 z!IGdEVuM!0_xoQXD0sw(C0aVnUdf%CW3u@uzIxW;Y8Gv`@tfusKH^F z-8@=DMp#3Kd+is{NniCvW>}i9y2$;=Xip9X_lR!;iliPHsd&J;K_g*5^ZDSm4Htb_ z%eB<$tv<2k^IGiLX%xy^kr0PSauv@txRC5_=OOP@6atTYfvUIf~EPD$mg%{c9vSfmy!iu`YRjImA zCcNgzfXGBYWh?IBJVoo44(VltTfWC>Sr9Ppbr^!6b!?XL)u;>6V&oz=!HVqU)=RhE z$0eQB?gNzS`6W2|#7$PaE4kp;#SjmqBj?7#9X#k#1dzkzbCi*6>bfmj!Xm9{Sa zodq%vGSLR|mR=Wsz}Ef0z;~~^u0CPib({Yxti-yTVkOsI#rlxtn8g4wT7kV` zWDh!lMQ*;c?$)H%-TA!kdb2&*Ui%-Y{FRIE{-YLOXYK7bGPU+jn&Uh(_0Snd*)Z3! zp*m&50&Ro+&wppZe;;K5774xn=Z#3&FmaY+gZgevx*ujcHdLi-SSU8w|N3_pJbjb} zPWw5-Q|+J7;I!|h_)$Js*qbSe=W%LpwhKYrE9s;r@)^6}2AP_en*qW-5RK(nulzaI zs3I)f;V{1$6^tBV9k@CAf(bG($&q>uzHUFz2%pQ3e??3%h9nBuLlHcK4c^Ei><4e= zHt**Y=4A3xSso#}l|>Jvi?D?IAo?kbaOmW&HCc)7V9|r=B1}Q9br*|pFy*erTLFmf zVbR`n(IzGOC5!f@i*_l|uUPbOy66Ta+RLIx(naVdxAh2%9!(b=P@>0K^jNy+_e!*% zML6Sd8;?Q4A&n_d5o`~;96z$)#kFTY3hE^Q@+U#1%b!Zg@dJH}X5w(qzzD0~^4mDB zW>n4CQDa9>WR6$9>o*FUkmI%zU4v^aHb%!SO2pba*6`G$*H#lb zMLE;~H9pGAjAr@hVCKbnKH4C#O5k*Xw+VbZ$kL7=Ysd_($o0|f#SDKGWN4SH$PLoF z;TX#NCYSL~gR#6Iz2FaK1?jioLn`?Ea^}x_H~=hYcLx}yI+l=*cYORq!SFx}wq^809526LuJ-J4+TP0~u3 zZp_$@S`T|!x?E~~2C0wkG#LI~;9CL4KZZ|yR49IXCX4aM${1cPn$JU-AkD~UFa5QU z`@1lYd$$)h1gW8zIpf33Ss?oVF7SMj&hjw-b>X~*7O$ZD5OF?g4&0LOqwU2*`uk{2 z8N+t5q&wV*@}HD*>wobuUJd^|M88A~KSVtOiwhb58*m?enzyg`dAbSs^CEqoSo*w3 z-x1C`^b(}+NSSx27E&MmRr-5_=s!9CV)QG7Uihdrydsxl@ly#&nRmD;TORy#(Rf5J zn4q3Rj4{PCC6^vUw2lYvp=}Ufmsgrqhxqprk}ORzOS2jv@e8%k&s2`4=4CLIuc>mO ziZpe63Cqfa%BA6=bD*Yv2Ay@dbFPHWT)L--sqr*XsGkOynoM(qYRhJ73ci)gCBG;2 zPNOcNo@w`xDGl&{M{Z^>oi|jd2L+O^H3j;&xix}RY&G42IhF1!_w3PA90&le#|309jAwT!K;Jlgr-6UuGfFFSK+iZpp z7!3am=#;-`z;)ov@G!i`%W!!y!)W<+$uipqTo2AW*$l0s>jR_di^7`%2Gtb(44hN@ z&GH*mXtCyDf@fH);rD`{Wz9gp48i|l&hT^HJCk*PF8t+EX1n002p$)Fyx`9Z-e#$G z?@!ik6n>?}etQJ?XjU@&lq_?d@E4&) z<{wV-3x)p$EML-_Dzl__m+XoYR1x z<@*4=UH}-T?4lX|Fx8lhUj=`L>AkX9fFrVJW`ybG!g+wR^A-WNlq?0jAZG=jKimvB zzi>6+)j6~Lc~n-iJ|mAjB{o`FZSD;CsBFLofcyG$TW6Ig(C&)-9>A;0+5ZzuF8qp; z` z1y&0j9rV%n`%eJ;C+zf5Rfs)s6bD&rC+5_){7Jzjy^m)zJU5Hs{P3jU{7T+0Y%lHz z`>+ZwO;V3z&FD;0wLyc}sJdD^7%GfqHT<;qR)z9}4GzdR9|U zgqMPPOQ_#v+#2qW_TCf9X+1E6>oK(gC6^2J2g94u5;Un*$pR;5tOeDssaY8tKy_&< zGb0|fs7F(!8Jj?D*VIjA9~d6GL{oQ`VfCjyn);3J1H((VXzG7_x!C_aAk^dJE#3sNoivdK4v3 z6^gz4WU!Q`D_LM!#@$9K&C}Fb$OWaeR8x-?JrnGYpT}n{$}jz?Qz-V!E5QM@SIgKh zWt25im1Mt^QK3-EFJ)9Il=4eCb!r($T?IX=scUl|4OURzDAvL;xGPvm1B6n38AxXd zrTj98t`&;?@?qag?j6r_1g(22-)7UMj=-MFWLWUK&Cpg<>!LJvfv)wT!)VJUyW) z_R{fmK$qmXc|5%)l=4!9#*I;)U@r}$otnBf_i%6+y_TeQ;gtEXP|8cg=|ny>&~vkz z8iisneH^T&Gd0Cts-_J>skvEA389pis_9!v%FL{$+k|2-1u{p_T}l=>C;J0q1U;as z?b*3_HusEB$`dv8x>K(>D{~~}j$_MImKsG1G{v46MazUz@iK~538g$Sny%3@_QV)^ zLsQr0nwev$a6Ic&@iLYwg;JgvN8b=i#mjg)M=170zs&KpO;hZN@pOf%C-E|#zAu#W z#CW)3O6np6e8mp;4 zX1r~lNRu@6VaBVVrV6DzIFTBK;#fL9^CY@g%Q%)M(TEecJ(Y$!&2WzQ8 zC>2Y!G+!v?!CG3Hq$Z%=4x!kClQZk+G9{B4S4ZE|6wkOi`k|(_mw#wXp&x7NlJcLJ zQ|L~il$YvhpHS?jy3DCWCn>+Mm!{EDO>vw}qm@D_FHNI%p_G?Sqer!jy)>N$Ome(5 zA#*ylC#hY*8MH|#<)sFCLMY{>ne?_$?4{|MGwF|-VlU04&s9B%vzg@K<37F9nMt7} zH6QgFgkmo($(%(CluW!diKRni}f;(3nHrni}W*i8+VP z7fN|>E`3KR_TZVB^XLODV-L=!=985_*@N?`O(^BT`IHb!d2j(8)-v|sLR!klm=b66 zGZ)eWNorSc5j`Q4@?awkKb1==4=$$ZLa_&%GZ)ibO|b_T(@LRKoGqp`La8`gO#GcK z<?D@gG=akO|b`;(0!U>51vl@G{qh~ot_j*d1)!VEEIdGD{~nY z*K&I*pPfOSnqn`VL7Rk9UOI!$7fN~QOnObr*h|Z4Tpi($XXCoe<#c|M+7($<`EmshQ5!6nm+e`1cl_UBW85L@4&suFMvCO3OHwT4`{-D#>1I zrD~y+ms;sWp_G@Rbg7oHmsZnZO`fF&aP|8bd={rIxFSXI_La~>w z%xt53G{s(OqbF58nT>7qtWe5JZS;1Mx)${YPE+l9Gj7OSN5h2LE?!zkqcz1|T1O{o zioLX+rf7=2w4P>Z>H%xH)lQ2v^_(>q)M}wroNb_lQ0&25GCSx6En^SbH2t)c2W^@s zl=7fWONCM%?4%d8j6HZ3&A_t^<+E!u&!Rh$)UIHR9uP`-FisUSxTNx6f+h*Y9{gEm zf~IJSJ(!@yLa8`Q&~l-a2NPr`se4iHHlaAq9?a~byOc~k*hLR$iappxk790a558`1~gX*of_>s)bv{EQFQ_rF2HN`P_4*icV$$PMK z=xw2t2fJzIOr?cAxP@NO)U~RZGrj$uY!76%MSE^+w7%7TJ~1|S3$k6WO66GjlMIR+uKeZ1NLWbqmMLob=k9- z=TX5NmTjX)aMExA70gvswD6V83uvXLHiFttdo^`Y;TxIXqPK>M5xWUPP7imFyd(wZU)GQcYc8)dqLcPEDO!`cCG>^r5Ey0%{j6U!dw$ zfx3(iYwEY4uAos1mF&IjKV@D?otpCG{3-Kl`cSBCG%NV0%pXu<5tqCw@LushGOwkZ zHT5~D>*zH_(Ut+9W$va#qm-m2rB-MUU8||rGiC*^Cw@SSxTb#IjL`M;*Tqb!XuXj> z7D|oSjTBnq$nrur(szW~Mv*{q=w>>kWb}0TZqJV?d^(rhMt`;{L$^^xsO>Z;XP5V< zbhW1LFMr&)ogUDXzyGk%9pqmsEl?%)gFmMNp|;U=<#!u*(sC_Z-G5Z*PI_5WiT)>q z?xIc0RC}+NpAz~7T_eqRG_oqp|&V(4`zCTTuenV;DzW;_An^b$R zm)oIdXp^RXT)rvvEL|g%^2GD>f~MFLFVcsaVo$t8C$3aF*%L3*&6;9QyiD(Fiaqfv zC7PwA%)i%YOOi6^HM&$$G$nLF=yiHqQzwPK9Xd!;S4q7<40nnLX@R2X7kD~%kiH?* zRe?`@m!f1;sBO~1LF&;Z!(~@OcA=6{UfG_|A$nWOy38v>Z_;O4)@kkuy-l-Qq&*r^ zw%hXudP=Bm^kLa8p~LivP%5t9r9f+{NAFUrq5^ZgzX-ic*J!E<)O+-TqA1~wc>hSF zqpF2JWaZNPG(%GrIS+*XL_0Nw(?M zRZx>O#bv$^Bky~w2XC>Tfhv=D{hd@tUSqdzqp(?)znQyZ4n4o;nJ( zJ@9Mq+ooX@3$-oqjQ3Sg1GVhroYzC9F-*&5=DY=JjFO>$Z-p#lwon|`?}a?ZB2`lQ z?lIP@l5|qp2at6osZT;a8(6lDa>~DzHQcyLC^i48jUNhi6@4%N zl~A>DyQX&LUzt^H9MaTBp8oSjy(QJ2KYIZB?HR&q^RNjq8c&nUSut>ib;N?xQ(4x~Wl zNaM1!lK+)f@BvC$>-Bb{*Nw+r+p~-W?IQVr$qbvv!SQ^aQ0L*P!9^%pER-`wgVRb@>yo4C29z9|R`S%elGBqVA4ExR z4NnX(kH~bW$Bi=rH)P?b9z^!Iu{iMKEPNSUQ?mkhXN@=JDxHDi((#@N#+j}bCKw%Q zGX6n5r$-ag+H)vw&qw$wxNc!_;8$5Gird2%zD1_&oRlniM&Q?3Cnu@Jfv2J^!25|L^Ml-_>$^?|-A=e^Xc4@W0XU z|5e@pz2*O@24}oX#PiYtCf;`XXMe^oEMt628OQk#3SH2{e8u_1V*b(a2OfUc@G_YZ zN8^WG{Jyw_=hf1dXkh7=a~#Wa@f#Ug*<9-?liU4^*j$9U3^I%PClxdPJmxiipAJle z@K45qGbE33ZpGB?GRMKcnUlhmovQr9($)|9b6o`wm$Og!XUz>fVP;&FPeHr`@9o=` zs^u4N9BrYaIc0;}9yhL9VU9sxZQD%&wr#BBxBojk%PP2)MZB$}+k9->Txr*hPY{0| z%~xeci}x7slW9wtQ&hx||4}HD&I5Et|2Ct!r9 zmazBk7jKLKZV*E??)X&5i=DSPs=$l_ET_F*oT1nxS#F8gjD--W>X5y{WOnmV) z6VKW+@jG52yj2+jFN9Z@LwG_Q0xt{S&d&lbiw5B{6rW`%U4_pAd}{C+gU>QNk)MFi z0(?%w=M;RF;Ys`yd=}ty8a^}eS%%%~TznSbvk;#p_$))KXW+8{pKsu^3ZG^8b*o3A*0X~=Db2&cC@D4;r z*g$Liwn+(K5Z`g>z&+t;ffEJR32YF!K;SZg&451I3|NR?edJnu=n1?HXFU$M9~t^S zx*K=9@6veK^D#XVdIn|g2)$suOMIgFE?t}Z3f{}KPz$F4xqmSB(cav<0dK|0=sp^j z^`SA&;JxQ$z$|mB;Ijp91oYtzQ*Xw26R`MHv(03C?xQ~=DjV^($vpF8+J+Vz@pj1y zl)2Tj*4&3*eY_i-n{(sla?#c*+BTaX`7brMX$>#aPf*tm{T$_=rVovFDVdOxTLeE} z@EyARGsdeZe|hK)lz+^4+uSK-z9VI>5&QLvAwb-Un^Q`5Ti-K3 zD!@hDbe%rhS`i}?yp|TO40`sKu@t!-(w{QY;pBV~I^LWgexwAd@ zncD_50uNLy16&(g=4q6;`pjTyqrsMZX0UX>Q6Jvz84L?AGzN=>!;Bk?AMxxniz{CA z3^T3)USiyn`>y8>z&Bma>O7HJ9enx1G_g#%&>Fx0TRpb4# zyS&?sx&6=cZZ?+n-{sw582Q(ECyV8ir5BUUS@<2v9mb}>o!)Bk#yEl1;*Dw6l)vB z&e?*`RwFAm&lcDymN#n4IloO6ycK#3YL!~8QnKANv+nk_OE21`l~&-hJ?)~iU2JI8 z_>%Dd_!5ZEJWt3xBk+j#GUIjs2S!3-Z@=_qw^Sbu}HJ-^<+-}pA(@Z4{_fwv{Mh_ze9+AU)37O`!M*mFK?_%HuX zz+d>k1324rjaYSual7wXXl^X|t^XCdbN$$8D?jM}7#6+<*pl}TzhRzSWCTjgR}F7q zne~2oFwkuI{RP0U&Fvr9VGQ+-_e>RU1hAHj4+QW#VJ86&pi==WX)54gY5EWnk*Zx#Mp+6Yd&NIONkNu*mu z+AGqXf`3QwYoz22Qt~e0KOp=^h5wZBUlab@!v9EcGPspogRQC*7!l4WgRQC+&J5u! z6?~=OYel+AIK9HTRPd_>zgh6x1;1BHJ|Ua~!g(2-eA;HRC+{-50bc;_r4y}Qz{%D( z0c)-E0jFAcN`^hhwb?aT*>3{uPmcp0N6!Ebr=px1d?#u$;3R4QtfwV_vxL70a4hx+ z7vgYdVS?8RtOMtRoCd*H3Ty@^l-nkF9N$2?D5qEO zZQu{j-68lM;4^b?5qux;mfZb<6|4Hr+ z!FLPX1J18>6x-{o4aK4-Ou5kV?QnI*p!&;BK zIm_ZQ7Je({yLlPH?+5&%oJzq5qRczF$4Qyvq|7kkkCigDg4dzUUvlfEOudw85dI=5 zvr_P8l=&>TP4Kwzdj;PHzBlhYse7K(-68xdq|9!?ZxMK>aP|tm54E!M9+6s)NUib5zcKbL6` zyhZRf!FvUsC!8IE?-qEAz`X+Z3w&2#MnJqOuvTD$z?A~q1ojHtA#k_Ay#fyjqzu+j zDX>=HN`Zu@=->WlLKEYXzY@jufX34-zZ`YD~niLufW{`Ym1q) zQedyZ-2(RtJS31xxJ;$MT7fGCQmOC-)(Si%kopT>V6DKF0(%AS7Pwd7A%Qf2%kLJr zSKuLqmofj4Kq?oV0&4}X6xb_px4^vu4=H|y=oGkD;g!tUEAWs&8Ynsi4j#xORV(;P zfvv*n6@0hA8-%l0a2g~dBCuBAN`W^FVm)sQ9DE$(hX!*=8p6;MVNP!~_6nr2%&8PuE088}PX4L! z-^QCpu{qPc$$ZiLm-&6`F>9iy$-JCp7gxw`KxDwcZ+w2_iFEt zy!Uwbdtdkd$veh3(RZqEg>Qqe%eUQknePGL!@fWJ3jN3XC;CtI&-E|zukyG1-}V>d zPP+mpK7(*#hf}GN*8o?04+HwMKfw8vL79+-aK@2^GnQ|Kw?=}d&?V_&-fCHd8yKZRexDep&x z2Lb;Seh2Wp@cV%CGX4r!p7Bq>d&)iqe8b1^qrxu$-6bpXm_IzoFiYT=k^oK|KPu#N zWp~N0j4(Ja7nO>1a3AR!a|Af=m2sJm3i))+UH7(Z)%r<&_^$?-ucYIG^-_0wpE64G z;d0jhQQ`crkbc{%$}IbeG9MML`bz2guaLfEB_RE%@SJ~JX2k&R%cuPr?h&74`OgD> zipd-`B7exe5cnj|PC$h}?`7%SoXY{T{8s}GDCIH?1Ng=5tsu!AJ9Y;<^eANG;w#; z4{#tNlHjU5lX4z*2upL;mqT+}dW9_D~ai*VwHb1OiT7ULenz!~IN;H&Uma1(b1Cjho0 z_D%e|qLUzP1H{t@IvH>yS}^gO`*ncbxF<1a3!q6om`w)GA*TU97qiNsUO*Gy5pMvz z7<0?SN#q>B%V7n+y$5LGTigqPUkPZ^9@u5l4`Go>*W+KJ;$QAu2IA$6^y)fS(6w()q>@0CyPw1 zYnV0KT4k-X&ayUJz19xva_jF_z;m~!&fDN!#Tbck8-l>@- zvAW(^t#7>MkJtS1THkoBZ=#k@)bfd1K2ggjY562ApQQDktobK{≀{kI2x>!F3Yi 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 literal 0 HcmV?d00001 diff --git a/AxibugEmuOnline.Client/Assets/Plugins/NoSugarNet.DataHelper.dll.meta b/AxibugEmuOnline.Client/Assets/Plugins/NoSugarNet.DataHelper.dll.meta new file mode 100644 index 0000000..2b3ed26 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/NoSugarNet.DataHelper.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 1d83e3c67ee8b794c97b5876ece7a16e +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Plugins/System.Buffers.dll b/AxibugEmuOnline.Client/Assets/Plugins/System.Buffers.dll new file mode 100644 index 0000000000000000000000000000000000000000..c0970c078522845d0ac9420f390fed5c29344d8c GIT binary patch literal 21376 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%0AL|T{&GAus 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 literal 0 HcmV?d00001 diff --git a/AxibugEmuOnline.Client/Assets/Plugins/System.Memory.dll.meta b/AxibugEmuOnline.Client/Assets/Plugins/System.Memory.dll.meta new file mode 100644 index 0000000..b03e202 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/System.Memory.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 7079d9113f8bfda4db8a78fffdd414a9 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Plugins/System.Numerics.Vectors.dll b/AxibugEmuOnline.Client/Assets/Plugins/System.Numerics.Vectors.dll new file mode 100644 index 0000000000000000000000000000000000000000..a808165accf4b28833d22169931d4c879defd96d GIT binary patch literal 163712 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�q8Bzlv}ROx-}ptnKD&8tasR$2=E({1 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 literal 0 HcmV?d00001 diff --git a/AxibugEmuOnline.Client/Assets/Plugins/System.Numerics.Vectors.dll.meta b/AxibugEmuOnline.Client/Assets/Plugins/System.Numerics.Vectors.dll.meta new file mode 100644 index 0000000..6e2fab3 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/System.Numerics.Vectors.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 677f64bf577a1724699f45841c5bcb04 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Plugins/System.Runtime.CompilerServices.Unsafe.dll b/AxibugEmuOnline.Client/Assets/Plugins/System.Runtime.CompilerServices.Unsafe.dll new file mode 100644 index 0000000000000000000000000000000000000000..b17135bc95170151b88fc4679fe8be3758c3c3b9 GIT binary patch literal 16768 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 _nes.KeyConfig; + + // bit: 7 6 5 4 3 2 1 0 + // button: A B Select Start Up Down Left + + private readonly Dictionary _keyMapping; + + public NesController(UNESBehaviour nse) + { + _nes = nse; + + _keyMapping = new Dictionary + { + {Config.A, 7}, + {Config.B, 6}, + {Config.Select, 5}, + {Config.Start, 4}, + {Config.Up, 3}, + {Config.Down, 2}, + {Config.Left, 1}, + {Config.Right, 0}, + }; + } + + public void Strobe(bool on) + { + _serialData = _data; + _strobing = on; + } + + public int ReadState() + { + int ret = ((_serialData & 0x80) > 0).AsByte(); + if (!_strobing) + { + _serialData <<= 1; + _serialData &= 0xFF; + } + + return ret; + } + + public void PressKey(KeyCode keyCode) + { + if (keyCode == Config.Debug) + { + Debug ^= true; + } + + if (!_keyMapping.ContainsKey(keyCode)) + { + return; + } + + _data |= 1 << _keyMapping[keyCode]; + } + + public void ReleaseKey(KeyCode keyCode) + { + if (!_keyMapping.ContainsKey(keyCode)) + { + return; + } + + _data &= ~(1 << _keyMapping[keyCode]); + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Controller/NesController.cs.meta b/AxibugEmuOnline.Client/Assets/Runtime/Controller/NesController.cs.meta new file mode 100644 index 0000000..0582652 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Controller/NesController.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6a6001b2b26e33144b77fe0b02e21dc0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Core.meta b/AxibugEmuOnline.Client/Assets/Runtime/Core.meta new file mode 100644 index 0000000..62ce764 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Core.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2f857291907b21142bc251146119762c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Core/Addressable.cs b/AxibugEmuOnline.Client/Assets/Runtime/Core/Addressable.cs new file mode 100644 index 0000000..770cb10 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Core/Addressable.cs @@ -0,0 +1,62 @@ +using System.Runtime.CompilerServices; + +namespace AxibugEmuOnline.Client.UNES +{ + public abstract class Addressable + { + public delegate uint ReadDelegate(uint address); + + public delegate void WriteDelegate(uint address, byte val); + + protected readonly Emulator _emulator; + protected readonly ReadDelegate[] _readMap; + protected readonly WriteDelegate[] _writeMap; + protected readonly uint _addressSize; + + protected Addressable(Emulator emulator, uint addressSpace) + { + _emulator = emulator; + _addressSize = addressSpace; + _readMap = new ReadDelegate[addressSpace + 1]; + _writeMap = new WriteDelegate[addressSpace + 1]; + } + + protected virtual void InitializeMemoryMap() + { + _readMap.Fill(address => 0); + + // Some games write to addresses not mapped and expect to continue afterwards + _writeMap.Fill((address, val) => { }); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public uint ReadByte(uint address) + { + address &= _addressSize; + return _readMap[address](address); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteByte(uint address, uint val) + { + address &= _addressSize; + _writeMap[address](address, (byte)val); + } + + public void MapReadHandler(uint start, uint end, CPU.ReadDelegate func) + { + for (uint i = start; i <= end; i++) + { + _readMap[i] = func; + } + } + + public void MapWriteHandler(uint start, uint end, CPU.WriteDelegate func) + { + for (uint i = start; i <= end; i++) + { + _writeMap[i] = func; + } + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Core/Addressable.cs.meta b/AxibugEmuOnline.Client/Assets/Runtime/Core/Addressable.cs.meta new file mode 100644 index 0000000..84e599c --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Core/Addressable.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8649a70e245ed1744aa620cb28504fb5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.Core.cs b/AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.Core.cs new file mode 100644 index 0000000..b68c527 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.Core.cs @@ -0,0 +1,81 @@ +using System; + +namespace AxibugEmuOnline.Client.UNES +{ + sealed partial class CPU + { + public enum InterruptType + { + NMI, + IRQ, + RESET + } + + private readonly uint[] _interruptHandlerOffsets = { 0xFFFA, 0xFFFE, 0xFFFC }; + private readonly bool[] _interrupts = new bool[2]; + + public void Initialize() + { + A = 0; + X = 0; + Y = 0; + SP = 0xFD; + P = 0x24; + + PC = ReadWord(_interruptHandlerOffsets[(int) InterruptType.RESET]); + } + + public void Reset() + { + SP -= 3; + F.InterruptsDisabled = true; + } + + public void TickFromPPU() + { + if (Cycle-- > 0) return; + ExecuteSingleInstruction(); + } + + public void ExecuteSingleInstruction() + { + for (var i = 0; i < _interrupts.Length; i++) + { + if (_interrupts[i]) + { + PushWord(PC); + Push(P); + PC = ReadWord(_interruptHandlerOffsets[i]); + F.InterruptsDisabled = true; + _interrupts[i] = false; + return; + } + } + + _currentInstruction = NextByte(); + + Cycle += _opCodeDefs[_currentInstruction].Cycles; + + ResetInstructionAddressingMode(); + // if (_numExecuted > 10000 && PC - 1 == 0xFF61) + // if(_emulator.Controller.debug || 0x6E00 <= PC && PC <= 0x6EEF) + // Console.WriteLine($"{(PC - 1).ToString("X4")} {_currentInstruction.ToString("X2")} {opcodeNames[_currentInstruction]}\t\t\tA:{A.ToString("X2")} X:{X.ToString("X2")} Y:{Y.ToString("X2")} P:{P.ToString("X2")} SP:{SP.ToString("X2")}"); + + var op = _opCodes[_currentInstruction]; + if (op == null) + { + throw new ArgumentException(_currentInstruction.ToString("X2")); + } + + op(); + } + + public void TriggerInterrupt(InterruptType type) + { + if (!F.InterruptsDisabled || type == InterruptType.NMI) + { + _interrupts[(int)type] = true; + } + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.Core.cs.meta b/AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.Core.cs.meta new file mode 100644 index 0000000..5f375dc --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.Core.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 63ec605962bce0e4899b19d49d4ed747 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.IORegisters.cs b/AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.IORegisters.cs new file mode 100644 index 0000000..039a0d1 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.IORegisters.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading.Tasks; + +namespace AxibugEmuOnline.Client.UNES +{ + sealed partial class CPU + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteIoRegister(uint reg, byte val) + { + switch (reg) + { + case 0x4014: // OAM DMA + _emulator.PPU.PerformDMA(val); + break; + case 0x4016: + _emulator.Controller.Strobe(val == 1); + break; + } + + if (reg <= 0x401F) + { + return; // APU write + } + + throw new NotImplementedException($"{reg:X4} = {val:X2}"); + } + + public uint ReadIORegister(uint reg) + { + switch (reg) + { + case 0x4016: + return (uint) _emulator.Controller.ReadState() & 0x1; + } + return 0x00; + //throw new NotImplementedException(); + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.IORegisters.cs.meta b/AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.IORegisters.cs.meta new file mode 100644 index 0000000..42ddf45 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.IORegisters.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6ad8b3c04ef34de48b5cab3029811d9d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.Instructions.cs b/AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.Instructions.cs new file mode 100644 index 0000000..1d32389 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.Instructions.cs @@ -0,0 +1,463 @@ +using System; +using static AxibugEmuOnline.Client.UNES.CPU.AddressingMode; + +namespace AxibugEmuOnline.Client.UNES +{ + public sealed partial class CPU + { + [AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = true)] + public class OpCodeDef : Attribute + { + public int OpCode; + public int Cycles = 1; + public bool PageBoundary; + public bool RMW; + public AddressingMode Mode = None; + } + + [OpCodeDef(OpCode = 0x20, Cycles = 6)] + private void JSR() + { + PushWord(PC + 1); + PC = NextWord(); + } + + [OpCodeDef(OpCode = 0x40, Cycles = 6)] + private void RTI() + { + // TODO: this dummy fetch should happen for all single-byte instructions + NextByte(); + P = Pop(); + PC = PopWord(); + } + + [OpCodeDef(OpCode = 0x60, Cycles = 6)] + private void RTS() + { + NextByte(); + PC = PopWord() + 1; + } + + [OpCodeDef(OpCode = 0xC8, Cycles = 2)] + private void INY() => Y++; + + [OpCodeDef(OpCode = 0x88, Cycles = 2)] + private void DEY() => Y--; + + [OpCodeDef(OpCode = 0xE8, Cycles = 2)] + private void INX() => X++; + + [OpCodeDef(OpCode = 0xCA, Cycles = 2, RMW = true)] + private void DEX() => X--; + + [OpCodeDef(OpCode = 0xA8, Cycles = 2)] + private void TAY() => Y = A; + + [OpCodeDef(OpCode = 0x98, Cycles = 2)] + private void TYA() => A = Y; + + [OpCodeDef(OpCode = 0xAA, Cycles = 2, RMW = true)] + private void TAX() => X = A; + + [OpCodeDef(OpCode = 0x8A, Cycles = 2, RMW = true)] + private void TXA() => A = X; + + [OpCodeDef(OpCode = 0xBA, Cycles = 2)] + private void TSX() => X = SP; + + [OpCodeDef(OpCode = 0x9A, Cycles = 2, RMW = true)] + private void TXS() => SP = X; + + [OpCodeDef(OpCode = 0x08, Cycles = 3)] + private void PHP() => Push(P | BreakSourceBit); + + [OpCodeDef(OpCode = 0x28, Cycles = 4)] + private void PLP() => P = (uint)(Pop() & ~BreakSourceBit); + + [OpCodeDef(OpCode = 0x68, Cycles = 4)] + private void PLA() => A = Pop(); + + [OpCodeDef(OpCode = 0x48, Cycles = 3)] + private void PHA() => Push(A); + + [OpCodeDef(OpCode = 0x24, Mode = ZeroPage, Cycles = 3)] + [OpCodeDef(OpCode = 0x2C, Mode = Absolute, Cycles = 4)] + private void BIT() + { + uint val = AddressRead(); + F.Overflow = (val & 0x40) > 0; + F.Zero = (val & A) == 0; + F.Negative = (val & 0x80) > 0; + } + + private void Branch(bool cond) + { + uint nPC = (uint)(PC + NextSByte() + 1); + if (cond) + { + PC = nPC; + Cycle++; + } + } + + [OpCodeDef(OpCode = 0x4C, Cycles = 3)] + [OpCodeDef(OpCode = 0x6C, Cycles = 5)] + private void JMP() + { + if (_currentInstruction == 0x4C) + { + PC = NextWord(); + } + else if (_currentInstruction == 0x6C) + { + uint off = NextWord(); + // AN INDIRECT JUMP MUST NEVER USE A VECTOR BEGINNING ON THE LAST BYTE OF A PAGE + // + // If address $3000 contains $40, $30FF contains $80, and $3100 contains $50, + // the result of JMP ($30FF) will be a transfer of control to $4080 rather than + // $5080 as you intended i.e. the 6502 took the low byte of the address from + // $30FF and the high byte from $3000. + // + // http://www.6502.org/tutorials/6502opcodes.html + uint hi = (off & 0xFF) == 0xFF ? off - 0xFF : off + 1; + uint oldPC = PC; + PC = ReadByte(off) | (ReadByte(hi) << 8); + + if ((oldPC & 0xFF00) != (PC & 0xFF00)) + { + Cycle += 2; + } + } + else + { + throw new NotImplementedException(); + } + } + + [OpCodeDef(OpCode = 0xB0, Cycles = 2)] + private void BCS() => Branch(F.Carry); + + [OpCodeDef(OpCode = 0x90, Cycles = 2)] + private void BCC() => Branch(!F.Carry); + + [OpCodeDef(OpCode = 0xF0, Cycles = 2)] + private void BEQ() => Branch(F.Zero); + + [OpCodeDef(OpCode = 0xD0, Cycles = 2)] + private void BNE() => Branch(!F.Zero); + + [OpCodeDef(OpCode = 0x70, Cycles = 2)] + private void BVS() => Branch(F.Overflow); + + [OpCodeDef(OpCode = 0x50, Cycles = 2)] + private void BVC() => Branch(!F.Overflow); + + [OpCodeDef(OpCode = 0x10, Cycles = 2)] + private void BPL() => Branch(!F.Negative); + + [OpCodeDef(OpCode = 0x30, Cycles = 2)] + private void BMI() => Branch(F.Negative); + + [OpCodeDef(OpCode = 0x81, Mode = IndirectX, Cycles = 6)] + [OpCodeDef(OpCode = 0x91, Mode = IndirectY, Cycles = 6)] + [OpCodeDef(OpCode = 0x95, Mode = ZeroPageX, Cycles = 4)] + [OpCodeDef(OpCode = 0x99, Mode = AbsoluteY, Cycles = 5)] + [OpCodeDef(OpCode = 0x9D, Mode = AbsoluteX, Cycles = 5)] + [OpCodeDef(OpCode = 0x85, Mode = ZeroPage, Cycles = 3)] + [OpCodeDef(OpCode = 0x8D, Mode = Absolute, Cycles = 4)] + private void STA() => AddressWrite(A); + + [OpCodeDef(OpCode = 0x96, Mode = ZeroPageY, Cycles = 4)] + [OpCodeDef(OpCode = 0x86, Mode = ZeroPage, Cycles = 3)] + [OpCodeDef(OpCode = 0x8E, Mode = Absolute, Cycles = 4)] + private void STX() => AddressWrite(X); + + [OpCodeDef(OpCode = 0x94, Mode = ZeroPageX, Cycles = 4)] + [OpCodeDef(OpCode = 0x84, Mode = ZeroPage, Cycles = 3)] + [OpCodeDef(OpCode = 0x8C, Mode = Absolute, Cycles = 4)] + private void STY() => AddressWrite(Y); + + [OpCodeDef(OpCode = 0x18, Cycles = 2)] + private void CLC() => F.Carry = false; + + [OpCodeDef(OpCode = 0x38, Cycles = 2)] + private void SEC() => F.Carry = true; + + [OpCodeDef(OpCode = 0x58, Cycles = 2)] + private void CLI() => F.InterruptsDisabled = false; + + [OpCodeDef(OpCode = 0x78, Cycles = 2)] + private void SEI() => F.InterruptsDisabled = true; + + [OpCodeDef(OpCode = 0xB8, Cycles = 2)] + private void CLV() => F.Overflow = false; + + [OpCodeDef(OpCode = 0xD8, Cycles = 2)] + private void CLD() => F.DecimalMode = false; + + [OpCodeDef(OpCode = 0xF8, Cycles = 2)] + private void SED() => F.DecimalMode = true; + + [OpCodeDef(OpCode = 0xEA, Cycles = 2)] + [OpCodeDef(OpCode = 0x1A, Cycles = 2)] // Unofficial + [OpCodeDef(OpCode = 0x3A, Cycles = 2)] // Unofficial + [OpCodeDef(OpCode = 0x5A, Cycles = 2)] // Unofficial + [OpCodeDef(OpCode = 0x7A, Cycles = 2)] // Unofficial + [OpCodeDef(OpCode = 0xDA, Cycles = 2)] // Unofficial + [OpCodeDef(OpCode = 0xFA, Cycles = 2)] // Unofficial + private void NOP() { } + + [OpCodeDef(OpCode = 0xA1, Mode = IndirectX, Cycles = 6)] + [OpCodeDef(OpCode = 0xA5, Mode = ZeroPage, Cycles = 3)] + [OpCodeDef(OpCode = 0xA9, Mode = Immediate, Cycles = 2)] + [OpCodeDef(OpCode = 0xAD, Mode = Absolute, Cycles = 4)] + [OpCodeDef(OpCode = 0xB1, Mode = IndirectY, Cycles = 5, PageBoundary = true)] + [OpCodeDef(OpCode = 0xB5, Mode = ZeroPageX, Cycles = 4)] + [OpCodeDef(OpCode = 0xB9, Mode = AbsoluteY, Cycles = 4, PageBoundary = true)] + [OpCodeDef(OpCode = 0xBD, Mode = AbsoluteX, Cycles = 4, PageBoundary = true)] + private void LDA() => A = AddressRead(); + + [OpCodeDef(OpCode = 0xA0, Mode = Immediate, Cycles = 2)] + [OpCodeDef(OpCode = 0xA4, Mode = ZeroPage, Cycles = 3)] + [OpCodeDef(OpCode = 0xAC, Mode = Absolute, Cycles = 4)] + [OpCodeDef(OpCode = 0xB4, Mode = ZeroPageX, Cycles = 4)] + [OpCodeDef(OpCode = 0xBC, Mode = AbsoluteX, Cycles = 4, PageBoundary = true)] + private void LDY() => Y = AddressRead(); + + [OpCodeDef(OpCode = 0xA2, Mode = Immediate, Cycles = 2, RMW = true)] + [OpCodeDef(OpCode = 0xA6, Mode = ZeroPage, Cycles = 3, RMW = true)] + [OpCodeDef(OpCode = 0xAE, Mode = Absolute, Cycles = 4, RMW = true)] + [OpCodeDef(OpCode = 0xB6, Mode = ZeroPageY, Cycles = 4, RMW = true)] + [OpCodeDef(OpCode = 0xBE, Mode = AbsoluteY, Cycles = 4, PageBoundary = true, RMW = true)] + private void LDX() => X = AddressRead(); + + [OpCodeDef(OpCode = 0x01, Mode = IndirectX, Cycles = 6)] + [OpCodeDef(OpCode = 0x05, Mode = ZeroPage, Cycles = 3)] + [OpCodeDef(OpCode = 0x09, Mode = Immediate, Cycles = 2)] + [OpCodeDef(OpCode = 0x0D, Mode = Absolute, Cycles = 4)] + [OpCodeDef(OpCode = 0x11, Mode = IndirectY, Cycles = 5, PageBoundary = true)] + [OpCodeDef(OpCode = 0x15, Mode = ZeroPageX, Cycles = 4)] + [OpCodeDef(OpCode = 0x19, Mode = AbsoluteY, Cycles = 4, PageBoundary = true)] + [OpCodeDef(OpCode = 0x1D, Mode = AbsoluteX, Cycles = 4, PageBoundary = true)] + private void ORA() => A |= AddressRead(); + + [OpCodeDef(OpCode = 0x21, Mode = IndirectX, Cycles = 6)] + [OpCodeDef(OpCode = 0x25, Mode = ZeroPage, Cycles = 3)] + [OpCodeDef(OpCode = 0x29, Mode = Immediate, Cycles = 2)] + [OpCodeDef(OpCode = 0x2D, Mode = Absolute, Cycles = 4)] + [OpCodeDef(OpCode = 0x31, Mode = IndirectY, Cycles = 5, PageBoundary = true)] + [OpCodeDef(OpCode = 0x35, Mode = ZeroPageX, Cycles = 4)] + [OpCodeDef(OpCode = 0x39, Mode = AbsoluteY, Cycles = 4, PageBoundary = true)] + [OpCodeDef(OpCode = 0x3D, Mode = AbsoluteX, Cycles = 4, PageBoundary = true)] + private void AND() => A &= AddressRead(); + + [OpCodeDef(OpCode = 0x41, Mode = IndirectX, Cycles = 6)] + [OpCodeDef(OpCode = 0x45, Mode = ZeroPage, Cycles = 3)] + [OpCodeDef(OpCode = 0x49, Mode = Immediate, Cycles = 2)] + [OpCodeDef(OpCode = 0x4D, Mode = Absolute, Cycles = 4)] + [OpCodeDef(OpCode = 0x51, Mode = IndirectY, Cycles = 5, PageBoundary = true)] + [OpCodeDef(OpCode = 0x55, Mode = ZeroPageX, Cycles = 4)] + [OpCodeDef(OpCode = 0x59, Mode = AbsoluteY, Cycles = 4, PageBoundary = true)] + [OpCodeDef(OpCode = 0x5D, Mode = AbsoluteX, Cycles = 4, PageBoundary = true)] + private void EOR() => A ^= AddressRead(); + + [OpCodeDef(OpCode = 0xE1, Mode = IndirectX, Cycles = 6)] + [OpCodeDef(OpCode = 0xE5, Mode = ZeroPage, Cycles = 3)] + [OpCodeDef(OpCode = 0x69, Mode = Immediate, Cycles = 2)] + [OpCodeDef(OpCode = 0xE9, Mode = Immediate, Cycles = 2)] // Official duplicate of $69 + [OpCodeDef(OpCode = 0xEB, Mode = Immediate, Cycles = 2)] // Unofficial duplicate of $69 + [OpCodeDef(OpCode = 0xED, Mode = Absolute, Cycles = 4)] + [OpCodeDef(OpCode = 0xF1, Mode = IndirectY, Cycles = 5, PageBoundary = true)] + [OpCodeDef(OpCode = 0xF5, Mode = ZeroPageX, Cycles = 4)] + [OpCodeDef(OpCode = 0xF9, Mode = AbsoluteY, Cycles = 4, PageBoundary = true)] + [OpCodeDef(OpCode = 0xFD, Mode = AbsoluteX, Cycles = 4, PageBoundary = true)] + private void SBC() => ADCImpl((byte)~AddressRead()); + + [OpCodeDef(OpCode = 0x61, Mode = IndirectX, Cycles = 6)] + [OpCodeDef(OpCode = 0x65, Mode = ZeroPage, Cycles = 3)] + [OpCodeDef(OpCode = 0x69, Mode = Immediate, Cycles = 2)] + [OpCodeDef(OpCode = 0x6D, Mode = Absolute, Cycles = 4)] + [OpCodeDef(OpCode = 0x71, Mode = IndirectY, Cycles = 5, PageBoundary = true)] + [OpCodeDef(OpCode = 0x75, Mode = ZeroPageX, Cycles = 4)] + [OpCodeDef(OpCode = 0x79, Mode = AbsoluteY, Cycles = 4, PageBoundary = true)] + [OpCodeDef(OpCode = 0x7D, Mode = AbsoluteX, Cycles = 4, PageBoundary = true)] + private void ADC() => ADCImpl(AddressRead()); + + private void ADCImpl(uint val) + { + int nA = (sbyte)A + (sbyte)val + (sbyte)(F.Carry ? 1 : 0); + F.Overflow = nA < -128 || nA > 127; + F.Carry = (A + val + (F.Carry ? 1 : 0)) > 0xFF; + A = (byte)(nA & 0xFF); + } + + [OpCodeDef(OpCode = 0x00, Cycles = 7)] + private void BRK() + { + NextByte(); + Push(P | BreakSourceBit); + F.InterruptsDisabled = true; + PC = ReadByte(0xFFFE) | (ReadByte(0xFFFF) << 8); + } + + [OpCodeDef(OpCode = 0xC1, Mode = IndirectX, Cycles = 6)] + [OpCodeDef(OpCode = 0xC5, Mode = ZeroPage, Cycles = 3)] + [OpCodeDef(OpCode = 0xC9, Mode = Immediate, Cycles = 2)] + [OpCodeDef(OpCode = 0xCD, Mode = Absolute, Cycles = 4)] + [OpCodeDef(OpCode = 0xD1, Mode = IndirectY, Cycles = 5, PageBoundary = true)] + [OpCodeDef(OpCode = 0xD5, Mode = ZeroPageX, Cycles = 4)] + [OpCodeDef(OpCode = 0xD9, Mode = AbsoluteY, Cycles = 4, PageBoundary = true)] + [OpCodeDef(OpCode = 0xDD, Mode = AbsoluteX, Cycles = 4, PageBoundary = true)] + private void CMP() => CMPImpl(A); + + [OpCodeDef(OpCode = 0xE0, Mode = Immediate, Cycles = 2)] + [OpCodeDef(OpCode = 0xE4, Mode = ZeroPage, Cycles = 3)] + [OpCodeDef(OpCode = 0xEC, Mode = Absolute, Cycles = 4)] + private void CPX() => CMPImpl(X); + + [OpCodeDef(OpCode = 0xC0, Mode = Immediate, Cycles = 2)] + [OpCodeDef(OpCode = 0xC4, Mode = ZeroPage, Cycles = 3)] + [OpCodeDef(OpCode = 0xCC, Mode = Absolute, Cycles = 4)] + private void CPY() => CMPImpl(Y); + + private void CMPImpl(uint reg) + { + long d = reg - (int)AddressRead(); + + F.Negative = (d & 0x80) > 0 && d != 0; + F.Carry = d >= 0; + F.Zero = d == 0; + } + + [OpCodeDef(OpCode = 0x46, Mode = ZeroPage, Cycles = 5, RMW = true)] + [OpCodeDef(OpCode = 0x4E, Mode = Absolute, Cycles = 6, RMW = true)] + [OpCodeDef(OpCode = 0x56, Mode = ZeroPageX, Cycles = 6, RMW = true)] + [OpCodeDef(OpCode = 0x5E, Mode = AbsoluteX, Cycles = 7, RMW = true)] + [OpCodeDef(OpCode = 0x4A, Mode = Direct, Cycles = 2, RMW = true)] + private void LSR() + { + uint D = AddressRead(); + F.Carry = (D & 0x1) > 0; + D >>= 1; + _F(D); + AddressWrite(D); + } + + [OpCodeDef(OpCode = 0x06, Mode = ZeroPage, Cycles = 5, RMW = true)] + [OpCodeDef(OpCode = 0x0E, Mode = Absolute, Cycles = 6, RMW = true)] + [OpCodeDef(OpCode = 0x16, Mode = ZeroPageX, Cycles = 6, RMW = true)] + [OpCodeDef(OpCode = 0x1E, Mode = AbsoluteX, Cycles = 7, RMW = true)] + [OpCodeDef(OpCode = 0x0A, Mode = Direct, Cycles = 2, RMW = true)] + private void ASL() + { + uint D = AddressRead(); + F.Carry = (D & 0x80) > 0; + D <<= 1; + _F(D); + AddressWrite(D); + } + + [OpCodeDef(OpCode = 0x66, Mode = ZeroPage, Cycles = 5, RMW = true)] + [OpCodeDef(OpCode = 0x6E, Mode = Absolute, Cycles = 6, RMW = true)] + [OpCodeDef(OpCode = 0x76, Mode = ZeroPageX, Cycles = 6, RMW = true)] + [OpCodeDef(OpCode = 0x7E, Mode = AbsoluteX, Cycles = 7, RMW = true)] + [OpCodeDef(OpCode = 0x6A, Mode = Direct, Cycles = 2, RMW = true)] + private void ROR() + { + uint D = AddressRead(); + bool c = F.Carry; + F.Carry = (D & 0x1) > 0; + D >>= 1; + if (c) D |= 0x80; + _F(D); + AddressWrite(D); + } + + [OpCodeDef(OpCode = 0x26, Mode = ZeroPage, Cycles = 5, RMW = true)] + [OpCodeDef(OpCode = 0x2E, Mode = Absolute, Cycles = 6, RMW = true)] + [OpCodeDef(OpCode = 0x36, Mode = ZeroPageX, Cycles = 6, RMW = true)] + [OpCodeDef(OpCode = 0x3E, Mode = AbsoluteX, Cycles = 7, RMW = true)] + [OpCodeDef(OpCode = 0x2A, Mode = Direct, Cycles = 2, RMW = true)] + private void ROL() + { + uint D = AddressRead(); + bool c = F.Carry; + F.Carry = (D & 0x80) > 0; + D <<= 1; + if (c) D |= 0x1; + _F(D); + AddressWrite(D); + } + + [OpCodeDef(OpCode = 0xE6, Mode = ZeroPage, Cycles = 5, RMW = true)] + [OpCodeDef(OpCode = 0xEE, Mode = Absolute, Cycles = 6, RMW = true)] + [OpCodeDef(OpCode = 0xF6, Mode = ZeroPageX, Cycles = 6, RMW = true)] + [OpCodeDef(OpCode = 0xFE, Mode = AbsoluteX, Cycles = 7, RMW = true)] + private void INC() + { + byte D = (byte)(AddressRead() + 1); + _F(D); + AddressWrite(D); + } + + [OpCodeDef(OpCode = 0xC6, Mode = ZeroPage, Cycles = 5, RMW = true)] + [OpCodeDef(OpCode = 0xCE, Mode = Absolute, Cycles = 3, RMW = true)] + [OpCodeDef(OpCode = 0xD6, Mode = ZeroPageX, Cycles = 6, RMW = true)] + [OpCodeDef(OpCode = 0xDE, Mode = AbsoluteX, Cycles = 7, RMW = true)] + private void DEC() + { + byte D = (byte)(AddressRead() - 1); + _F(D); + AddressWrite(D); + } + + #region Unofficial Opcodes + + [OpCodeDef(OpCode = 0x80, Cycles = 2)] + [OpCodeDef(OpCode = 0x82, Cycles = 2)] + [OpCodeDef(OpCode = 0x89, Cycles = 2)] + [OpCodeDef(OpCode = 0xC2, Cycles = 2)] + [OpCodeDef(OpCode = 0xE2, Cycles = 2)] + private void SKB() => NextByte(); // Essentially a 2-byte NOP + + [OpCodeDef(OpCode = 0x0B, Mode = Immediate, Cycles = 2)] + [OpCodeDef(OpCode = 0x2B, Mode = Immediate, Cycles = 2)] + private void ANC() + { + A &= AddressRead(); + F.Carry = F.Negative; + } + + [OpCodeDef(OpCode = 0x4B, Mode = Immediate, Cycles = 2)] + private void ALR() + { + A &= AddressRead(); + F.Carry = (A & 0x1) > 0; + A >>= 1; + _F(A); + } + + [OpCodeDef(OpCode = 0x6B, Mode = Immediate, Cycles = 2)] + private void ARR() + { + A &= AddressRead(); + bool c = F.Carry; + F.Carry = (A & 0x1) > 0; + A >>= 1; + if (c) A |= 0x80; + _F(A); + } + + [OpCodeDef(OpCode = 0xAB, Mode = Immediate, Cycles = 2)] + private void ATX() + { + // This opcode ORs the A register with #$EE, ANDs the result with an immediate + // value, and then stores the result in both A and X. + A |= ReadByte(0xEE); + A &= AddressRead(); + X = A; + } + + #endregion + } +} diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.Instructions.cs.meta b/AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.Instructions.cs.meta new file mode 100644 index 0000000..7817694 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.Instructions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cae8846694d75f04a8214a484032d533 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.Memory.cs b/AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.Memory.cs new file mode 100644 index 0000000..5a628b7 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.Memory.cs @@ -0,0 +1,165 @@ +using System; +using System.Linq; +using System.Runtime.CompilerServices; +using static AxibugEmuOnline.Client.UNES.CPU.AddressingMode; + +namespace AxibugEmuOnline.Client.UNES +{ + sealed partial class CPU + { + public enum AddressingMode + { + None, + Direct, + Immediate, + ZeroPage, + Absolute, + ZeroPageX, + ZeroPageY, + AbsoluteX, + AbsoluteY, + IndirectX, + IndirectY + } + + private uint? _currentMemoryAddress; + private uint _rmwValue; + + private void ResetInstructionAddressingMode() => _currentMemoryAddress = null; + + private uint _Address() + { + var def = _opCodeDefs[_currentInstruction]; + switch (def.Mode) + { + case Immediate: + return PC++; + case ZeroPage: + return NextByte(); + case Absolute: + return NextWord(); + case ZeroPageX: + return (NextByte() + X) & 0xFF; + case ZeroPageY: + return (NextByte() + Y) & 0xFF; + case AbsoluteX: + var address = NextWord(); + if (def.PageBoundary && (address & 0xFF00) != ((address + X) & 0xFF00)) + { + Cycle += 1; + } + + return address + X; + case AbsoluteY: + address = NextWord(); + if (def.PageBoundary && (address & 0xFF00) != ((address + Y) & 0xFF00)) + { + Cycle += 1; + } + + return address + Y; + case IndirectX: + var off = (NextByte() + X) & 0xFF; + return ReadByte(off) | (ReadByte((off + 1) & 0xFF) << 8); + case IndirectY: + off = NextByte() & 0xFF; + address = ReadByte(off) | (ReadByte((off + 1) & 0xFF) << 8); + if (def.PageBoundary && (address & 0xFF00) != ((address + Y) & 0xFF00)) + { + Cycle += 1; + } + + return (address + Y) & 0xFFFF; + } + throw new NotImplementedException(); + } + + public uint AddressRead() + { + if (_opCodeDefs[_currentInstruction].Mode == Direct) + { + return _rmwValue = A; + } + + if (_currentMemoryAddress == null) + { + _currentMemoryAddress = _Address(); + } + + return _rmwValue = ReadByte((uint)_currentMemoryAddress) & 0xFF; + } + + public void AddressWrite(uint val) + { + if (_opCodeDefs[_currentInstruction].Mode == Direct) + { + A = val; + } + else + { + if (_currentMemoryAddress == null) + { + _currentMemoryAddress = _Address(); + } + + if (_opCodeDefs[_currentInstruction].RMW) + { + WriteByte((uint)_currentMemoryAddress, _rmwValue); + } + + WriteByte((uint)_currentMemoryAddress, val); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private uint ReadWord(uint address) => ReadByte(address) | (ReadByte(address + 1) << 8); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private uint NextByte() => ReadByte(PC++); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private uint NextWord() => NextByte() | (NextByte() << 8); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private sbyte NextSByte() => (sbyte)NextByte(); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private void Push(uint what) + { + WriteByte(0x100 + SP, what); + SP--; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private uint Pop() + { + SP++; + return ReadByte(0x100 + SP); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private void PushWord(uint what) + { + Push(what >> 8); + Push(what & 0xFF); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private uint PopWord() => Pop() | (Pop() << 8); + + protected override void InitializeMemoryMap() + { + base.InitializeMemoryMap(); + + MapReadHandler(0x0000, 0x1FFF, address => _ram[address & 0x07FF]); + MapReadHandler(0x2000, 0x3FFF, address => _emulator.PPU.ReadRegister((address & 0x7) - 0x2000)); + MapReadHandler(0x4000, 0x4017, ReadIORegister); + + MapWriteHandler(0x0000, 0x1FFF, (address, val) => _ram[address & 0x07FF] = val); + MapWriteHandler(0x2000, 0x3FFF, (address, val) => _emulator.PPU.WriteRegister((address & 0x7) - 0x2000, val)); + MapWriteHandler(0x4000, 0x401F, WriteIoRegister); + + _emulator.Mapper.InitializeMemoryMap(this); + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.Memory.cs.meta b/AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.Memory.cs.meta new file mode 100644 index 0000000..e10a02a --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.Memory.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cc18416f50415b74e96092e235a95f92 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.Registers.cs b/AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.Registers.cs new file mode 100644 index 0000000..3179eb6 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.Registers.cs @@ -0,0 +1,89 @@ +using System.Runtime.CompilerServices; + +namespace AxibugEmuOnline.Client.UNES +{ + sealed partial class CPU + { + private const int CarryBit = 0x1; + private const int ZeroBit = 0x2; + private const int InterruptDisabledBit = 0x4; + private const int DecimalModeBit = 0x8; + private const int BreakSourceBit = 0x10; + private const int OverflowBit = 0x40; + private const int NegativeBit = 0x80; + + public class CPUFlags + { + public bool Negative; + public bool Overflow; + public bool BreakSource; + public bool DecimalMode; + public bool InterruptsDisabled; + public bool Zero; + public bool Carry; + } + + public readonly CPUFlags F = new CPUFlags(); + + public uint _A, _X, _Y, _SP; + public uint PC; + + public uint A + { + get => _A; + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private set => _A = _F(value & 0xFF); + } + + public uint X + { + get => _X; + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private set => _X = _F(value & 0xFF); + } + + public uint Y + { + get => _Y; + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private set => _Y = _F(value & 0xFF); + } + + public uint SP + { + get => _SP; + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private set => _SP = value & 0xFF; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private uint _F(uint val) + { + F.Zero = (val & 0xFF) == 0; + F.Negative = (val & 0x80) > 0; + return val; + } + + public uint P + { + get => (uint) ((F.Carry.AsByte() << 0) | + (F.Zero.AsByte() << 1) | + (F.InterruptsDisabled.AsByte() << 2) | + (F.DecimalMode.AsByte() << 3) | + (F.BreakSource.AsByte() << 4) | + (1 << 5) | + (F.Overflow.AsByte() << 6) | + (F.Negative.AsByte() << 7)); + set + { + F.Carry = (value & CarryBit) > 0; + F.Zero = (value & ZeroBit) > 0; + F.InterruptsDisabled = (value & InterruptDisabledBit) > 0; + F.DecimalMode = (value & DecimalModeBit) > 0; + F.BreakSource = (value & BreakSourceBit) > 0; + F.Overflow = (value & OverflowBit) > 0; + F.Negative = (value & NegativeBit) > 0; + } + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.Registers.cs.meta b/AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.Registers.cs.meta new file mode 100644 index 0000000..508a0d9 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.Registers.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 57750595bb8e0d24babf00d51e4624bb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.cs b/AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.cs new file mode 100644 index 0000000..6bd0564 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.cs @@ -0,0 +1,65 @@ +using System; +using System.Linq; +using System.Reflection; + +namespace AxibugEmuOnline.Client.UNES +{ + sealed partial class CPU : Addressable + { + private readonly byte[] _ram = new byte[0x800]; + public int Cycle; + private uint _currentInstruction; + + public delegate void OpCode(); + + private readonly OpCode[] _opCodes = new OpCode[256]; + private readonly string[] _opCodeNames = new string[256]; + private readonly OpCodeDef[] _opCodeDefs = new OpCodeDef[256]; + + public CPU(Emulator emulator) : base(emulator, 0xFFFF) + { + InitializeOpCodes(); + InitializeMemoryMap(); + Initialize(); + } + + private void InitializeOpCodes() + { + var opCodeBindings = from opCode in GetType().GetMethods(BindingFlags.NonPublic | BindingFlags.Instance) + let defs = opCode.GetCustomAttributes(typeof(OpCodeDef), false) + where defs.Length > 0 + select new + { + binding = (OpCode)Delegate.CreateDelegate(typeof(OpCode), this, opCode.Name), + name = opCode.Name, + defs = (from d in defs select (OpCodeDef)d) + }; + + foreach (var opCode in opCodeBindings) + { + foreach (var def in opCode.defs) + { + _opCodes[def.OpCode] = opCode.binding; + _opCodeNames[def.OpCode] = opCode.name; + _opCodeDefs[def.OpCode] = def; + } + } + } + + public void Execute() + { + for (var i = 0; i < 5000; i++) + { + ExecuteSingleInstruction(); + } + + uint w; + ushort x = 6000; + string z = ""; + while ((w = ReadByte(x)) != '\0') + { + z += (char)w; + } + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.cs.meta b/AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.cs.meta new file mode 100644 index 0000000..f80ca2b --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Core/CPU.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fa724afa42498dd4e80f44c3da2a5881 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Core/Cartridge.cs b/AxibugEmuOnline.Client/Assets/Runtime/Core/Cartridge.cs new file mode 100644 index 0000000..bb1c6bc --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Core/Cartridge.cs @@ -0,0 +1,66 @@ +using System; + +namespace AxibugEmuOnline.Client.UNES +{ + public class Cartridge + { + public readonly byte[] Raw; + public readonly int PRGROMSize; + public readonly int CHRROMSize; + public readonly int PRGRAMSize; + public readonly int PRGROMOffset; + public readonly int MapperNumber; + public readonly byte[] PRGROM; + public readonly byte[] CHRROM; + public VRAMMirroringMode MirroringMode; + + public enum VRAMMirroringMode + { + Horizontal, Vertical, All, Upper, Lower + } + + public Cartridge(byte[] bytes) + { + Raw = bytes; + + var header = BitConverter.ToInt32(Raw, 0); + if (header != 0x1A53454E) // "NES" + { + throw new FormatException("unexpected header value " + header.ToString("X")); + } + + PRGROMSize = Raw[4] * 0x4000; // 16kb units + CHRROMSize = Raw[5] * 0x2000; // 8kb units + PRGRAMSize = Raw[8] * 0x2000; + + var hasTrainer = (Raw[6] & 0b100) > 0; + PRGROMOffset = 16 + (hasTrainer ? 512 : 0); + + MirroringMode = (Raw[6] & 0x1) > 0 ? VRAMMirroringMode.Vertical : VRAMMirroringMode.Horizontal; + if ((Raw[6] & 0x8) > 0) + { + MirroringMode = VRAMMirroringMode.All; + } + + MapperNumber = (Raw[6] >> 4) | (Raw[7] & 0xF0); + + PRGROM = new byte[PRGROMSize]; + Array.Copy(Raw, PRGROMOffset, PRGROM, 0, PRGROMSize); + + if (CHRROMSize == 0) + { + CHRROM = new byte[0x2000]; + } + else + { + CHRROM = new byte[CHRROMSize]; + Array.Copy(Raw, PRGROMOffset + PRGROMSize, CHRROM, 0, CHRROMSize); + } + } + + public override string ToString() + { + return $"Cartridge{{PRGROMSize={PRGROMSize}, CHRROMSize={CHRROMSize}, PRGROMOffset={PRGROMOffset}, MapperNumber={MapperNumber}}}"; + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Core/Cartridge.cs.meta b/AxibugEmuOnline.Client/Assets/Runtime/Core/Cartridge.cs.meta new file mode 100644 index 0000000..4fcccd7 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Core/Cartridge.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b45675095efbb224cad44ee16c2587ff +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Core/Emulator.cs b/AxibugEmuOnline.Client/Assets/Runtime/Core/Emulator.cs new file mode 100644 index 0000000..271c287 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Core/Emulator.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using AxibugEmuOnline.Client.UNES.Controller; +using AxibugEmuOnline.Client.UNES.Mapper; + +namespace AxibugEmuOnline.Client.UNES +{ + public class Emulator + { + private static readonly Dictionary> Mappers = (from type in Assembly.GetExecutingAssembly().GetTypes() + let def = (MapperDef)type.GetCustomAttributes(typeof(MapperDef), true).FirstOrDefault() + where def != null + select new { def, type }).ToDictionary(a => a.def.Id, a => new KeyValuePair(a.type, a.def)); + + public IController Controller; + + public readonly CPU CPU; + + public readonly PPU PPU; + + public readonly BaseMapper Mapper; + + public readonly Cartridge Cartridge; + + public Emulator(byte[] bytes, IController controller) + { + Cartridge = new Cartridge(bytes); + if (!Mappers.ContainsKey(Cartridge.MapperNumber)) + { + throw new NotImplementedException($"unsupported mapper {Cartridge.MapperNumber}"); + } + + Mapper = (BaseMapper)Activator.CreateInstance(Mappers[Cartridge.MapperNumber].Key, this); + CPU = new CPU(this); + PPU = new PPU(this); + Controller = controller; + + // Load(); + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Core/Emulator.cs.meta b/AxibugEmuOnline.Client/Assets/Runtime/Core/Emulator.cs.meta new file mode 100644 index 0000000..49774f0 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Core/Emulator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9c56d6518f6443745a10dd7dda0ac7f9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Core/PPU.Core.cs b/AxibugEmuOnline.Client/Assets/Runtime/Core/PPU.Core.cs new file mode 100644 index 0000000..5ead01e --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Core/PPU.Core.cs @@ -0,0 +1,394 @@ +using System; + +namespace AxibugEmuOnline.Client.UNES +{ + partial class PPU + { + private const int GameWidth = 256, GameHeight = 240; + + private uint _bufferPos; + public readonly uint[] RawBitmap = new uint[GameWidth * GameHeight]; + //查找表的Idx网络缓存 + public readonly byte[] RawBitmap_paletteIdxCache = new byte[GameWidth * GameHeight]; + private readonly uint[] _priority = new uint[GameWidth * GameHeight]; + + // TODO: use real chroma/luma decoding + private readonly uint[] _palette = { + 0x7C7C7C, 0x0000FC, 0x0000BC, 0x4428BC, 0x940084, 0xA80020, 0xA81000, 0x881400, + 0x503000, 0x007800, 0x006800, 0x005800, 0x004058, 0x000000, 0x000000, 0x000000, + 0xBCBCBC, 0x0078F8, 0x0058F8, 0x6844FC, 0xD800CC, 0xE40058, 0xF83800, 0xE45C10, + 0xAC7C00, 0x00B800, 0x00A800, 0x00A844, 0x008888, 0x000000, 0x000000, 0x000000, + 0xF8F8F8, 0x3CBCFC, 0x6888FC, 0x9878F8, 0xF878F8, 0xF85898, 0xF87858, 0xFCA044, + 0xF8B800, 0xB8F818, 0x58D854, 0x58F898, 0x00E8D8, 0x787878, 0x000000, 0x000000, + 0xFCFCFC, 0xA4E4FC, 0xB8B8F8, 0xD8B8F8, 0xF8B8F8, 0xF8A4C0, 0xF0D0B0, 0xFCE0A8, + 0xF8D878, 0xD8F878, 0xB8F8B8, 0xB8F8D8, 0x00FCFC, 0xF8D8F8, 0x000000, 0x000000 + }; + + private int _scanLineCount = 261; + private int _cyclesPerLine = 341; + private int _cpuSyncCounter; + private readonly uint[] _scanLineOAM = new uint[8 * 4]; + private readonly bool[] _isSprite0 = new bool[8]; + private int _spriteCount; + + private long _tileShiftRegister; + private uint _currentNameTableByte; + private uint _currentHighTile, _currentLowTile; + private uint _currentColor; + + public void ProcessPixel(int x, int y) + { + ProcessBackgroundForPixel(x, y); + if (F.DrawSprites) + { + ProcessSpritesForPixel(x, y); + } + + if (y != -1) + { + _bufferPos++; + } + } + + private void CountSpritesOnLine(int scanLine) + { + _spriteCount = 0; + var height = F.TallSpritesEnabled ? 16 : 8; + + for (var idx = 0; idx < _oam.Length; idx += 4) + { + var y = _oam[idx] + 1; + if (scanLine >= y && scanLine < y + height) + { + _isSprite0[_spriteCount] = idx == 0; + _scanLineOAM[_spriteCount * 4 + 0] = _oam[idx + 0]; + _scanLineOAM[_spriteCount * 4 + 1] = _oam[idx + 1]; + _scanLineOAM[_spriteCount * 4 + 2] = _oam[idx + 2]; + _scanLineOAM[_spriteCount * 4 + 3] = _oam[idx + 3]; + _spriteCount++; + } + + if (_spriteCount == 8) + { + break; + } + } + } + + private void NextNameTableByte() + { + _currentNameTableByte = ReadByte(0x2000 | (V & 0x0FFF)); + } + + private void NextTileByte(bool hi) + { + var tileIdx = _currentNameTableByte * 16; + var address = F.PatternTableAddress + tileIdx + FineY; + + if (hi) + { + _currentHighTile = ReadByte(address + 8); + } + else + { + _currentLowTile = ReadByte(address); + } + } + + private void NextAttributeByte() + { + // Bless nesdev + var address = 0x23C0 | (V & 0x0C00) | ((V >> 4) & 0x38) | ((V >> 2) & 0x07); + _currentColor = (ReadByte(address) >> (int)((CoarseX & 2) | ((CoarseY & 2) << 1))) & 0x3; + } + + private void ShiftTileRegister() + { + for (var x = 0; x < 8; x++) + { + uint palette = ((_currentHighTile & 0x80) >> 6) | ((_currentLowTile & 0x80) >> 7); + _tileShiftRegister |= (palette + _currentColor * 4) << ((7 - x) * 4); + _currentLowTile <<= 1; + _currentHighTile <<= 1; + } + } + + private void ProcessBackgroundForPixel(int cycle, int scanLine) + { + if (cycle < 8 && !F.DrawLeftBackground || !F.DrawBackground && scanLine != -1) + { + // Maximally sketchy: if current address is in the PPU palette, then it draws that palette entry if rendering is disabled + // Otherwise, it draws $3F00 (universal bg color) + // https://www.romhacking.net/forum/index.php?topic=20554.0 + // Don't know if any game actually uses it, but a test ROM I wrote unexpectedly showed this + // corner case + + //RawBitmap[_bufferPos] = _palette[ReadByte(0x3F00 + ((F.BusAddress & 0x3F00) == 0x3F00 ? F.BusAddress & 0x001F : 0)) & 0x3F]; + byte pIdx = (byte)(ReadByte(0x3F00 + ((F.BusAddress & 0x3F00) == 0x3F00 ? F.BusAddress & 0x001F : 0)) & 0x3F); + //RawBitmap[_bufferPos] = _palette[pIdx]; + RawBitmap_paletteIdxCache[_bufferPos] = pIdx; + return; + } + + var paletteEntry = (uint)(_tileShiftRegister >> 32 >> (int)((7 - X) * 4)) & 0x0F; + if (paletteEntry % 4 == 0) paletteEntry = 0; + + if (scanLine != -1) + { + _priority[_bufferPos] = paletteEntry; + //RawBitmap[_bufferPos] = _palette[ReadByte(0x3F00u + paletteEntry) & 0x3F]; + byte pIdx = (byte)(ReadByte(0x3F00u + paletteEntry) & 0x3F); + //RawBitmap[_bufferPos] = _palette[pIdx]; + RawBitmap_paletteIdxCache[_bufferPos] = pIdx; + } + } + + private void ProcessSpritesForPixel(int x, int scanLine) + { + for (var idx = _spriteCount * 4 - 4; idx >= 0; idx -= 4) + { + var spriteX = _scanLineOAM[idx + 3]; + var spriteY = _scanLineOAM[idx] + 1; + + // Don't draw this sprite if... + if (spriteY == 0 || // it's located at y = 0 + spriteY > 239 || // it's located past y = 239 ($EF) + x >= spriteX + 8 || // it's behind the current dot + x < spriteX || // it's ahead of the current dot + x < 8 && !F.DrawLeftSprites) // it's in the clip area, and clipping is enabled + { + continue; + } + + // amusingly enough, the PPU's palette handling is basically identical + // to that of the Gameboy / Gameboy Color, so I've sort of just copy/pasted + // handling code wholesale from my GBC emulator at + // https://github.com/Xyene/Nitrous-Emulator/blob/master/src/main/java/nitrous/lcd/LCD.java#L642 + var tileIdx = _scanLineOAM[idx + 1]; + if (F.TallSpritesEnabled) + { + tileIdx &= ~0x1u; + } + + tileIdx *= 16; + + var attribute = _scanLineOAM[idx + 2] & 0xE3; + + var palette = attribute & 0x3; + var front = (attribute & 0x20) == 0; + var flipX = (attribute & 0x40) > 0; + var flipY = (attribute & 0x80) > 0; + + var px = (int) (x - spriteX); + var line = (int) (scanLine - spriteY); + + var tableBase = F.TallSpritesEnabled ? (_scanLineOAM[idx + 1] & 1) * 0x1000 : F.SpriteTableAddress; + + if (F.TallSpritesEnabled) + { + if (line >= 8) + { + line -= 8; + if (!flipY) + { + tileIdx += 16; + } + + flipY = false; + } + + if (flipY) + { + tileIdx += 16; + } + } + + // here we handle the x and y flipping by tweaking the indices we are accessing + var logicalX = flipX ? 7 - px : px; + var logicalLine = flipY ? 7 - line : line; + + var address = (uint) (tableBase + tileIdx + logicalLine); + + // this looks bad, but it's about as readable as it's going to get + var color = (uint) ( + ( + ( + ( + // fetch upper bit from 2nd bit plane + ReadByte(address + 8) & (0x80 >> logicalX) + ) >> (7 - logicalX) + ) << 1 // this is the upper bit of the color number + ) | + ( + ( + ReadByte(address) & (0x80 >> logicalX) + ) >> (7 - logicalX) + )); // << 0, this is the lower bit of the color number + + if (color > 0) + { + var backgroundPixel = _priority[_bufferPos]; + // Sprite 0 hits... + if (!(!_isSprite0[idx / 4] || // do not occur on not-0 sprite + x < 8 && !F.DrawLeftSprites || // or if left clipping is enabled + backgroundPixel == 0 || // or if bg pixel is transparent + F.Sprite0Hit || // or if it fired this frame already + x == 255)) // or if x is 255, "for an obscure reason related to the pixel pipeline" + { + F.Sprite0Hit = true; + } + + if (F.DrawBackground && (front || backgroundPixel == 0)) + { + if (scanLine != -1) + { + //RawBitmap[_bufferPos] = _palette[ReadByte(0x3F10 + palette * 4 + color) & 0x3F]; + + byte pIdx = (byte)(ReadByte(0x3F10 + palette * 4 + color) & 0x3F); + RawBitmap[_bufferPos] = _palette[pIdx]; + RawBitmap_paletteIdxCache[_bufferPos] = pIdx; + } + } + } + } + } + + public void ProcessFrame() + { + RawBitmap.Fill(0u); + RawBitmap_paletteIdxCache.Fill((byte)0); + _priority.Fill(0u); + _bufferPos = 0; + + for (var i = -1; i < _scanLineCount; i++) + { + ProcessScanLine(i); + } + } + + public void ProcessScanLine(int line) + { + for (var i = 0; i < _cyclesPerLine; i++) + { + ProcessCycle(line, i); + } + } + + private int _cpuClocksSinceVBL; + private int _ppuClocksSinceVBL; + + public void ProcessCycle(int scanLine, int cycle) + { + var visibleCycle = 1 <= cycle && cycle <= 256; + var prefetchCycle = 321 <= cycle && cycle <= 336; + var fetchCycle = visibleCycle || prefetchCycle; + + if (F.VBlankStarted) + { + _ppuClocksSinceVBL++; + } + + if (0 <= scanLine && scanLine < 240 || scanLine == -1) + { + if (visibleCycle) + { + ProcessPixel(cycle - 1, scanLine); + } + + // During pixels 280 through 304 of this scanline, the vertical scroll bits are reloaded TODO: if rendering is enabled. + if (scanLine == -1 && 280 <= cycle && cycle <= 304) + { + ReloadScrollY(); + } + + if (fetchCycle) + { + _tileShiftRegister <<= 4; + + // See https://wiki.nesdev.com/w/images/d/d1/Ntsc_timing.png + // Takes 8 cycles for tile to be read, 2 per "step" + switch (cycle & 7) + { + case 1: // NT + NextNameTableByte(); + break; + case 3: // AT + NextAttributeByte(); + break; + case 5: // Tile low + NextTileByte(false); + break; + case 7: // Tile high + NextTileByte(true); + break; + case 0: // 2nd cycle of tile high fetch + if (cycle == 256) + IncrementScrollY(); + else + IncrementScrollX(); + // Begin rendering a brand new tile + ShiftTileRegister(); + break; + } + } + + if (cycle == 257) + { + ReloadScrollX(); + // 257 - 320 + // The tile data for the sprites on the next scanline are fetched here. + // TODO: stagger this over all the cycles as opposed to only on 257 + CountSpritesOnLine(scanLine + 1); + } + } + + // TODO: this is a hack; VBlank should be cleared on dot 1 of the pre-render line, + // but for some reason we're at 2272-2273 CPU clocks at that time + // (i.e., our PPU timing is off somewhere by 6-9 PPU cycles per frame) + if (F.VBlankStarted && _cpuClocksSinceVBL == 2270) + { + F.VBlankStarted = false; + _cpuClocksSinceVBL = 0; + } + + if (cycle == 1) + { + if (scanLine == 241) + { + F.VBlankStarted = true; + if (F.NMIEnabled) + { + _emulator.CPU.TriggerInterrupt(CPU.InterruptType.NMI); + } + } + + // Happens at the same time as 1st cycle of NT byte fetch + if (scanLine == -1) + { + // Console.WriteLine(_ppuClocksSinceVBL); + _ppuClocksSinceVBL = 0; + F.VBlankStarted = false; + F.Sprite0Hit = false; + F.SpriteOverflow = false; + } + } + + _emulator.Mapper.ProcessCycle(scanLine, cycle); + + if (_cpuSyncCounter + 1 == 3) + { + if (F.VBlankStarted) + { + _cpuClocksSinceVBL++; + } + + _emulator.CPU.TickFromPPU(); + _cpuSyncCounter = 0; + } + else + { + _cpuSyncCounter++; + } + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Core/PPU.Core.cs.meta b/AxibugEmuOnline.Client/Assets/Runtime/Core/PPU.Core.cs.meta new file mode 100644 index 0000000..db54fa8 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Core/PPU.Core.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c6d671ac51126cd43981be89a0309422 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Core/PPU.Memory.cs b/AxibugEmuOnline.Client/Assets/Runtime/Core/PPU.Memory.cs new file mode 100644 index 0000000..10afa10 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Core/PPU.Memory.cs @@ -0,0 +1,130 @@ +using System; +using System.Runtime.CompilerServices; + +namespace AxibugEmuOnline.Client.UNES +{ + partial class PPU + { + private readonly byte[] _oam = new byte[0x100]; + private readonly byte[] _vRam = new byte[0x2000]; + private readonly byte[] _paletteRAM = new byte[0x20]; + + private static readonly uint[][] _vRamMirrorLookup = + { + new uint[]{0, 0, 1, 1}, // H + new uint[]{0, 1, 0, 1}, // V + new uint[]{0, 1, 2, 3}, // All + new uint[]{0, 0, 0, 0}, // Upper + new uint[]{1, 1, 1, 1}, // Lower + }; + + private int _lastWrittenRegister; + + public void WriteRegister(uint reg, byte val) + { + reg &= 0xF; + _lastWrittenRegister = val & 0xFF; + switch (reg) + { + case 0x0000: + PPUCTRL = val; + return; + case 0x0001: + PPUMASK = val; + return; + case 0x0002: return; + case 0x0003: + OAMADDR = val; + return; + case 0x0004: + OAMDATA = val; + return; + case 0x005: + PPUSCROLL = val; + return; + case 0x0006: + PPUADDR = val; + return; + case 0x0007: + PPUDATA = val; + return; + } + + throw new NotImplementedException($"{reg:X4} = {val:X2}"); + } + + public byte ReadRegister(uint reg) + { + reg &= 0xF; + switch (reg) + { + case 0x0000: return (byte)_lastWrittenRegister; + case 0x0001: return (byte)_lastWrittenRegister; + case 0x0002: + return (byte)PPUSTATUS; + case 0x0003: + return (byte)OAMADDR; + case 0x0004: + return (byte)OAMDATA; + case 0x0005: return (byte)_lastWrittenRegister; + case 0x0006: return (byte)_lastWrittenRegister; + case 0x0007: + return (byte)PPUDATA; + } + throw new NotImplementedException(reg.ToString("X2")); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public uint GetVRamMirror(long address) + { + long entry; + var table = Math.DivRem(address - 0x2000, 0x400, out entry); + return _vRamMirrorLookup[(int)_emulator.Cartridge.MirroringMode][table] * 0x400 + (uint)entry; + } + + protected override void InitializeMemoryMap() + { + base.InitializeMemoryMap(); + + MapReadHandler(0x2000, 0x2FFF, address => _vRam[GetVRamMirror(address)]); + MapReadHandler(0x3000, 0x3EFF, address => _vRam[GetVRamMirror(address - 0x1000)]); + MapReadHandler(0x3F00, 0x3FFF, address => + { + if (address == 0x3F10 || address == 0x3F14 || address == 0x3F18 || address == 0x3F0C) + { + address -= 0x10; + } + + return _paletteRAM[(address - 0x3F00) & 0x1F]; + }); + + MapWriteHandler(0x2000, 0x2FFF, (address, val) => _vRam[GetVRamMirror(address)] = val); + MapWriteHandler(0x3000, 0x3EFF, (address, val) => _vRam[GetVRamMirror(address - 0x1000)] = val); + MapWriteHandler(0x3F00, 0x3FFF, (address, val) => + { + if (address == 0x3F10 || address == 0x3F14 || address == 0x3F18 || address == 0x3F0C) + { + address -= 0x10; + } + + _paletteRAM[(address - 0x3F00) & 0x1F] = val; + }); + + _emulator.Mapper.InitializeMemoryMap(this); + } + + public void PerformDMA(uint from) + { + //Console.WriteLine("OAM DMA"); + from <<= 8; + for (uint i = 0; i <= 0xFF; i++) + { + _oam[F.OAMAddress] = (byte)_emulator.CPU.ReadByte(from); + from++; + F.OAMAddress++; + } + + _emulator.CPU.Cycle += 513 + _emulator.CPU.Cycle % 2; + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Core/PPU.Memory.cs.meta b/AxibugEmuOnline.Client/Assets/Runtime/Core/PPU.Memory.cs.meta new file mode 100644 index 0000000..cf6d09f --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Core/PPU.Memory.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fa442177f52c5ff4a805fb4e1a30703b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Core/PPU.Registers.cs b/AxibugEmuOnline.Client/Assets/Runtime/Core/PPU.Registers.cs new file mode 100644 index 0000000..338d1dc --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Core/PPU.Registers.cs @@ -0,0 +1,261 @@ +using System; + +namespace AxibugEmuOnline.Client.UNES +{ + partial class PPU + { + public class PPUFlags + { + /* PPUCTRL register */ + public bool NMIEnabled; + public bool IsMaster; + public bool TallSpritesEnabled; + public uint PatternTableAddress; + public uint SpriteTableAddress; + public uint VRAMIncrement; + + /* PPUMASK register */ + public bool GrayscaleEnabled; + public bool DrawLeftBackground; + public bool DrawLeftSprites; + public bool DrawBackground; + public bool DrawSprites; + // Flipped for PAL/Dendy + public bool EmphasizeRed; + public bool EmphasizeGreen; + public bool EmphasizeBlue; + + /* PPUSTATUS register */ + public bool VBlankStarted; + public bool Sprite0Hit; + public bool SpriteOverflow; + public bool AddressLatch; + + /* PPUADDR register */ + private uint _busAddress; + public uint BusAddress + { + get => _busAddress; + set => _busAddress = value & 0x3FFF; + } + + /* PPUDATA register */ + public uint BusData; + + /* OAMADDR register */ + private uint _oamAddress; + public uint OAMAddress + { + get => _oamAddress; + set => _oamAddress = value & 0xFF; + } + + /* PPUSCROLL registers */ + [Obsolete] + public uint ScrollX; + [Obsolete] + public uint ScrollY; + + public bool RenderingEnabled => DrawBackground || DrawSprites; + } + + public PPUFlags F = new PPUFlags(); + + private uint _v; + public uint V + { + get => _v; + set => _v = value & 0x7FFF; + } + public uint T, X; + + public uint CoarseX => V & 0x1F; + + public uint CoarseY => (V >> 5) & 0x1F; + + public uint FineY => (V >> 12) & 0x7; + + public void ReloadScrollX() => V = (V & 0xFBE0) | (T & 0x041F); + + public void ReloadScrollY() => V = (V & 0x841F) | (T & 0x7BE0); + + public void IncrementScrollX() + { + if ((V & 0x001F) == 31) // if coarse X == 31 + { + V &= ~0x001Fu; // coarse X = 0 + V ^= 0x0400; // switch horizontal nametable + } + else + { + V += 1; // increment coarse X + } + } + + public void IncrementScrollY() + { + if ((V & 0x7000) != 0x7000) // if fine Y < 7 + { + V += 0x1000; // increment fine Y + } + else + { + V &= ~0x7000u; // fine Y = 0 + + uint y = (V & 0x03E0) >> 5; // let y = coarse Y + if (y == 29) + { + y = 0; // coarse Y = 0 + V ^= 0x0800; + } + // switch vertical nametable + else if (y == 31) + { + y = 0; // coarse Y = 0, nametable not switched + } + else + { + y += 1; // increment coarse Y + } + + V = (V & ~0x03E0u) | (y << 5); // put coarse Y back into v + } + } + + public uint PPUCTRL + { + set + { + F.NMIEnabled = (value & 0x80) > 0; + F.IsMaster = (value & 0x40) > 0; + F.TallSpritesEnabled = (value & 0x20) > 0; + F.PatternTableAddress = (value & 0x10) > 0 ? 0x1000u : 0x0000; + F.SpriteTableAddress = (value & 0x08) > 0 ? 0x1000u : 0x0000; + F.VRAMIncrement = (value & 0x04) > 0 ? 32u : 1; + // yyy NN YYYYY XXXXX + // ||| || ||||| +++++--coarse X scroll + // ||| || +++++--------coarse Y scroll + // ||| ++--------------nametable select + // +++-----------------fine Y scroll + T = (T & 0xF3FF) | ((value & 0x3) << 10); // Bits 10-11 hold the base address of the nametable minus $2000 + } + } + + public uint PPUMASK + { + set + { + F.GrayscaleEnabled = (value & 0x1) > 0; + F.DrawLeftBackground = (value & 0x2) > 0; + F.DrawLeftSprites = (value & 0x4) > 0; + F.DrawBackground = (value & 0x8) > 0; + F.DrawSprites = (value & 0x10) > 0; + F.EmphasizeRed = (value & 0x20) > 0; + F.EmphasizeGreen = (value & 0x40) > 0; + F.EmphasizeBlue = (value & 0x80) > 0; + } + } + + /** $2002 **/ + public uint PPUSTATUS + { + get + { + F.AddressLatch = false; + var ret = (F.VBlankStarted.AsByte() << 7) | + (F.Sprite0Hit.AsByte() << 6) | + (F.SpriteOverflow.AsByte() << 5) | + (_lastWrittenRegister & 0x1F); + F.VBlankStarted = false; + return (uint)ret; + } + } + + /** $2006 **/ + public uint PPUADDR + { + set + { + if (F.AddressLatch) + { + T = (T & 0xFF00) | value; + F.BusAddress = T; + V = T; + } + else + { + T = (T & 0x80FF) | ((value & 0x3F) << 8); + } + + F.AddressLatch ^= true; + } + } + + /** $2005 **/ + public uint PPUSCROLL + { + set + { + if (F.AddressLatch) + { + F.ScrollY = value; + T = (T & 0x8FFF) | ((value & 0x7) << 12); + T = (T & 0xFC1F) | (value & 0xF8) << 2; + } + else + { + F.ScrollX = value; + X = value & 0x7; + T = (T & 0xFFE0) | (value >> 3); + } + + F.AddressLatch ^= true; + } + } + + private uint _readBuffer; + public uint PPUDATA + { + get + { + uint ret = ReadByte(F.BusAddress); + if (F.BusAddress < 0x3F00) + { + uint temp = _readBuffer; + _readBuffer = ret; + ret = temp; + } + else + { + // Palette read should also read VRAM into read buffer + _readBuffer = ReadByte(F.BusAddress - 0x1000); + } + + F.BusAddress += F.VRAMIncrement; + return ret; + } + set + { + F.BusData = value; + WriteByte(F.BusAddress, value); + F.BusAddress += F.VRAMIncrement; + } + } + + public uint OAMADDR + { + get => F.OAMAddress; + set => F.OAMAddress = value; + } + + public uint OAMDATA + { + get => _oam[F.OAMAddress]; + set + { + _oam[F.OAMAddress] = (byte)value; + F.OAMAddress++; + } + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Core/PPU.Registers.cs.meta b/AxibugEmuOnline.Client/Assets/Runtime/Core/PPU.Registers.cs.meta new file mode 100644 index 0000000..24948ac --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Core/PPU.Registers.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0db554be3f472c940bde6ce34fc9ed7e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Core/PPU.cs b/AxibugEmuOnline.Client/Assets/Runtime/Core/PPU.cs new file mode 100644 index 0000000..bd1fdb2 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Core/PPU.cs @@ -0,0 +1,10 @@ +namespace AxibugEmuOnline.Client.UNES +{ + public sealed partial class PPU : Addressable + { + public PPU(Emulator emulator) : base(emulator, 0x3FFF) + { + InitializeMemoryMap(); + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Core/PPU.cs.meta b/AxibugEmuOnline.Client/Assets/Runtime/Core/PPU.cs.meta new file mode 100644 index 0000000..5006815 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Core/PPU.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bd14757720b242e4b92425c9d6aae16a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Core/Utility.cs b/AxibugEmuOnline.Client/Assets/Runtime/Core/Utility.cs new file mode 100644 index 0000000..0455b41 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Core/Utility.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; + +namespace AxibugEmuOnline.Client.UNES +{ + public static class Utility + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static byte AsByte(this bool to) + { + unsafe + { + var result = *((byte*) &to); + return result; + } + } + + public static void Fill(this T[] arr, T value) + { + for (var i = 0; i < arr.Length; i++) + { + arr[i] = value; + } + } + + public static void Map(this IEnumerable enumerator, Action go) + { + foreach (var e in enumerator) + { + go(e); + } + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Core/Utility.cs.meta b/AxibugEmuOnline.Client/Assets/Runtime/Core/Utility.cs.meta new file mode 100644 index 0000000..2d1f3ff --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Core/Utility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b326828d1b42abc419d9fe125eed8205 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Input.meta b/AxibugEmuOnline.Client/Assets/Runtime/Input.meta new file mode 100644 index 0000000..9b5bc16 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Input.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1d2ce2c96b7d7ad4cb099e5ce0ea885d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Input/BaseInput.cs b/AxibugEmuOnline.Client/Assets/Runtime/Input/BaseInput.cs new file mode 100644 index 0000000..1a96398 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Input/BaseInput.cs @@ -0,0 +1,11 @@ +using System; +using UnityEngine; + +namespace AxibugEmuOnline.Client.UNES.Input +{ + public abstract class BaseInput + { + public abstract void HandlerKeyDown(Action onKeyDown); + public abstract void HandlerKeyUp(Action onKeyUp); + } +} diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Input/BaseInput.cs.meta b/AxibugEmuOnline.Client/Assets/Runtime/Input/BaseInput.cs.meta new file mode 100644 index 0000000..fefd734 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Input/BaseInput.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b60ded3f5a662a14a8a50795bae8121b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Input/DefaultInput.cs b/AxibugEmuOnline.Client/Assets/Runtime/Input/DefaultInput.cs new file mode 100644 index 0000000..43cbb96 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Input/DefaultInput.cs @@ -0,0 +1,49 @@ +using System; +using UnityEngine; + +namespace AxibugEmuOnline.Client.UNES.Input +{ + public class DefaultInput : BaseInput + { + private KeyCode[] _keyCodes + { + get + { + if (_keyCodeCache == null) + { + var array = Enum.GetValues(typeof(KeyCode)); + _keyCodeCache = new KeyCode[array.Length]; + for (var i = 0; i < array.Length; i++) + { + _keyCodeCache[i] = (KeyCode)array.GetValue(i); + } + } + + return _keyCodeCache; + } + } + private KeyCode[] _keyCodeCache; + + public override void HandlerKeyDown(Action onKeyDown) + { + foreach (var keyCode in _keyCodes) + { + if (UnityEngine.Input.GetKeyDown(keyCode)) + { + onKeyDown(keyCode); + } + } + } + + public override void HandlerKeyUp(Action onKeyUp) + { + foreach (var keyCode in _keyCodes) + { + if (UnityEngine.Input.GetKeyUp(keyCode)) + { + onKeyUp(keyCode); + } + } + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Input/DefaultInput.cs.meta b/AxibugEmuOnline.Client/Assets/Runtime/Input/DefaultInput.cs.meta new file mode 100644 index 0000000..01b9f33 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Input/DefaultInput.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 028fda8a78366f347b421062b3604d20 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Mapper.meta b/AxibugEmuOnline.Client/Assets/Runtime/Mapper.meta new file mode 100644 index 0000000..f05ed2d --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Mapper.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d22acc98b0a7fa042bb19b9894899fb7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Mapper/AxROM.cs b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/AxROM.cs new file mode 100644 index 0000000..76e4b7b --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/AxROM.cs @@ -0,0 +1,26 @@ +using static AxibugEmuOnline.Client.UNES.Cartridge.VRAMMirroringMode; + +namespace AxibugEmuOnline.Client.UNES.Mapper +{ + [MapperDef(7)] + public class AxROM : BaseMapper + { + protected int _bankOffset; + private readonly Cartridge.VRAMMirroringMode[] _mirroringModes = { Lower, Upper }; + + public AxROM(Emulator emulator) : base(emulator) + { + _emulator.Cartridge.MirroringMode = _mirroringModes[0]; + } + + public override void InitializeMemoryMap(CPU cpu) + { + cpu.MapReadHandler(0x8000, 0xFFFF, address => _prgROM[_bankOffset + (address - 0x8000)]); + cpu.MapWriteHandler(0x8000, 0xFFFF, (address, val) => + { + _bankOffset = (val & 0x7) * 0x8000; + _emulator.Cartridge.MirroringMode = _mirroringModes[(val >> 4) & 0x1]; + }); + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Mapper/AxROM.cs.meta b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/AxROM.cs.meta new file mode 100644 index 0000000..67ab997 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/AxROM.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 632b907c0f30abb47b218545e40ff06d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Mapper/BaseMapper.cs b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/BaseMapper.cs new file mode 100644 index 0000000..05d3e3f --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/BaseMapper.cs @@ -0,0 +1,67 @@ +using System; +using System.IO; + +namespace AxibugEmuOnline.Client.UNES.Mapper +{ + [AttributeUsage(AttributeTargets.Class, Inherited = false)] + public class MapperDef : Attribute + { + public int Id; + public string Name; + public string Description; + + public MapperDef() + { + + } + + public MapperDef(int id) + { + Id = id; + } + } + + public abstract class BaseMapper + { + protected readonly Emulator _emulator; + protected readonly byte[] _prgROM; + protected readonly byte[] _prgRAM = new byte[0x2000]; + protected readonly byte[] _chrROM; + protected readonly uint _lastBankOffset; + + protected BaseMapper(Emulator emulator) + { + _emulator = emulator; + var cart = emulator.Cartridge; + _prgROM = cart.PRGROM; + _chrROM = cart.CHRROM; + _lastBankOffset = (uint) _prgROM.Length - 0x4000; + } + + public virtual void InitializeMemoryMap(CPU cpu) + { + + } + + public virtual void InitializeMemoryMap(PPU ppu) + { + ppu.MapReadHandler(0x0000, 0x1FFF, address => _chrROM[address]); + ppu.MapWriteHandler(0x0000, 0x1FFF, (address, val) => _chrROM[address] = val); + } + + public virtual void ProcessCycle(int scanLine, int cycle) + { + + } + + public virtual byte[] GetSaveData() + { + return _prgRAM; + } + + public virtual void LoadSaveData(byte[] saveData) + { + Array.Copy(saveData, _prgRAM, saveData.Length); + } + } +} \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Mapper/BaseMapper.cs.meta b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/BaseMapper.cs.meta new file mode 100644 index 0000000..6e44d0d --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/BaseMapper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a468573a1ef266542a055638aeef33cb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Mapper/CNROM.cs b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/CNROM.cs new file mode 100644 index 0000000..0ac1eda --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/CNROM.cs @@ -0,0 +1,32 @@ +namespace AxibugEmuOnline.Client.UNES.Mapper +{ + [MapperDef(3)] + public class CNROM : BaseMapper + { + protected int _bankOffset; + + public CNROM(Emulator emulator) : base(emulator) + { + } + + public override void InitializeMemoryMap(PPU ppu) + { + ppu.MapReadHandler(0x0000, 0x1FFF, address => _chrROM[_bankOffset + address]); + } + + public override void InitializeMemoryMap(CPU cpu) + { + if (_prgROM.Length == 0x8000) + { + cpu.MapReadHandler(0x8000, 0xFFFF, address => _prgROM[address - 0x8000]); + } + else + { + cpu.MapReadHandler(0x8000, 0xBFFF, address => _prgROM[address - 0x8000]); + cpu.MapReadHandler(0xC000, 0xFFFF, address => _prgROM[address - 0xC000]); + } + + cpu.MapWriteHandler(0x8000, 0xFFFF, (address, val) => _bankOffset = (val & 0x3) * 0x2000); + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Mapper/CNROM.cs.meta b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/CNROM.cs.meta new file mode 100644 index 0000000..15d040c --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/CNROM.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fdaa43625af49e54aacf69d2ed92544f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Mapper/Camerica.cs b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/Camerica.cs new file mode 100644 index 0000000..8f0cf99 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/Camerica.cs @@ -0,0 +1,27 @@ +namespace AxibugEmuOnline.Client.UNES.Mapper +{ + [MapperDef(71)] + public class Camerica : BaseMapper + { + protected int _prgBankOffset; + + public Camerica(Emulator emulator) : base(emulator) + { + } + + public override void InitializeMemoryMap(CPU cpu) + { + cpu.MapReadHandler(0x8000, 0xBFFF, address => _prgROM[_prgBankOffset + (address - 0x8000)]); + cpu.MapReadHandler(0xC000, 0xFFFF, address => _prgROM[_prgROM.Length - 0x4000 + (address - 0xC000)]); + + // Actually starts at 0x8000, but use 0x9000 for compatibility w/o submapper + cpu.MapWriteHandler(0x9000, 0x9FFF, (address, val) => + { + // TODO: Fire Hawk mirroring + }); + + // The number of bits available vary: 4 for the BF9093, 3 for the BF9097, and 2 for the BF9096. + cpu.MapWriteHandler(0xC000, 0xFFFF, (address, val) => _prgBankOffset = (val & 0xF) * 0x4000 % _prgROM.Length); + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Mapper/Camerica.cs.meta b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/Camerica.cs.meta new file mode 100644 index 0000000..2d735de --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/Camerica.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a879b12017bd97949a00317043b96f54 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Mapper/ColorDreams.cs b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/ColorDreams.cs new file mode 100644 index 0000000..fae07ee --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/ColorDreams.cs @@ -0,0 +1,29 @@ +namespace AxibugEmuOnline.Client.UNES.Mapper +{ + [MapperDef(11)] + public class ColorDreams : BaseMapper + { + protected int _prgBankOffset; + protected int _chrBankOffset; + + public ColorDreams(Emulator emulator) : base(emulator) + { + } + + public override void InitializeMemoryMap(PPU ppu) + { + ppu.MapReadHandler(0x0000, 0x1FFF, address => _chrROM[_chrBankOffset + address]); + } + + public override void InitializeMemoryMap(CPU cpu) + { + cpu.MapReadHandler(0x8000, 0xFFFF, address => _prgROM[_prgBankOffset + (address - 0x8000)]); + + cpu.MapWriteHandler(0x8000, 0xFFFF, (address, val) => + { + _prgBankOffset = (val & 0x3) * 0x8000; + _chrBankOffset = (val >> 4) * 0x2000; + }); + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Mapper/ColorDreams.cs.meta b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/ColorDreams.cs.meta new file mode 100644 index 0000000..172a6aa --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/ColorDreams.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 50a4c8ff195db574585c43ba079d8195 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Mapper/DxROM.cs b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/DxROM.cs new file mode 100644 index 0000000..b4f8c62 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/DxROM.cs @@ -0,0 +1,39 @@ +namespace AxibugEmuOnline.Client.UNES.Mapper +{ + [MapperDef(206)] + public class DxROM : MMC3 + { + public DxROM(Emulator emulator) : base(emulator) + { + _prgBankingMode = PRGBankingMode.SwitchFix; + _chrBankingMode = CHRBankingMode.TwoFour; + } + + public override void InitializeMemoryMap(CPU cpu) + { + cpu.MapReadHandler(0x8000, 0xFFFF, address => _prgROM[_prgBankOffsets[(address - 0x8000) / 0x2000] + address % 0x2000]); + + cpu.MapWriteHandler(0x8000, 0x9FFF, (address, val) => + { + if ((address & 0x1) == 0) + { + _currentBank = val & 0x7u; + } + else + { + if (_currentBank <= 1) val &= 0x1F; + else if (_currentBank <= 5) val &= 0x3F; + else val &= 0xF; + + _banks[_currentBank] = val; + UpdateOffsets(); + } + }); + } + + public override void InitializeMemoryMap(PPU ppu) + { + ppu.MapReadHandler(0x0000, 0x1FFF, address => _chrROM[_chrBankOffsets[address / 0x400] + address % 0x400]); + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Mapper/DxROM.cs.meta b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/DxROM.cs.meta new file mode 100644 index 0000000..dd2b1c3 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/DxROM.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b8ae98e170ab70143bc7284dc01b9627 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Mapper/GxROM.cs b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/GxROM.cs new file mode 100644 index 0000000..92a063a --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/GxROM.cs @@ -0,0 +1,29 @@ +namespace AxibugEmuOnline.Client.UNES.Mapper +{ + [MapperDef(66)] + public class GxROM : BaseMapper + { + protected int _prgBankOffset; + protected int _chrBankOffset; + + public GxROM(Emulator emulator) : base(emulator) + { + } + + public override void InitializeMemoryMap(PPU ppu) + { + ppu.MapReadHandler(0x0000, 0x1FFF, address => _chrROM[_chrBankOffset + address]); + } + + public override void InitializeMemoryMap(CPU cpu) + { + cpu.MapReadHandler(0x8000, 0xFFFF, address => _prgROM[_prgBankOffset + (address - 0x8000)]); + + cpu.MapWriteHandler(0x8000, 0xFFFF, (address, val) => + { + _prgBankOffset = ((val >> 4) & 0x3) * 0x8000; + _chrBankOffset = (val & 0x3) * 0x2000; + }); + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Mapper/GxROM.cs.meta b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/GxROM.cs.meta new file mode 100644 index 0000000..2810704 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/GxROM.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9a06e1a753215b64886b90ecde825cec +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Mapper/Jaleco.cs b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/Jaleco.cs new file mode 100644 index 0000000..b85b047 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/Jaleco.cs @@ -0,0 +1,29 @@ +namespace AxibugEmuOnline.Client.UNES.Mapper +{ + [MapperDef(140)] + public class Jaleco : BaseMapper + { + protected int _prgBankOffset; + protected int _chrBankOffset; + + public Jaleco(Emulator emulator) : base(emulator) + { + } + + public override void InitializeMemoryMap(PPU ppu) + { + ppu.MapReadHandler(0x0000, 0x1FFF, address => _chrROM[_chrBankOffset + address]); + } + + public override void InitializeMemoryMap(CPU cpu) + { + cpu.MapReadHandler(0x8000, 0xFFFF, address => _prgROM[_prgBankOffset + (address - 0x8000)]); + + cpu.MapWriteHandler(0x6000, 0x7FFF, (address, val) => + { + _prgBankOffset = ((val >> 4) & 0x3) * 0x8000; + _chrBankOffset = (val & 0x3) * 0x2000; + }); + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Mapper/Jaleco.cs.meta b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/Jaleco.cs.meta new file mode 100644 index 0000000..836c62f --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/Jaleco.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ac2f62d216cf70643919c921900c6e70 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Mapper/MMC1.cs b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/MMC1.cs new file mode 100644 index 0000000..a420edf --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/MMC1.cs @@ -0,0 +1,170 @@ +using static AxibugEmuOnline.Client.UNES.Cartridge.VRAMMirroringMode; + +namespace AxibugEmuOnline.Client.UNES.Mapper +{ + [MapperDef(1)] + public class MMC1 : BaseMapper + { + // TODO: are MMC1 and MMC1A even different chip types? + public enum ChipType { MMC1, MMC1A, MMC1B, MMC1C } + public enum CHRBankingMode { Single, Double } + public enum PRGBankingMode { Switch32Kb, Switch16KbFixFirst, Switch16KbFixLast } + + private readonly Cartridge.VRAMMirroringMode[] _mirroringModes = { Lower, Upper, Vertical, Horizontal }; + + private readonly ChipType _type; + private CHRBankingMode _chrBankingMode; + private PRGBankingMode _prgBankingMode; + + private uint _serialData; + private int _serialPos; + + private uint _control; + + private readonly uint[] _chrBankOffsets = new uint[2]; + private readonly uint[] _chrBanks = new uint[2]; + + private readonly uint[] _prgBankOffsets = new uint[2]; + private uint _prgBank; + + private bool _prgRAMEnabled; + + private uint? _lastWritePC; + + public MMC1(Emulator emulator) : this(emulator, ChipType.MMC1B) + { + + } + + public MMC1(Emulator emulator, ChipType chipType) : base(emulator) + { + _type = chipType; + if (chipType == ChipType.MMC1B) _prgRAMEnabled = true; + UpdateControl(0x0F); + _emulator.Cartridge.MirroringMode = Horizontal; + } + + public override void InitializeMemoryMap(CPU cpu) + { + cpu.MapReadHandler(0x6000, 0x7FFF, address => _prgRAM[address - 0x6000]); + cpu.MapReadHandler(0x8000, 0xFFFF, address => _prgROM[_prgBankOffsets[(address - 0x8000) / 0x4000] + address % 0x4000]); + + cpu.MapWriteHandler(0x6000, 0x7FFF, (address, val) => + { + // PRG RAM is always enabled on MMC1A + if (_type == ChipType.MMC1A || _prgRAMEnabled) + _prgRAM[address - 0x6000] = val; + }); + + cpu.MapWriteHandler(0x8000, 0xFFFF, (address, val) => + { + // Explicitly ignore the second write happening on consecutive cycles + // of an RMW instruction + var cycle = _emulator.CPU.PC; + if (cycle == _lastWritePC) + return; + _lastWritePC = cycle; + + if ((val & 0x80) > 0) + { + _serialData = 0; + _serialPos = 0; + UpdateControl(_control | 0x0C); + } + else + { + _serialData |= (uint)((val & 0x1) << _serialPos); + _serialPos++; + + if (_serialPos == 5) + { + // Address is incompletely decoded + address &= 0x6000; + if (address == 0x0000) + UpdateControl(_serialData); + else if (address == 0x2000) + UpdateCHRBank(0, _serialData); + else if (address == 0x4000) + UpdateCHRBank(1, _serialData); + else if (address == 0x6000) + UpdatePRGBank(_serialData); + + _serialData = 0; + _serialPos = 0; + } + } + }); + } + + public override void InitializeMemoryMap(PPU ppu) + { + ppu.MapReadHandler(0x0000, 0x1FFF, address => _chrROM[_chrBankOffsets[address / 0x1000] + address % 0x1000]); + ppu.MapWriteHandler(0x0000, 0x1FFF, (address, val) => _chrROM[_chrBankOffsets[address / 0x1000] + address % 0x1000] = val); + } + + private void UpdateControl(uint value) + { + _control = value; + + _emulator.Cartridge.MirroringMode = _mirroringModes[value & 0x3]; + + _chrBankingMode = (CHRBankingMode)((value >> 4) & 0x1); + + var prgMode = (value >> 2) & 0x3; + // Both 0 and 1 are 32Kb switch + if (prgMode == 0) prgMode = 1; + _prgBankingMode = (PRGBankingMode)(prgMode - 1); + + UpdateCHRBank(1, _chrBanks[1]); + UpdateCHRBank(0, _chrBanks[0]); + UpdatePRGBank(_prgBank); + } + + private void UpdatePRGBank(uint value) + { + _prgBank = value; + + _prgRAMEnabled = (value & 0x10) == 0; + value &= 0xF; + + switch (_prgBankingMode) + { + case PRGBankingMode.Switch32Kb: + value >>= 1; + value *= 0x4000; + _prgBankOffsets[0] = value; + _prgBankOffsets[1] = value + 0x4000; + break; + case PRGBankingMode.Switch16KbFixFirst: + _prgBankOffsets[0] = 0; + _prgBankOffsets[1] = value * 0x4000; + break; + case PRGBankingMode.Switch16KbFixLast: + _prgBankOffsets[0] = value * 0x4000; + _prgBankOffsets[1] = _lastBankOffset; + break; + } + } + + private void UpdateCHRBank(uint bank, uint value) + { + _chrBanks[bank] = value; + + // TODO FIXME: I feel like this branch should only be taken + // when bank == 0, but this breaks Final Fantasy + // When can banking mode change without UpdateCHRBank being called? + if (_chrBankingMode == CHRBankingMode.Single) + { + value = _chrBanks[0]; + value >>= 1; + value *= 0x1000; + _chrBankOffsets[0] = value; + _chrBankOffsets[1] = value + 0x1000; + } + else + { + _chrBankOffsets[bank] = value * 0x1000; + } + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Mapper/MMC1.cs.meta b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/MMC1.cs.meta new file mode 100644 index 0000000..4c02868 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/MMC1.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d3ab06f7819df254491a7afa6a82bb43 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Mapper/MMC2.cs b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/MMC2.cs new file mode 100644 index 0000000..2aa4a06 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/MMC2.cs @@ -0,0 +1,33 @@ +namespace AxibugEmuOnline.Client.UNES.Mapper +{ + [MapperDef(Id = 9, Description = "Mike Tyson's Punch-Out!!")] + public class MMC2 : MMC4 + { + public MMC2(Emulator emulator) : base(emulator) + { + + } + + public override void InitializeMemoryMap(CPU cpu) + { + base.InitializeMemoryMap(cpu); + + cpu.MapReadHandler(0x8000, 0xBFFF, address => _prgROM[_prgBankOffset + (address - 0x8000)]); + cpu.MapReadHandler(0xA000, 0xFFFF, address => _prgROM[_prgROM.Length - 0x4000 - 0x2000 + (address - 0xA000)]); + + cpu.MapWriteHandler(0xA000, 0xAFFF, (address, val) => _prgBankOffset = (val & 0xF) * 0x2000); + } + + protected override void GetLatch(uint address, out uint latch, out bool? on) + { + base.GetLatch(address, out latch, out on); + + // For MMC2, only 0xFD8 and 0xFE8 trigger the latch, + // not the whole range like in MMC4 + if (latch == 0 && (address & 0x3) != 0) + { + on = null; + } + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Mapper/MMC2.cs.meta b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/MMC2.cs.meta new file mode 100644 index 0000000..3270f4a --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/MMC2.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 522a51dcf1b92d2498013b4d6f9accb0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Mapper/MMC3.cs b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/MMC3.cs new file mode 100644 index 0000000..ff9bc22 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/MMC3.cs @@ -0,0 +1,182 @@ +using static AxibugEmuOnline.Client.UNES.Cartridge.VRAMMirroringMode; + +namespace AxibugEmuOnline.Client.UNES.Mapper +{ + [MapperDef(4)] + public class MMC3 : BaseMapper + { + // Different PRG RAM write/enable controls + public enum ChipType { MMC3, MMC6 } + public enum CHRBankingMode { TwoFour, FourTwo } + public enum PRGBankingMode { SwitchFix, FixSwitch } + + private readonly Cartridge.VRAMMirroringMode[] _mirroringModes = { Vertical, Horizontal }; + + private readonly ChipType _type; + protected CHRBankingMode _chrBankingMode; + protected PRGBankingMode _prgBankingMode; + + + protected readonly uint[] _chrBankOffsets = new uint[8]; + protected uint[] _prgBankOffsets; + protected readonly uint[] _banks = new uint[8]; + protected uint _currentBank; + + private uint _irqReloadValue; + private uint _irqCounter; + protected bool _irqEnabled; + + private bool _prgRAMEnabled; + + public MMC3(Emulator emulator) : this(emulator, ChipType.MMC3) + { + + } + + public MMC3(Emulator emulator, ChipType chipType) : base(emulator) + { + _type = chipType; + _prgBankOffsets = new uint[] { 0, 0x2000, _lastBankOffset, _lastBankOffset + 0x2000 }; + } + + public override void InitializeMemoryMap(CPU cpu) + { + cpu.MapReadHandler(0x6000, 0x7FFF, address => _prgRAM[address - 0x6000]); + cpu.MapReadHandler(0x8000, 0xFFFF, address => _prgROM[_prgBankOffsets[(address - 0x8000) / 0x2000] + address % 0x2000]); + + cpu.MapWriteHandler(0x6000, 0xFFFF, WriteByte); + } + + public override void InitializeMemoryMap(PPU ppu) + { + ppu.MapReadHandler(0x0000, 0x1FFF, address => _chrROM[_chrBankOffsets[address / 0x400] + address % 0x400]); + ppu.MapWriteHandler(0x0000, 0x1FFF, (address, val) => _chrROM[_chrBankOffsets[address / 0x400] + address % 0x400] = val); + } + + public override void ProcessCycle(int scanLine, int cycle) + { + if (_emulator.PPU.F.RenderingEnabled && cycle == 260 && (0 <= scanLine && scanLine < 240 || scanLine == -1)) + { + if (_irqCounter == 0) + { + _irqCounter = _irqReloadValue; + } + else + { + _irqCounter--; + if (_irqEnabled && _irqCounter == 0) + { + _emulator.CPU.TriggerInterrupt(CPU.InterruptType.IRQ); + } + } + } + } + + protected void WriteByte(uint addr, byte value) + { + bool even = (addr & 0x1) == 0; + + if (addr < 0x8000) + { + if (_prgRAMEnabled) + { + _prgRAM[addr - 0x6000] = value; + } + } + else if (addr < 0xA000) + { + if (even) + { + _currentBank = value & 0x7u; + _prgBankingMode = (PRGBankingMode)((value >> 6) & 0x1); + _chrBankingMode = (CHRBankingMode)((value >> 7) & 0x1); + } + else + { + _banks[_currentBank] = value; + } + + UpdateOffsets(); + } + else if (addr < 0xC000) + { + if (even) + { + _emulator.Cartridge.MirroringMode = _mirroringModes[value & 0x1]; + } + else + { + _prgRAMEnabled = (value & 0xC0) == 0x80; + } + } + else if (addr < 0xE000) + { + if (even) + { + _irqReloadValue = value; + } + else + { + _irqCounter = 0; + } + } + else + { + _irqEnabled = !even; + } + } + + protected void UpdateOffsets() + { + switch (_prgBankingMode) + { + case PRGBankingMode.SwitchFix: + _prgBankOffsets[0] = _banks[6] * 0x2000; + _prgBankOffsets[1] = _banks[7] * 0x2000; + _prgBankOffsets[2] = _lastBankOffset; + _prgBankOffsets[3] = _lastBankOffset + 0x2000; + break; + case PRGBankingMode.FixSwitch: + _prgBankOffsets[0] = _lastBankOffset; + _prgBankOffsets[1] = _banks[7] * 0x2000; + _prgBankOffsets[2] = _banks[6] * 0x2000; + _prgBankOffsets[3] = _lastBankOffset + 0x2000; + break; + } + + switch (_chrBankingMode) + { + case CHRBankingMode.TwoFour: + _chrBankOffsets[0] = _banks[0] & 0xFE; + _chrBankOffsets[1] = _banks[0] | 0x01; + _chrBankOffsets[2] = _banks[1] & 0xFE; + _chrBankOffsets[3] = _banks[1] | 0x01; + _chrBankOffsets[4] = _banks[2]; + _chrBankOffsets[5] = _banks[3]; + _chrBankOffsets[6] = _banks[4]; + _chrBankOffsets[7] = _banks[5]; + break; + case CHRBankingMode.FourTwo: + _chrBankOffsets[0] = _banks[2]; + _chrBankOffsets[1] = _banks[3]; + _chrBankOffsets[2] = _banks[4]; + _chrBankOffsets[3] = _banks[5]; + _chrBankOffsets[4] = _banks[0] & 0xFE; + _chrBankOffsets[5] = _banks[0] | 0x01; + _chrBankOffsets[6] = _banks[1] & 0xFE; + _chrBankOffsets[7] = _banks[1] | 0x01; + break; + } + + for (var i = 0; i < _prgBankOffsets.Length; i++) + { + _prgBankOffsets[i] %= (uint)_prgROM.Length; + } + + for (var i = 0; i < _chrBankOffsets.Length; i++) + { + _chrBankOffsets[i] = (uint) (_chrBankOffsets[i] * 0x400 % _chrROM.Length); + } + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Mapper/MMC3.cs.meta b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/MMC3.cs.meta new file mode 100644 index 0000000..0adfec7 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/MMC3.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 82fb09fbeba58ae458f58e52898fedb1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Mapper/MMC4.cs b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/MMC4.cs new file mode 100644 index 0000000..9d817e1 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/MMC4.cs @@ -0,0 +1,73 @@ +using static AxibugEmuOnline.Client.UNES.Cartridge.VRAMMirroringMode; + +namespace AxibugEmuOnline.Client.UNES.Mapper +{ + [MapperDef(10)] + public class MMC4 : BaseMapper + { + protected readonly Cartridge.VRAMMirroringMode[] _mirroringModes = { Vertical, Horizontal }; + + protected int _prgBankOffset; + protected int[,] _chrBankOffsets = new int[2, 2]; + protected bool[] _latches = new bool[2]; + + public MMC4(Emulator emulator) : base(emulator) + { + } + + public override void InitializeMemoryMap(CPU cpu) + { + cpu.MapReadHandler(0x6000, 0x7FFF, address => _prgRAM[address - 0x6000]); + cpu.MapReadHandler(0x8000, 0xBFFF, address => _prgROM[_prgBankOffset + (address - 0x8000)]); + cpu.MapReadHandler(0xC000, 0xFFFF, address => _prgROM[_prgROM.Length - 0x4000 + (address - 0xC000)]); + + cpu.MapWriteHandler(0x6000, 0x7FFF, (address, val) => _prgRAM[address - 0x6000] = val); + cpu.MapWriteHandler(0xA000, 0xAFFF, (address, val) => _prgBankOffset = (val & 0xF) * 0x4000); + cpu.MapWriteHandler(0xB000, 0xEFFF, (address, val) => + { + var bank = (address - 0xB000) / 0x2000; + var latch = ((address & 0x1FFF) == 0).AsByte(); + _chrBankOffsets[bank, latch] = (val & 0x1F) * 0x1000; + }); + + cpu.MapWriteHandler(0xF000, 0xFFFF, (address, val) => _emulator.Cartridge.MirroringMode = _mirroringModes[val & 0x1]); + } + + public override void InitializeMemoryMap(PPU ppu) + { + ppu.MapReadHandler(0x0000, 0x1FFF, address => + { + var bank = address / 0x1000; + var ret = _chrROM[_chrBankOffsets[bank, _latches[bank].AsByte()] + address % 0x1000]; + if ((address & 0x08) > 0) + { + GetLatch(address, out uint latch, out bool? on); + + if (on != null) + { + _latches[latch] = (bool)on; + } + } + + return ret; + }); + } + + protected virtual void GetLatch(uint address, out uint latch, out bool? on) + { + latch = (address >> 12) & 0x1; + on = null; + + address = (address >> 4) & 0xFF; + + if (address == 0xFE) + { + on = true; + } + else if (address == 0xFD) + { + on = false; + } + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Mapper/MMC4.cs.meta b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/MMC4.cs.meta new file mode 100644 index 0000000..81f2dfe --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/MMC4.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 54d8f341641616d45b20c65ec4a75ff2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Mapper/Mapper094.cs b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/Mapper094.cs new file mode 100644 index 0000000..4baaefe --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/Mapper094.cs @@ -0,0 +1,17 @@ +namespace AxibugEmuOnline.Client.UNES.Mapper +{ + [MapperDef(Id = 94, Description = "Senjou no Ookami")] + public class Mapper094 : UxROM + { + public Mapper094(Emulator emulator) : base(emulator) + { + } + + public override void InitializeMemoryMap(CPU cpu) + { + base.InitializeMemoryMap(cpu); + + cpu.MapWriteHandler(0x8000, 0xFFFF, (address, val) => _bankOffset = (val & 0x1C) << 12); + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Mapper/Mapper094.cs.meta b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/Mapper094.cs.meta new file mode 100644 index 0000000..70a9d00 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/Mapper094.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0abeb567769f715418ae9125bd029206 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Mapper/Mapper155.cs b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/Mapper155.cs new file mode 100644 index 0000000..44fb15b --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/Mapper155.cs @@ -0,0 +1,11 @@ +namespace AxibugEmuOnline.Client.UNES.Mapper +{ + [MapperDef(Id = 155, Description = "MMC1A")] + public class Mapper155 : MMC1 + { + // Mapper for games requiring MMC1A + public Mapper155(Emulator emulator) : base(emulator, ChipType.MMC1A) + { + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Mapper/Mapper155.cs.meta b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/Mapper155.cs.meta new file mode 100644 index 0000000..a775951 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/Mapper155.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dc90c4e04b12a134c884ca3431375aac +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Mapper/Mapper180.cs b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/Mapper180.cs new file mode 100644 index 0000000..e7a81fe --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/Mapper180.cs @@ -0,0 +1,21 @@ +namespace AxibugEmuOnline.Client.UNES.Mapper +{ + // Mapper used strictly for Crazy Climber; logic is slighly different + [MapperDef(Id = 180, Description = "Crazy Climber")] + public class Mapper180 : UxROM + { + public Mapper180(Emulator emulator) : base(emulator) + { + } + + public override void InitializeMemoryMap(CPU cpu) + { + base.InitializeMemoryMap(cpu); + + // $8000-$C000 is fixed to *first* bank + cpu.MapReadHandler(0x8000, 0xBFFF, address => _prgROM[address - 0x8000]); + // $C000-$FFFF is switchable, controlled the same as UxROM + cpu.MapReadHandler(0xC000, 0xFFFF, address => _prgROM[_bankOffset + (address - 0xC000)]); + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Mapper/Mapper180.cs.meta b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/Mapper180.cs.meta new file mode 100644 index 0000000..41282e8 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/Mapper180.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0ed79f8d409c2864bab9bc85848bc36a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Mapper/NROM.cs b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/NROM.cs new file mode 100644 index 0000000..bf7ad3d --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/NROM.cs @@ -0,0 +1,23 @@ +namespace AxibugEmuOnline.Client.UNES.Mapper +{ + [MapperDef(0)] + public class NROM : BaseMapper + { + private readonly byte[] _addressSpace = new byte[0x2000 + 0x8000]; // Space for $2000 VRAM + $8000 PRG + + public NROM(Emulator emulator) : base(emulator) + { + for (var i = 0; i < 0x8000; i++) + { + var offset = _emulator.Cartridge.PRGROMSize == 0x4000 ? i & 0xBFFF : i; + _addressSpace[0x2000 + i] = _prgROM[offset]; + } + } + + public override void InitializeMemoryMap(CPU cpu) + { + cpu.MapReadHandler(0x6000, 0xFFFF, address => _addressSpace[address - 0x6000]); + cpu.MapWriteHandler(0x6000, 0x7FFF, (address, val) => _addressSpace[address - 0x6000] = val); + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Mapper/NROM.cs.meta b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/NROM.cs.meta new file mode 100644 index 0000000..f09b0e2 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/NROM.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7781217265cd36043acd57aa3a049d25 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Mapper/Nina003006.cs b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/Nina003006.cs new file mode 100644 index 0000000..d26761b --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/Nina003006.cs @@ -0,0 +1,32 @@ +namespace AxibugEmuOnline.Client.UNES.Mapper +{ + [MapperDef(79)] + public class Nina003006 : BaseMapper + { + protected int _prgBankOffset; + protected int _chrBankOffset; + + public Nina003006(Emulator emulator) : base(emulator) + { + } + + public override void InitializeMemoryMap(PPU ppu) + { + ppu.MapReadHandler(0x0000, 0x1FFF, address => _chrROM[_chrBankOffset + address]); + } + + public override void InitializeMemoryMap(CPU cpu) + { + cpu.MapReadHandler(0x8000, 0xFFFF, address => _prgROM[_prgBankOffset + (address - 0x8000)]); + + cpu.MapWriteHandler(0x4000, 0x5FFF, (address, val) => + { + if ((address & 0b1110_0001_0000_0000) == 0b0100_0001_0000_0000) + { + _prgBankOffset = ((val >> 4) & 0x3) * 0x8000; + _chrBankOffset = (val & 0x3) * 0x2000; + } + }); + } + } +} \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Mapper/Nina003006.cs.meta b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/Nina003006.cs.meta new file mode 100644 index 0000000..128d6ad --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/Nina003006.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4a935d078b54a6a4b9434e3478863251 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Mapper/UxROM.cs b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/UxROM.cs new file mode 100644 index 0000000..fa24992 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/UxROM.cs @@ -0,0 +1,22 @@ +namespace AxibugEmuOnline.Client.UNES.Mapper +{ + [MapperDef(2)] + public class UxROM : BaseMapper + { + protected int _bankOffset; + + public UxROM(Emulator emulator) : base(emulator) + { + } + + public override void InitializeMemoryMap(CPU cpu) + { + cpu.MapReadHandler(0x6000, 0x7FFF, address => _prgRAM[address - 0x6000]); + cpu.MapReadHandler(0x8000, 0xBFFF, address => _prgROM[_bankOffset + (address - 0x8000)]); + cpu.MapReadHandler(0xC000, 0xFFFF, address => _prgROM[_prgROM.Length - 0x4000 + (address - 0xC000)]); + + cpu.MapWriteHandler(0x6000, 0x7FFF, (address, val) => _prgRAM[address - 0x6000] = val); + cpu.MapWriteHandler(0x8000, 0xFFFF, (address, val) => _bankOffset = (val & 0xF) * 0x4000); + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Mapper/UxROM.cs.meta b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/UxROM.cs.meta new file mode 100644 index 0000000..9b0f9dc --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Mapper/UxROM.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9fa6ddb08aec2014fada61a92af067ad +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Renderer.meta b/AxibugEmuOnline.Client/Assets/Runtime/Renderer.meta new file mode 100644 index 0000000..ede6704 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Renderer.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ff3612d2884e82145a83b869175fe872 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Renderer/IRenderer.cs b/AxibugEmuOnline.Client/Assets/Runtime/Renderer/IRenderer.cs new file mode 100644 index 0000000..de133db --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Renderer/IRenderer.cs @@ -0,0 +1,13 @@ +namespace AxibugEmuOnline.Client.UNES.Renderer +{ + public interface IRenderer + { + string Name { get; } + + void HandleRender(); + + void Init(UNESBehaviour nes); + + void End(); + } +} diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Renderer/IRenderer.cs.meta b/AxibugEmuOnline.Client/Assets/Runtime/Renderer/IRenderer.cs.meta new file mode 100644 index 0000000..5bad6e1 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Renderer/IRenderer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6e02ede35ded0294fb7f13f60387557f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Renderer/UnityRenderer.cs b/AxibugEmuOnline.Client/Assets/Runtime/Renderer/UnityRenderer.cs new file mode 100644 index 0000000..d48923b --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Renderer/UnityRenderer.cs @@ -0,0 +1,71 @@ +using System.Runtime.InteropServices; +using UnityEngine; + +namespace AxibugEmuOnline.Client.UNES.Renderer +{ + public class UnityRenderer : IRenderer + { + public UNESBehaviour UnesBehaviour; + public RenderTexture RenderTexture; + + public string Name => "Unity"; + + private Texture2D _drawTexture; + private Color[] _pixelCache; + + private Texture2D _clearTexture; + + public void Init(UNESBehaviour nes) + { + UnesBehaviour = nes; + RenderTexture = nes.RenderTexture; + _drawTexture = new Texture2D(UNESBehaviour.GameWidth, UNESBehaviour.GameHeight); + _pixelCache = new Color[UNESBehaviour.GameWidth * UNESBehaviour.GameHeight]; + + _clearTexture = new Texture2D(1, 1); + _clearTexture.SetPixel(0, 0, Color.clear); + _clearTexture.Apply(); + } + + public void HandleRender() + { + if (RenderTexture.filterMode != UnesBehaviour.FilterMode) + { + RenderTexture.filterMode = UnesBehaviour.FilterMode; + } + + for (var y = 0; y < UNESBehaviour.GameHeight; y++) + { + for (var x = 0; x < UNESBehaviour.GameWidth; x++) + { + var rawIndex = UNESBehaviour.GameWidth * y + x; + var color = GetColor(UnesBehaviour.RawBitmap[rawIndex]); + var texIndex = UNESBehaviour.GameWidth * (UNESBehaviour.GameHeight - y - 1) + x; + _pixelCache[texIndex] = color; + } + } + + _drawTexture.SetPixels(_pixelCache); + _drawTexture.Apply(); + + Graphics.Blit(_drawTexture, RenderTexture); + } + + public Color GetColor(uint value) + { + var r = 0xFF0000 & value; + r >>= 16; + var b = 0xFF & value; + var g = 0xFF00 & value; + g >>= 8; + var color = new Color(r / 255f, g / 255f, b / 255f); + return color; + } + + public void End() + { + Graphics.Blit(_clearTexture, RenderTexture); + } + } +} + diff --git a/AxibugEmuOnline.Client/Assets/Runtime/Renderer/UnityRenderer.cs.meta b/AxibugEmuOnline.Client/Assets/Runtime/Renderer/UnityRenderer.cs.meta new file mode 100644 index 0000000..13e31a8 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/Renderer/UnityRenderer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1f751adeb00750a43a0d2534a2301da2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Runtime/UNESBehaviour.cs b/AxibugEmuOnline.Client/Assets/Runtime/UNESBehaviour.cs new file mode 100644 index 0000000..ac1fc93 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/UNESBehaviour.cs @@ -0,0 +1,281 @@ +using System; +using System.Diagnostics; +using System.Threading; +using UnityEngine; +using AxibugEmuOnline.Client.UNES.Controller; +using AxibugEmuOnline.Client.UNES.Input; +using AxibugEmuOnline.Client.UNES.Renderer; +using AxibugEmuOnline.Client.ClientCore; +using AxibugEmuOnline.Client.Sample; +using System.Collections.Generic; +using System.Collections; +using System.Linq; + +namespace AxibugEmuOnline.Client.UNES +{ + public class UNESBehaviour : MonoBehaviour + { + [Header("Render")] + public RenderTexture RenderTexture; + public const int GameWidth = 256; + public const int GameHeight = 240; + public FilterMode FilterMode = FilterMode.Point; + public bool LogicThread = true; + + [Header("Input")] + public KeyConfig KeyConfig; + + public BaseInput Input { get; set; } + public IRenderer Renderer { get; set; } + public uint[] RawBitmap { get; set; } = new uint[GameWidth * GameHeight]; + public bool Ready { get; set; } + public bool GameStarted { get; set; } + + private bool _rendererRunning = true; + private IController _controller; + private Emulator _emu; + private bool _suspended; + private Thread _renderThread; + private int _activeSpeed = 1; + + public void Boot(byte[] romData) + { + InitInput(); + InitRenderer(); + BootCartridge(romData); + } + + public void Boot_Obs() + { + InitInput(); + InitRenderer(); + BootCartridge_Obs(); + } + + public void LoadSaveData(byte[] saveData) + { + _emu?.Mapper.LoadSaveData(saveData); + } + + public byte[] GetSaveData() + { + return _emu?.Mapper.GetSaveData(); + } + + Queue _queue = new Queue(); + + + private void BootCartridge(byte[] romData) + { + _emu = new Emulator(romData, _controller); + if (LogicThread) + { + _renderThread = new Thread(() => + { + GameStarted = true; + var s = new Stopwatch(); + var s0 = new Stopwatch(); + while (_rendererRunning) + { + if (_suspended) + { + Thread.Sleep(100); + continue; + } + + s.Restart(); + for (var i = 0; i < 60 && !_suspended; i++) + { + s0.Restart(); + lock (RawBitmap) + { + _emu.PPU.ProcessFrame(); + RawBitmap = _emu.PPU.RawBitmap; + //塞进发送队列 + _queue.Enqueue(_emu.PPU.RawBitmap_paletteIdxCache); + } + + s0.Stop(); + Thread.Sleep(Math.Max((int)(980 / 60.0 - s0.ElapsedMilliseconds), 0) / _activeSpeed); + } + + s.Stop(); + } + }); + + _renderThread.Start(); + } + else + { + GameStarted = true; + } + } + + private void BootCartridge_Obs() + { + if (LogicThread) + { + _renderThread = new Thread(() => + { + GameStarted = true; + var s = new Stopwatch(); + var s0 = new Stopwatch(); + while (_rendererRunning) + { + if (_suspended) + { + Thread.Sleep(100); + continue; + } + + s.Restart(); + for (var i = 0; i < 60 && !_suspended; i++) + { + s0.Restart(); + lock (RawBitmap) + { + RawBitmap = AppAxibugEmuOnline.game.RawBitmap; + } + + s0.Stop(); + Thread.Sleep(Math.Max((int)(980 / 60.0 - s0.ElapsedMilliseconds), 0) / _activeSpeed); + } + + s.Stop(); + } + }); + + _renderThread.Start(); + } + else + { + GameStarted = true; + } + } + + #region Monobehaviour + + public void Awake() + { + } + + public void OnEnable() + { + + } + + public void OnDisable() + { + _rendererRunning = false; + Renderer?.End(); + } + + public void Update() + { + if (!GameStarted) return; + UpdateInput(); + + if (UNESTest.instance.PlayerP1) + { + UpdateRender(); + } + else + { + UpdateRender_Obs(); + } + } + + #endregion + + #region Input + + private void InitInput() + { + _controller = new NesController(this); + Input = new DefaultInput(); + } + + public void UpdateInput() + { + Input.HandlerKeyDown(keyCode => + { + switch (keyCode) + { + case KeyCode.F2: + _suspended = false; + break; + case KeyCode.F3: + _suspended = true; + break; + default: + _controller.PressKey(keyCode); + break; + } + }); + + Input.HandlerKeyUp(keyCode => + { + _controller.ReleaseKey(keyCode); + }); + } + + #endregion + + #region Render + + public void UpdateRender() + { + while (_queue.Count() > 0) + { + //发送 + AppAxibugEmuOnline.game.SendScreen(_queue.Dequeue()); + } + if (!_rendererRunning) return; + if (_suspended) return; + + if (!LogicThread) + { + _emu.PPU.ProcessFrame(); + RawBitmap = _emu.PPU.RawBitmap; + Renderer.HandleRender(); + + } + else + { + lock (RawBitmap) + { + Renderer.HandleRender(); + } + } + } + + public void UpdateRender_Obs() + { + if (!_rendererRunning) return; + if (_suspended) return; + + if (!LogicThread) + { + RawBitmap = AppAxibugEmuOnline.game.RawBitmap; + Renderer.HandleRender(); + } + else + { + lock (RawBitmap) + { + Renderer.HandleRender(); + } + } + } + + private void InitRenderer() + { + Renderer?.End(); + + Renderer = new UnityRenderer(); + Renderer.Init(this); + } + + #endregion + } +} diff --git a/AxibugEmuOnline.Client/Assets/Runtime/UNESBehaviour.cs.meta b/AxibugEmuOnline.Client/Assets/Runtime/UNESBehaviour.cs.meta new file mode 100644 index 0000000..99998ce --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Runtime/UNESBehaviour.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5948479853ec1194497c60babb6bc213 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Scene.meta b/AxibugEmuOnline.Client/Assets/Scene.meta new file mode 100644 index 0000000..a2af5ba --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Scene.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 97287d4650544eb4daa041e4a384a06b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Scene/AxibugEmuOnline.Client.unity b/AxibugEmuOnline.Client/Assets/Scene/AxibugEmuOnline.Client.unity new file mode 100644 index 0000000..40d817e --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Scene/AxibugEmuOnline.Client.unity @@ -0,0 +1,660 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0.44657898, g: 0.4964133, b: 0.5748178, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &537454904 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 537454906} + - component: {fileID: 537454905} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &537454905 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 537454904} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 1 + m_Shape: 0 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &537454906 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 537454904} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &589359925 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 589359928} + - component: {fileID: 589359927} + - component: {fileID: 589359926} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &589359926 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 589359925} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &589359927 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 589359925} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!4 &589359928 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 589359925} + 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: 0} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &622947734 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 622947735} + - component: {fileID: 622947737} + - component: {fileID: 622947736} + m_Layer: 5 + m_Name: Game + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &622947735 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 622947734} + 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: 1361633018} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &622947736 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 622947734} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 0 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 8400000, guid: 6645567e4c11d9447b1aee2406f681c5, type: 2} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!222 &622947737 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 622947734} + m_CullTransparentMesh: 0 +--- !u!1 &1355724343 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1355724346} + - component: {fileID: 1355724345} + - component: {fileID: 1355724344} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &1355724344 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1355724343} + m_Enabled: 1 +--- !u!20 &1355724345 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1355724343} + 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_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + 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: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + 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!4 &1355724346 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1355724343} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1361633014 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1361633018} + - component: {fileID: 1361633017} + - component: {fileID: 1361633016} + - component: {fileID: 1361633015} + m_Layer: 5 + m_Name: UI + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1361633015 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1361633014} + 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 &1361633016 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1361633014} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &1361633017 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1361633014} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &1361633018 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1361633014} + 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: 622947735} + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1 &1434955706 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1434955708} + - component: {fileID: 1434955709} + - component: {fileID: 1434955707} + m_Layer: 0 + m_Name: UNES + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1434955707 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1434955706} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5948479853ec1194497c60babb6bc213, type: 3} + m_Name: + m_EditorClassIdentifier: + RenderTexture: {fileID: 8400000, guid: 6645567e4c11d9447b1aee2406f681c5, type: 2} + FilterMode: 1 + LogicThread: 1 + KeyConfig: + Up: 119 + Down: 115 + Left: 97 + Right: 100 + A: 107 + B: 106 + Start: 98 + Select: 118 + Debug: 112 +--- !u!4 &1434955708 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1434955706} + 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: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1434955709 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1434955706} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8e94e6b3864b9034b89b70aa411a2894, type: 3} + m_Name: + m_EditorClassIdentifier: + RomFile: Mario + PlayerP1: 0 +--- !u!1 &1498586261 +GameObject: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1498586263} + - component: {fileID: 1498586262} + m_Layer: 0 + m_Name: UndoProRecords + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1498586262 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1498586261} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: df9ab10aeab793d47a27405557d0b929, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!4 &1498586263 +Transform: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1498586261} + 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: 0} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/AxibugEmuOnline.Client/Assets/Scene/AxibugEmuOnline.Client.unity.meta b/AxibugEmuOnline.Client/Assets/Scene/AxibugEmuOnline.Client.unity.meta new file mode 100644 index 0000000..fa040cd --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Scene/AxibugEmuOnline.Client.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: eb0c18a619175384d95147898a43054b +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Script.meta b/AxibugEmuOnline.Client/Assets/Script.meta new file mode 100644 index 0000000..6d4a585 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cb2f15a5cdbcfcc498fecad6768c5ec9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Script/AppAxibugEmuOnline.cs b/AxibugEmuOnline.Client/Assets/Script/AppAxibugEmuOnline.cs new file mode 100644 index 0000000..11c7815 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/AppAxibugEmuOnline.cs @@ -0,0 +1,47 @@ +using AxibugEmuOnline.Client.Manager; +using AxibugEmuOnline.Client.Network; +using System; +using UnityEngine; +using static AxibugEmuOnline.Client.Manager.LogManager; + +namespace AxibugEmuOnline.Client.ClientCore +{ + public class AppAxibugEmuOnline + { + public static string TokenStr; + public static long RID = -1; + public static string IP; + public static int Port; + public static LogManager log; + public static NetworkHelper networkHelper; + public static AppLogin login; + public static AppChat chat; + public static UserDataManager user; + public static AppGame game; + + public static void Init() + { + log = new LogManager(); + LogManager.OnLog += OnNoSugarNetLog; + networkHelper = new NetworkHelper(); + login = new AppLogin(); + chat = new AppChat(); + user = new UserDataManager(); + game = new AppGame(); + } + + public static bool Connect(string IP, int port) + { + return networkHelper.Init(IP, port); + } + + public static void Close() + { + AppAxibugEmuOnline.log.Info("停止"); + } + static void OnNoSugarNetLog(int LogLevel, string msg) + { + Debug.Log("[AxibugEmuOnline]:"+msg); + } + } +} \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Script/AppAxibugEmuOnline.cs.meta b/AxibugEmuOnline.Client/Assets/Script/AppAxibugEmuOnline.cs.meta new file mode 100644 index 0000000..308de77 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/AppAxibugEmuOnline.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 37a06c0960dd38d48a93b9642efa11f6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Script/Common.meta b/AxibugEmuOnline.Client/Assets/Script/Common.meta new file mode 100644 index 0000000..5c2638c --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/Common.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 22c07079f08c63e45929f98330d60397 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Script/Common/Helper.cs b/AxibugEmuOnline.Client/Assets/Script/Common/Helper.cs new file mode 100644 index 0000000..f6dfde4 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/Common/Helper.cs @@ -0,0 +1,22 @@ +using System; + +namespace AxibugEmuOnline.Client.Common +{ + public static class Helper + { + public static long GetNowTimeStamp() + { + return GetTimeStamp(DateTime.Now); + } + + ///

+ /// 获取时间戳 + /// + /// + public static long GetTimeStamp(DateTime dt) + { + TimeSpan ts = dt - new DateTime(1970, 1, 1, 0, 0, 0, 0); + return Convert.ToInt64(ts.TotalSeconds); + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Script/Common/Helper.cs.meta b/AxibugEmuOnline.Client/Assets/Script/Common/Helper.cs.meta new file mode 100644 index 0000000..685e18e --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/Common/Helper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ee9183acb0656474293cd9015f34b254 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Script/Common/ProtoBufHelper.cs b/AxibugEmuOnline.Client/Assets/Script/Common/ProtoBufHelper.cs new file mode 100644 index 0000000..4ff0eab --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/Common/ProtoBufHelper.cs @@ -0,0 +1,21 @@ +using Google.Protobuf; +using System; + +namespace AxibugEmuOnline.Client.Common +{ + public static class ProtoBufHelper + { + public static byte[] Serizlize(IMessage msg) + { + return msg.ToByteArray(); + } + public static T DeSerizlize(byte[] bytes) + { + var msgType = typeof(T); + object msg = Activator.CreateInstance(msgType); + ((IMessage)msg).MergeFrom(bytes); + return (T)msg; + } + } + +} diff --git a/AxibugEmuOnline.Client/Assets/Script/Common/ProtoBufHelper.cs.meta b/AxibugEmuOnline.Client/Assets/Script/Common/ProtoBufHelper.cs.meta new file mode 100644 index 0000000..e3edf51 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/Common/ProtoBufHelper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6977f12ad405a314eacc4d9fbe1c631f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Script/Event.meta b/AxibugEmuOnline.Client/Assets/Script/Event.meta new file mode 100644 index 0000000..fdb98cb --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/Event.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7fc94f95c97ea2947aae884b009b742c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Script/Event/EEvent.cs b/AxibugEmuOnline.Client/Assets/Script/Event/EEvent.cs new file mode 100644 index 0000000..3896d91 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/Event/EEvent.cs @@ -0,0 +1,8 @@ +namespace AxibugEmuOnline.Client.Event +{ + public enum EEvent + { + // 添加你自己需要的事件类型 + OnChatMsg + } +} diff --git a/AxibugEmuOnline.Client/Assets/Script/Event/EEvent.cs.meta b/AxibugEmuOnline.Client/Assets/Script/Event/EEvent.cs.meta new file mode 100644 index 0000000..8578a44 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/Event/EEvent.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cb895131261b61748978c83bf9b27920 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Script/Event/EventSystem.cs b/AxibugEmuOnline.Client/Assets/Script/Event/EventSystem.cs new file mode 100644 index 0000000..f729da0 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/Event/EventSystem.cs @@ -0,0 +1,242 @@ +using AxibugEmuOnline.Client.ClientCore; +using System; +using System.Collections.Generic; + +namespace AxibugEmuOnline.Client.Event +{ + public class EventData + { + private static long BaseUid = 0; + private static long GenUid() + { + return (++BaseUid); + } + + /// + /// 唯一id + /// + public long uid { get; private set; } + + /// + /// 回调 + /// + public Delegate callback { get; private set; } + + public EventData(Delegate d) + { + uid = GenUid(); + callback = d; + } + } + + public class EventSystem + { + private static EventSystem instance = new EventSystem(); + public static EventSystem Instance { get { return instance; } } + + private Dictionary> eventDic = new Dictionary>(128); + + private EventSystem() { } + + + #region RegisterEvent + public void RegisterEvent(EEvent evt, Action callback) + { + InterRegisterEvent(evt, callback); + } + + public void RegisterEvent(EEvent evt, Action callback) + { + InterRegisterEvent(evt, callback); + } + + public void RegisterEvent(EEvent evt, Action callback) + { + InterRegisterEvent(evt, callback); + } + + public void RegisterEvent(EEvent evt, Action callback) + { + InterRegisterEvent(evt, callback); + } + + public void RegisterEvent(EEvent evt, Action callback) + { + InterRegisterEvent(evt, callback); + } + + private void InterRegisterEvent(EEvent evt, Delegate callback) + { + if (eventDic.ContainsKey(evt)) + { + if (eventDic[evt].IndexOf(callback) < 0) + { + eventDic[evt].Add(callback); + } + } + else + { + eventDic.Add(evt, new List() { callback }); + } + } + #endregion + + #region UnregisterEvent + + public void UnregisterEvent(EEvent evt, Action callback) + { + Delegate tempDelegate = callback; + InterUnregisterEvent(evt, tempDelegate); + } + + public void UnregisterEvent(EEvent evt, Action callback) + { + Delegate tempDelegate = callback; + InterUnregisterEvent(evt, tempDelegate); + } + + public void UnregisterEvent(EEvent evt, Action callback) + { + Delegate tempDelegate = callback; + InterUnregisterEvent(evt, tempDelegate); + } + + public void UnregisterEvent(EEvent evt, Action callback) + { + Delegate tempDelegate = callback; + InterUnregisterEvent(evt, tempDelegate); + } + + public void UnregisterEvent(EEvent evt, Action callback) + { + Delegate tempDelegate = callback; + InterUnregisterEvent(evt, tempDelegate); + } + + private void InterUnregisterEvent(EEvent evt, Delegate callback) + { + if (eventDic.ContainsKey(evt)) + { + eventDic[evt].Remove(callback); + if (eventDic[evt].Count == 0) eventDic.Remove(evt); + } + } + #endregion + + #region PostEvent + public void PostEvent(EEvent evt, T1 arg1, T2 arg2, T3 arg3, T4 arg4) + { + List eventList = GetEventList(evt); + if (eventList != null) + { + foreach (Delegate callback in eventList) + { + try + { + ((Action)callback)(arg1, arg2, arg3, arg4); + } + catch (Exception e) + { + AppAxibugEmuOnline.log.Error(e.Message); + } + } + } + } + + public void PostEvent(EEvent evt, T1 arg1, T2 arg2, T3 arg3) + { + List eventList = GetEventList(evt); + if (eventList != null) + { + foreach (Delegate callback in eventList) + { + try + { + ((Action)callback)(arg1, arg2, arg3); + } + catch (Exception e) + { + AppAxibugEmuOnline.log.Error(e.Message); + } + } + } + } + + public void PostEvent(EEvent evt, T1 arg1, T2 arg2) + { + List eventList = GetEventList(evt); + if (eventList != null) + { + foreach (Delegate callback in eventList) + { + try + { + ((Action)callback)(arg1, arg2); + } + catch (Exception e) + { + AppAxibugEmuOnline.log.Error(e.Message); + } + } + } + } + + public void PostEvent(EEvent evt, T arg) + { + List eventList = GetEventList(evt); + if (eventList != null) + { + foreach (Delegate callback in eventList) + { + try + { + ((Action)callback)(arg); + } + catch (Exception e) + { + AppAxibugEmuOnline.log.Error(e.Message + ", method name : " + callback.Method); + } + } + } + + } + + public void PostEvent(EEvent evt) + { + List eventList = GetEventList(evt); + if (eventList != null) + { + foreach (Delegate callback in eventList) + { + try + { + ((Action)callback)(); + } + catch (Exception e) + { + AppAxibugEmuOnline.log.Error(e.Message); + } + } + } + } + #endregion + + /// + /// 获取所有事件 + /// + /// + /// + private List GetEventList(EEvent evt) + { + if (eventDic.ContainsKey(evt)) + { + List tempList = eventDic[evt]; + if (null != tempList) + { + return tempList; + } + } + return null; + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Script/Event/EventSystem.cs.meta b/AxibugEmuOnline.Client/Assets/Script/Event/EventSystem.cs.meta new file mode 100644 index 0000000..f540b19 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/Event/EventSystem.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0a03cd2c9855b3647b7b2cd9cb9119ca +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Script/Manager.meta b/AxibugEmuOnline.Client/Assets/Script/Manager.meta new file mode 100644 index 0000000..7cf740f --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/Manager.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 437646a1943eaf34dbe1a56eb38494bb +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Script/Manager/AppChat.cs b/AxibugEmuOnline.Client/Assets/Script/Manager/AppChat.cs new file mode 100644 index 0000000..a1b5333 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/Manager/AppChat.cs @@ -0,0 +1,31 @@ +using AxibugEmuOnline.Client.ClientCore; +using AxibugEmuOnline.Client.Common; +using AxibugEmuOnline.Client.Event; +using AxibugEmuOnline.Client.Network; +using AxibugProtobuf; + +namespace AxibugEmuOnline.Client.Manager +{ + public class AppChat + { + public AppChat() + { + NetMsg.Instance.RegNetMsgEvent((int)CommandID.CmdChatmsg, RecvChatMsg); + } + + public void SendChatMsg(string ChatMsg) + { + Protobuf_ChatMsg msg = new Protobuf_ChatMsg() + { + ChatMsg = ChatMsg, + }; + AppAxibugEmuOnline.networkHelper.SendToServer((int)CommandID.CmdChatmsg, ProtoBufHelper.Serizlize(msg)); + } + + public void RecvChatMsg(byte[] reqData) + { + Protobuf_ChatMsg_RESP msg = ProtoBufHelper.DeSerizlize(reqData); + EventSystem.Instance.PostEvent(EEvent.OnChatMsg, msg.NickName, msg.ChatMsg); + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Script/Manager/AppChat.cs.meta b/AxibugEmuOnline.Client/Assets/Script/Manager/AppChat.cs.meta new file mode 100644 index 0000000..be2baff --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/Manager/AppChat.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f7e9dbada150393488fa949affc5fe3a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Script/Manager/AppGame.cs b/AxibugEmuOnline.Client/Assets/Script/Manager/AppGame.cs new file mode 100644 index 0000000..3258c36 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/Manager/AppGame.cs @@ -0,0 +1,76 @@ +using AxibugEmuOnline.Client.ClientCore; +using AxibugEmuOnline.Client.Common; +using AxibugEmuOnline.Client.Network; +using AxibugProtobuf; +using AxibugEmuOnline.Client.UNES; +using Google.Protobuf; +using System.IO; +using System.IO.Compression; +using System.Linq; + +namespace AxibugEmuOnline.Client.Manager +{ + public class AppGame + { + public AppGame() + { + NetMsg.Instance.RegNetMsgEvent((int)CommandID.CmdScreen, OnScreen); + } + Protobuf_Screnn_Frame _Protobuf_Screnn_Frame = new Protobuf_Screnn_Frame(); + + public uint[] RawBitmap { get; set; } = new uint[UNESBehaviour.GameWidth * UNESBehaviour.GameHeight]; + // TODO: use real chroma/luma decoding + private readonly uint[] _palette = { + 0x7C7C7C, 0x0000FC, 0x0000BC, 0x4428BC, 0x940084, 0xA80020, 0xA81000, 0x881400, + 0x503000, 0x007800, 0x006800, 0x005800, 0x004058, 0x000000, 0x000000, 0x000000, + 0xBCBCBC, 0x0078F8, 0x0058F8, 0x6844FC, 0xD800CC, 0xE40058, 0xF83800, 0xE45C10, + 0xAC7C00, 0x00B800, 0x00A800, 0x00A844, 0x008888, 0x000000, 0x000000, 0x000000, + 0xF8F8F8, 0x3CBCFC, 0x6888FC, 0x9878F8, 0xF878F8, 0xF85898, 0xF87858, 0xFCA044, + 0xF8B800, 0xB8F818, 0x58D854, 0x58F898, 0x00E8D8, 0x787878, 0x000000, 0x000000, + 0xFCFCFC, 0xA4E4FC, 0xB8B8F8, 0xD8B8F8, 0xF8B8F8, 0xF8A4C0, 0xF0D0B0, 0xFCE0A8, + 0xF8D878, 0xD8F878, 0xB8F8B8, 0xB8F8D8, 0x00FCFC, 0xF8D8F8, 0x000000, 0x000000 + }; + public void SendScreen(byte[] ScreenData) + { + byte[] comData = CompressByteArray(ScreenData); + _Protobuf_Screnn_Frame.FrameID = 0; + _Protobuf_Screnn_Frame.RawBitmap = ByteString.CopyFrom(comData); + AppAxibugEmuOnline.networkHelper.SendToServer((int)CommandID.CmdScreen, ProtoBufHelper.Serizlize(_Protobuf_Screnn_Frame)); + } + + public void OnScreen(byte[] reqData) + { + Protobuf_Screnn_Frame msg = ProtoBufHelper.DeSerizlize(reqData); + lock (RawBitmap) + { + byte[] data = DecompressByteArray(msg.RawBitmap.ToArray()); + for (int i = 0; i < data.Length; i++) + { + RawBitmap[i] = _palette[data[i]]; + } + } + } + + public static byte[] CompressByteArray(byte[] bytesToCompress) + { + using (var compressedMemoryStream = new MemoryStream()) + using (var gzipStream = new GZipStream(compressedMemoryStream, CompressionMode.Compress)) + { + gzipStream.Write(bytesToCompress, 0, bytesToCompress.Length); + gzipStream.Close(); + return compressedMemoryStream.ToArray(); + } + } + + public static byte[] DecompressByteArray(byte[] compressedBytes) + { + using (var compressedMemoryStream = new MemoryStream(compressedBytes)) + using (var gzipStream = new GZipStream(compressedMemoryStream, CompressionMode.Decompress)) + using (var resultMemoryStream = new MemoryStream()) + { + gzipStream.CopyTo(resultMemoryStream); + return resultMemoryStream.ToArray(); + } + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Script/Manager/AppGame.cs.meta b/AxibugEmuOnline.Client/Assets/Script/Manager/AppGame.cs.meta new file mode 100644 index 0000000..22078bd --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/Manager/AppGame.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5f7ca4d4fcf6c0f41a6ead44beed31dd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Script/Manager/AppLogin.cs b/AxibugEmuOnline.Client/Assets/Script/Manager/AppLogin.cs new file mode 100644 index 0000000..4185a62 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/Manager/AppLogin.cs @@ -0,0 +1,46 @@ +using AxibugEmuOnline.Client.ClientCore; +using AxibugEmuOnline.Client.Common; +using AxibugEmuOnline.Client.Network; +using AxibugProtobuf; +using System; + +namespace AxibugEmuOnline.Client.Manager +{ + public class AppLogin + { + static string LastLoginGuid = ""; + public AppLogin() + { + NetMsg.Instance.RegNetMsgEvent((int)CommandID.CmdLogin, RecvLoginMsg); + } + + public void Login() + { + AppAxibugEmuOnline.log.Debug("-->Login"); + if(string.IsNullOrEmpty(LastLoginGuid)) + LastLoginGuid = Guid.NewGuid().ToString(); + + AppAxibugEmuOnline.user.userdata.Account = LastLoginGuid; + Protobuf_Login msg = new Protobuf_Login() + { + LoginType = 0, + Account = AppAxibugEmuOnline.user.userdata.Account, + }; + AppAxibugEmuOnline.networkHelper.SendToServer((int)CommandID.CmdLogin, ProtoBufHelper.Serizlize(msg)); + } + + public void RecvLoginMsg(byte[] reqData) + { + Protobuf_Login_RESP msg = ProtoBufHelper.DeSerizlize(reqData); + if (msg.Status == LoginResultStatus.Ok) + { + AppAxibugEmuOnline.log.Info("登录成功"); + AppAxibugEmuOnline.user.InitMainUserData(AppAxibugEmuOnline.user.userdata.Account,msg.UID); + } + else + { + AppAxibugEmuOnline.log.Info("登录失败"); + } + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Script/Manager/AppLogin.cs.meta b/AxibugEmuOnline.Client/Assets/Script/Manager/AppLogin.cs.meta new file mode 100644 index 0000000..aeed966 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/Manager/AppLogin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8bd5c1c74a8a42749809545ab685696e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Script/Manager/LogManager.cs b/AxibugEmuOnline.Client/Assets/Script/Manager/LogManager.cs new file mode 100644 index 0000000..6326887 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/Manager/LogManager.cs @@ -0,0 +1,53 @@ +namespace AxibugEmuOnline.Client.Manager +{ + public class LogManager + { + public enum E_LogType:byte + { + Info = 0, + Debug = 1, + Warning = 2, + Error = 3, + } + /// + /// 日志 + /// + /// + public delegate void OnLogHandler(int debuglv,string msg); + + /// + /// 内部输出 + /// + public static event OnLogHandler OnLog; + + public void Info(string str) + { + Log(E_LogType.Info, str); + } + + public void Debug(string str) + { + Log(E_LogType.Debug, str); + } + + public void Warning(string str) + { + Log(E_LogType.Warning, str); + } + + public void Error(string str) + { + Log(E_LogType.Error, str); + } + + public void Log(E_LogType logtype,string str) + { + OnLog?.Invoke((int)logtype, str); + } + + public void Log(int logtype, string str) + { + OnLog?.Invoke(logtype, str); + } + } +} \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Script/Manager/LogManager.cs.meta b/AxibugEmuOnline.Client/Assets/Script/Manager/LogManager.cs.meta new file mode 100644 index 0000000..c6bb5f5 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/Manager/LogManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dc0abf46c60a4d64381ea53f9ddc89b4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Script/Manager/UserDataManager.cs b/AxibugEmuOnline.Client/Assets/Script/Manager/UserDataManager.cs new file mode 100644 index 0000000..6816739 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/Manager/UserDataManager.cs @@ -0,0 +1,58 @@ +using AxibugEmuOnline.Client.ClientCore; +using AxibugProtobuf; + +namespace AxibugEmuOnline.Client.Manager +{ + public class UserDataBase + { + public long UID { get; set; } + public string Account { get; set; } + } + + public class MainUserDataBase : UserDataBase + { + public bool IsLoggedIn { get; set; } = false; + } + + public class UserDataManager + { + public UserDataManager() + { + //注册重连成功事件,以便后续自动登录 + AppAxibugEmuOnline.networkHelper.OnReConnected += OnReConnected; + } + public MainUserDataBase userdata { get;private set; } = new MainUserDataBase(); + public bool IsLoggedIn => userdata.IsLoggedIn; + + public void InitMainUserData(string UName,long UID) + { + userdata.Account = UName; + userdata.IsLoggedIn = true; + userdata.UID = UID; + //以及其他数据初始化 + //... + } + + /// + /// 登出 + /// + public void LoginOutData() + { + userdata.IsLoggedIn = false; + //以及其他数据清理 + //... + } + + /// + /// 当重连成功 + /// + public void OnReConnected() + { + //如果之前已登录,则重新登录 + if (userdata.IsLoggedIn) + { + AppAxibugEmuOnline.login.Login(); + } + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Script/Manager/UserDataManager.cs.meta b/AxibugEmuOnline.Client/Assets/Script/Manager/UserDataManager.cs.meta new file mode 100644 index 0000000..d925551 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/Manager/UserDataManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: db9b113b5261d564aa86816443a02e25 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Script/Network.meta b/AxibugEmuOnline.Client/Assets/Script/Network.meta new file mode 100644 index 0000000..86d9106 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/Network.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 06db94811d3239e4e820a598c934ddb5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Script/Network/NetMsg.cs b/AxibugEmuOnline.Client/Assets/Script/Network/NetMsg.cs new file mode 100644 index 0000000..c696c9a --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/Network/NetMsg.cs @@ -0,0 +1,98 @@ +using AxibugEmuOnline.Client.ClientCore; +using System; +using System.Collections.Generic; + +namespace AxibugEmuOnline.Client.Network +{ + + public class NetMsg + { + private static NetMsg instance = new NetMsg(); + public static NetMsg Instance { get { return instance; } } + + private Dictionary> netEventDic = new Dictionary>(128); + + private NetMsg() { } + + + #region RegisterMsgEvent + + public void RegNetMsgEvent(int cmd, Action callback) + { + InterRegNetMsgEvent(cmd, callback); + } + + private void InterRegNetMsgEvent(int cmd, Delegate callback) + { + if (netEventDic.ContainsKey(cmd)) + { + if (netEventDic[cmd].IndexOf(callback) < 0) + { + netEventDic[cmd].Add(callback); + } + } + else + { + netEventDic.Add(cmd, new List() { callback }); + } + } + #endregion + + #region UnregisterCMD + + public void UnregisterCMD(int evt, Action callback) + { + Delegate tempDelegate = callback; + InterUnregisterCMD(evt, tempDelegate); + } + + private void InterUnregisterCMD(int cmd, Delegate callback) + { + if (netEventDic.ContainsKey(cmd)) + { + netEventDic[cmd].Remove(callback); + if (netEventDic[cmd].Count == 0) netEventDic.Remove(cmd); + } + } + #endregion + + #region PostEvent + public void PostNetMsgEvent(int cmd, byte[] arg) + { + List eventList = GetNetEventDicList(cmd); + if (eventList != null) + { + foreach (Delegate callback in eventList) + { + try + { + ((Action)callback)(arg); + } + catch (Exception e) + { + AppAxibugEmuOnline.log.Error(e.Message); + } + } + } + } + #endregion + + /// + /// 获取所有事件 + /// + /// + /// + private List GetNetEventDicList(int cmd) + { + if (netEventDic.ContainsKey(cmd)) + { + List tempList = netEventDic[cmd]; + if (null != tempList) + { + return tempList; + } + } + return null; + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Script/Network/NetMsg.cs.meta b/AxibugEmuOnline.Client/Assets/Script/Network/NetMsg.cs.meta new file mode 100644 index 0000000..a288a04 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/Network/NetMsg.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1e196e9f86b5d194a8ac78430e1c9d5c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Script/Network/NetworkHelper.cs b/AxibugEmuOnline.Client/Assets/Script/Network/NetworkHelper.cs new file mode 100644 index 0000000..ab6b305 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/Network/NetworkHelper.cs @@ -0,0 +1,131 @@ +using AxibugEmuOnline.Client.ClientCore; +using HaoYueNet.ClientNetworkNet.Standard2; +using System; +using System.Threading; + +namespace AxibugEmuOnline.Client.Network +{ + /// + /// 继承网络库,以支持网络功能 + /// + public class NetworkHelper : NetworkHelperCore + { + public NetworkHelper() + { + //指定接收服务器数据事件 + OnReceiveData += GetDataCallBack; + //断开连接 + OnClose += OnConnectClose; + OnConnected += NetworkConnected; + //网络库调试信息输出事件,用于打印网络内容 + OnLogOut += NetworkDeBugLog; + } + + public delegate void OnReConnectedHandler(); + /// + /// 重连成功事件 + /// + public event OnReConnectedHandler OnReConnected; + /// + /// 是否自动重连 + /// + public bool bAutoReConnect = false; + /// + /// 重连尝试时间 + /// + const int ReConnectTryTime = 1000; + + public void NetworkConnected(bool IsConnect) + { + NetworkDeBugLog($"NetworkConnected:{IsConnect}"); + if (IsConnect) + { + //从未登录过 + if (!AppAxibugEmuOnline.user.IsLoggedIn) + { + //首次登录 + AppAxibugEmuOnline.login.Login(); + } + } + else + { + //连接失败 + NetworkDeBugLog("连接失败!"); + + + //自动重连开关 + if (bAutoReConnect) + ReConnect(); + } + } + + public void NetworkDeBugLog(string str) + { + //用于Unity内的输出 + //Debug.Log("NetCoreDebug >> "+str); + AppAxibugEmuOnline.log.Info("NetCoreDebug >> " + str); + } + + /// + /// 接受包回调 + /// + /// 协议ID + /// 错误编号 + /// 业务数据 + public void GetDataCallBack(int CMDID, int ERRCODE, byte[] data) + { + //NetworkDeBugLog("收到消息 CMDID =>" + CMDID + " ERRCODE =>" + ERRCODE + " 数据长度=>" + data.Length); + try + { + //抛出网络数据 + NetMsg.Instance.PostNetMsgEvent(CMDID, data); + } + catch (Exception ex) + { + NetworkDeBugLog("逻辑处理错误:" + ex.ToString()); + } + } + + /// + /// 关闭连接 + /// + public void OnConnectClose() + { + NetworkDeBugLog("OnConnectClose"); + + + //自动重连开关 + if (bAutoReConnect) + ReConnect(); + } + + + bool bInReConnecting = false; + /// + /// 自动重连 + /// + void ReConnect() + { + if (bInReConnecting) + return; + bInReConnecting = true; + + bool bflagDone = false; + do + { + //等待时间 + Thread.Sleep(ReConnectTryTime); + AppAxibugEmuOnline.log.Info($"尝试自动重连{LastConnectIP}:{LastConnectPort}……"); + //第一步 + if (Init(LastConnectIP, LastConnectPort)) + { + AppAxibugEmuOnline.log.Info($"自动重连成功!"); + bflagDone = true; + AppAxibugEmuOnline.log.Info($"触发重连后的自动逻辑!"); + OnReConnected?.Invoke(); + } + } while (!bflagDone); + bInReConnecting = false; + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Script/Network/NetworkHelper.cs.meta b/AxibugEmuOnline.Client/Assets/Script/Network/NetworkHelper.cs.meta new file mode 100644 index 0000000..4e948d9 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/Network/NetworkHelper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ffc8e86b25d7476429d566e86268e99f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Script/Protobuf.meta b/AxibugEmuOnline.Client/Assets/Script/Protobuf.meta new file mode 100644 index 0000000..c612430 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/Protobuf.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 982424ed2d905a74e94341fa6547e304 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Script/Protobuf/ProtobufAxibugEmuOnline.cs b/AxibugEmuOnline.Client/Assets/Script/Protobuf/ProtobufAxibugEmuOnline.cs new file mode 100644 index 0000000..b23e13b --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/Protobuf/ProtobufAxibugEmuOnline.cs @@ -0,0 +1,1398 @@ +// +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: protobuf_AxibugEmuOnline.proto +// +#pragma warning disable 1591, 0612, 3021 +#region Designer generated code + +using pb = global::Google.Protobuf; +using pbc = global::Google.Protobuf.Collections; +using pbr = global::Google.Protobuf.Reflection; +using scg = global::System.Collections.Generic; +namespace AxibugProtobuf { + + /// Holder for reflection information generated from protobuf_AxibugEmuOnline.proto + public static partial class ProtobufAxibugEmuOnlineReflection { + + #region Descriptor + /// File descriptor for protobuf_AxibugEmuOnline.proto + public static pbr::FileDescriptor Descriptor { + get { return descriptor; } + } + private static pbr::FileDescriptor descriptor; + + static ProtobufAxibugEmuOnlineReflection() { + byte[] descriptorData = global::System.Convert.FromBase64String( + string.Concat( + "Ch5wcm90b2J1Zl9BeGlidWdFbXVPbmxpbmUucHJvdG8SDkF4aWJ1Z1Byb3Rv", + "YnVmIiMKEFByb3RvYnVmX0NoYXRNc2cSDwoHQ2hhdE1zZxgBIAEoCSJIChVQ", + "cm90b2J1Zl9DaGF0TXNnX1JFU1ASEAoITmlja05hbWUYASABKAkSDwoHQ2hh", + "dE1zZxgCIAEoCRIMCgREYXRlGAMgASgDIpEBCg5Qcm90b2J1Zl9Mb2dpbhIs", + "Cglsb2dpblR5cGUYASABKA4yGS5BeGlidWdQcm90b2J1Zi5Mb2dpblR5cGUS", + "LgoKZGV2aWNlVHlwZRgCIAEoDjIaLkF4aWJ1Z1Byb3RvYnVmLkRldmljZVR5", + "cGUSDwoHQWNjb3VudBgDIAEoCRIQCghQYXNzd29yZBgEIAEoCSKMAQoTUHJv", + "dG9idWZfTG9naW5fUkVTUBINCgVUb2tlbhgBIAEoCRIVCg1MYXN0TG9naW5E", + "YXRlGAIgASgJEg8KB1JlZ0RhdGUYAyABKAkSMQoGU3RhdHVzGAQgASgOMiEu", + "QXhpYnVnUHJvdG9idWYuTG9naW5SZXN1bHRTdGF0dXMSCwoDVUlEGAUgASgD", + "IjsKFVByb3RvYnVmX1NjcmVubl9GcmFtZRIPCgdGcmFtZUlEGAEgASgFEhEK", + "CVJhd0JpdG1hcBgCIAEoDCpOCglDb21tYW5kSUQSDgoKQ01EX0RFRkFVTBAA", + "Eg4KCUNNRF9MT0dJThDRDxIQCgtDTURfQ0hBVE1TRxChHxIPCgpDTURfU2Ny", + "ZWVuEIknKisKCUVycm9yQ29kZRIQCgxFUlJPUl9ERUZBVUwQABIMCghFUlJP", + "Ul9PSxABKhwKCUxvZ2luVHlwZRIPCgtCYXNlRGVmYXVsdBAAKksKCkRldmlj", + "ZVR5cGUSFgoSRGV2aWNlVHlwZV9EZWZhdWx0EAASBgoCUEMQARILCgdBbmRy", + "b2lkEAISBwoDSU9TEAMSBwoDUFNWEAQqTgoRTG9naW5SZXN1bHRTdGF0dXMS", + "IQodTG9naW5SZXN1bHRTdGF0dXNfQmFzZURlZmF1bHQQABIGCgJPSxABEg4K", + "CkFjY291bnRFcnIQAkICSAFiBnByb3RvMw==")); + descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, + new pbr::FileDescriptor[] { }, + new pbr::GeneratedClrTypeInfo(new[] {typeof(global::AxibugProtobuf.CommandID), typeof(global::AxibugProtobuf.ErrorCode), typeof(global::AxibugProtobuf.LoginType), typeof(global::AxibugProtobuf.DeviceType), typeof(global::AxibugProtobuf.LoginResultStatus), }, null, new pbr::GeneratedClrTypeInfo[] { + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_ChatMsg), global::AxibugProtobuf.Protobuf_ChatMsg.Parser, new[]{ "ChatMsg" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_ChatMsg_RESP), global::AxibugProtobuf.Protobuf_ChatMsg_RESP.Parser, new[]{ "NickName", "ChatMsg", "Date" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_Login), global::AxibugProtobuf.Protobuf_Login.Parser, new[]{ "LoginType", "DeviceType", "Account", "Password" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_Login_RESP), global::AxibugProtobuf.Protobuf_Login_RESP.Parser, new[]{ "Token", "LastLoginDate", "RegDate", "Status", "UID" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_Screnn_Frame), global::AxibugProtobuf.Protobuf_Screnn_Frame.Parser, new[]{ "FrameID", "RawBitmap" }, null, null, null, null) + })); + } + #endregion + + } + #region Enums + public enum CommandID { + /// + ///缺省不使用 + /// + [pbr::OriginalName("CMD_DEFAUL")] CmdDefaul = 0, + /// + ///自动登录上行 | 下行 对应 Protobuf_Login | Protobuf_Login_RESP + /// + [pbr::OriginalName("CMD_LOGIN")] CmdLogin = 2001, + /// + ///广播信息上行 | 下行 对应 Protobuf_ChatMsg | Protobuf_ChatMsg_RESP + /// + [pbr::OriginalName("CMD_CHATMSG")] CmdChatmsg = 4001, + /// + ///画面同步 | 同步广播 对应 Protobuf_Screnn_Frame + /// + [pbr::OriginalName("CMD_Screen")] CmdScreen = 5001, + } + + public enum ErrorCode { + /// + ///缺省不使用 + /// + [pbr::OriginalName("ERROR_DEFAUL")] ErrorDefaul = 0, + /// + ///成功 + /// + [pbr::OriginalName("ERROR_OK")] ErrorOk = 1, + } + + public enum LoginType { + /// + ///缺省不使用 + /// + [pbr::OriginalName("BaseDefault")] BaseDefault = 0, + } + + public enum DeviceType { + /// + ///缺省不使用 + /// + [pbr::OriginalName("DeviceType_Default")] Default = 0, + [pbr::OriginalName("PC")] Pc = 1, + [pbr::OriginalName("Android")] Android = 2, + [pbr::OriginalName("IOS")] Ios = 3, + [pbr::OriginalName("PSV")] Psv = 4, + } + + public enum LoginResultStatus { + /// + ///缺省不使用 + /// + [pbr::OriginalName("LoginResultStatus_BaseDefault")] BaseDefault = 0, + [pbr::OriginalName("OK")] Ok = 1, + [pbr::OriginalName("AccountErr")] AccountErr = 2, + } + + #endregion + + #region Messages + /// + ///聊天 上行 + /// + public sealed partial class Protobuf_ChatMsg : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_ChatMsg()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufAxibugEmuOnlineReflection.Descriptor.MessageTypes[0]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_ChatMsg() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_ChatMsg(Protobuf_ChatMsg other) : this() { + chatMsg_ = other.chatMsg_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_ChatMsg Clone() { + return new Protobuf_ChatMsg(this); + } + + /// Field number for the "ChatMsg" field. + public const int ChatMsgFieldNumber = 1; + private string chatMsg_ = ""; + /// + ///消息 + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public string ChatMsg { + get { return chatMsg_; } + set { + chatMsg_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Protobuf_ChatMsg); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Protobuf_ChatMsg other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (ChatMsg != other.ChatMsg) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (ChatMsg.Length != 0) hash ^= ChatMsg.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (ChatMsg.Length != 0) { + output.WriteRawTag(10); + output.WriteString(ChatMsg); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (ChatMsg.Length != 0) { + output.WriteRawTag(10); + output.WriteString(ChatMsg); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (ChatMsg.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(ChatMsg); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Protobuf_ChatMsg other) { + if (other == null) { + return; + } + if (other.ChatMsg.Length != 0) { + ChatMsg = other.ChatMsg; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + ChatMsg = input.ReadString(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: { + ChatMsg = input.ReadString(); + break; + } + } + } + } + #endif + + } + + /// + ///聊天 下行 + /// + public sealed partial class Protobuf_ChatMsg_RESP : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_ChatMsg_RESP()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufAxibugEmuOnlineReflection.Descriptor.MessageTypes[1]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_ChatMsg_RESP() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_ChatMsg_RESP(Protobuf_ChatMsg_RESP other) : this() { + nickName_ = other.nickName_; + chatMsg_ = other.chatMsg_; + date_ = other.date_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_ChatMsg_RESP Clone() { + return new Protobuf_ChatMsg_RESP(this); + } + + /// Field number for the "NickName" field. + public const int NickNameFieldNumber = 1; + private string nickName_ = ""; + /// + ///昵称 + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public string NickName { + get { return nickName_; } + set { + nickName_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "ChatMsg" field. + public const int ChatMsgFieldNumber = 2; + private string chatMsg_ = ""; + /// + ///消息 + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public string ChatMsg { + get { return chatMsg_; } + set { + chatMsg_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "Date" field. + public const int DateFieldNumber = 3; + private long date_; + /// + ///时间 + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public long Date { + get { return date_; } + set { + date_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Protobuf_ChatMsg_RESP); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Protobuf_ChatMsg_RESP other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (NickName != other.NickName) return false; + if (ChatMsg != other.ChatMsg) return false; + if (Date != other.Date) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (NickName.Length != 0) hash ^= NickName.GetHashCode(); + if (ChatMsg.Length != 0) hash ^= ChatMsg.GetHashCode(); + if (Date != 0L) hash ^= Date.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (NickName.Length != 0) { + output.WriteRawTag(10); + output.WriteString(NickName); + } + if (ChatMsg.Length != 0) { + output.WriteRawTag(18); + output.WriteString(ChatMsg); + } + if (Date != 0L) { + output.WriteRawTag(24); + output.WriteInt64(Date); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (NickName.Length != 0) { + output.WriteRawTag(10); + output.WriteString(NickName); + } + if (ChatMsg.Length != 0) { + output.WriteRawTag(18); + output.WriteString(ChatMsg); + } + if (Date != 0L) { + output.WriteRawTag(24); + output.WriteInt64(Date); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (NickName.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(NickName); + } + if (ChatMsg.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(ChatMsg); + } + if (Date != 0L) { + size += 1 + pb::CodedOutputStream.ComputeInt64Size(Date); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Protobuf_ChatMsg_RESP other) { + if (other == null) { + return; + } + if (other.NickName.Length != 0) { + NickName = other.NickName; + } + if (other.ChatMsg.Length != 0) { + ChatMsg = other.ChatMsg; + } + if (other.Date != 0L) { + Date = other.Date; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + NickName = input.ReadString(); + break; + } + case 18: { + ChatMsg = input.ReadString(); + break; + } + case 24: { + Date = input.ReadInt64(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: { + NickName = input.ReadString(); + break; + } + case 18: { + ChatMsg = input.ReadString(); + break; + } + case 24: { + Date = input.ReadInt64(); + break; + } + } + } + } + #endif + + } + + /// + ///登录数据上行 + /// + public sealed partial class Protobuf_Login : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_Login()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufAxibugEmuOnlineReflection.Descriptor.MessageTypes[2]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_Login() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_Login(Protobuf_Login other) : this() { + loginType_ = other.loginType_; + deviceType_ = other.deviceType_; + account_ = other.account_; + password_ = other.password_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_Login Clone() { + return new Protobuf_Login(this); + } + + /// Field number for the "loginType" field. + public const int LoginTypeFieldNumber = 1; + private global::AxibugProtobuf.LoginType loginType_ = global::AxibugProtobuf.LoginType.BaseDefault; + /// + ///登录操作类型 [0]皓月通行证 [3] 皓月BF3 [4] 皓月BF4 + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public global::AxibugProtobuf.LoginType LoginType { + get { return loginType_; } + set { + loginType_ = value; + } + } + + /// Field number for the "deviceType" field. + public const int DeviceTypeFieldNumber = 2; + private global::AxibugProtobuf.DeviceType deviceType_ = global::AxibugProtobuf.DeviceType.Default; + /// + ///设备类型 [0]PC [1]AndroidPad预留 [3]IPad预留 + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public global::AxibugProtobuf.DeviceType DeviceType { + get { return deviceType_; } + set { + deviceType_ = value; + } + } + + /// Field number for the "Account" field. + public const int AccountFieldNumber = 3; + private string account_ = ""; + /// + ///用户名 + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public string Account { + get { return account_; } + set { + account_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "Password" field. + public const int PasswordFieldNumber = 4; + private string password_ = ""; + /// + ///密码 + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public string Password { + get { return password_; } + set { + password_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Protobuf_Login); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Protobuf_Login other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (LoginType != other.LoginType) return false; + if (DeviceType != other.DeviceType) return false; + if (Account != other.Account) return false; + if (Password != other.Password) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (LoginType != global::AxibugProtobuf.LoginType.BaseDefault) hash ^= LoginType.GetHashCode(); + if (DeviceType != global::AxibugProtobuf.DeviceType.Default) hash ^= DeviceType.GetHashCode(); + if (Account.Length != 0) hash ^= Account.GetHashCode(); + if (Password.Length != 0) hash ^= Password.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (LoginType != global::AxibugProtobuf.LoginType.BaseDefault) { + output.WriteRawTag(8); + output.WriteEnum((int) LoginType); + } + if (DeviceType != global::AxibugProtobuf.DeviceType.Default) { + output.WriteRawTag(16); + output.WriteEnum((int) DeviceType); + } + if (Account.Length != 0) { + output.WriteRawTag(26); + output.WriteString(Account); + } + if (Password.Length != 0) { + output.WriteRawTag(34); + output.WriteString(Password); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (LoginType != global::AxibugProtobuf.LoginType.BaseDefault) { + output.WriteRawTag(8); + output.WriteEnum((int) LoginType); + } + if (DeviceType != global::AxibugProtobuf.DeviceType.Default) { + output.WriteRawTag(16); + output.WriteEnum((int) DeviceType); + } + if (Account.Length != 0) { + output.WriteRawTag(26); + output.WriteString(Account); + } + if (Password.Length != 0) { + output.WriteRawTag(34); + output.WriteString(Password); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (LoginType != global::AxibugProtobuf.LoginType.BaseDefault) { + size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) LoginType); + } + if (DeviceType != global::AxibugProtobuf.DeviceType.Default) { + size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) DeviceType); + } + if (Account.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Account); + } + if (Password.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Password); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Protobuf_Login other) { + if (other == null) { + return; + } + if (other.LoginType != global::AxibugProtobuf.LoginType.BaseDefault) { + LoginType = other.LoginType; + } + if (other.DeviceType != global::AxibugProtobuf.DeviceType.Default) { + DeviceType = other.DeviceType; + } + if (other.Account.Length != 0) { + Account = other.Account; + } + if (other.Password.Length != 0) { + Password = other.Password; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + LoginType = (global::AxibugProtobuf.LoginType) input.ReadEnum(); + break; + } + case 16: { + DeviceType = (global::AxibugProtobuf.DeviceType) input.ReadEnum(); + break; + } + case 26: { + Account = input.ReadString(); + break; + } + case 34: { + Password = input.ReadString(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: { + LoginType = (global::AxibugProtobuf.LoginType) input.ReadEnum(); + break; + } + case 16: { + DeviceType = (global::AxibugProtobuf.DeviceType) input.ReadEnum(); + break; + } + case 26: { + Account = input.ReadString(); + break; + } + case 34: { + Password = input.ReadString(); + break; + } + } + } + } + #endif + + } + + /// + ///登录数据下行 + /// + public sealed partial class Protobuf_Login_RESP : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_Login_RESP()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufAxibugEmuOnlineReflection.Descriptor.MessageTypes[3]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_Login_RESP() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_Login_RESP(Protobuf_Login_RESP other) : this() { + token_ = other.token_; + lastLoginDate_ = other.lastLoginDate_; + regDate_ = other.regDate_; + status_ = other.status_; + uID_ = other.uID_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_Login_RESP Clone() { + return new Protobuf_Login_RESP(this); + } + + /// Field number for the "Token" field. + public const int TokenFieldNumber = 1; + private string token_ = ""; + /// + ///登录凭据 (本次登录之后,所有业务请求凭据,需要存储在内存中) + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public string Token { + get { return token_; } + set { + token_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "LastLoginDate" field. + public const int LastLoginDateFieldNumber = 2; + private string lastLoginDate_ = ""; + /// + ///上次登录时间(只用于呈现的字符串,若界面需求需要) + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public string LastLoginDate { + get { return lastLoginDate_; } + set { + lastLoginDate_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "RegDate" field. + public const int RegDateFieldNumber = 3; + private string regDate_ = ""; + /// + ///注册时间(只用于呈现的字符串,若界面需求需要) + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public string RegDate { + get { return regDate_; } + set { + regDate_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "Status" field. + public const int StatusFieldNumber = 4; + private global::AxibugProtobuf.LoginResultStatus status_ = global::AxibugProtobuf.LoginResultStatus.BaseDefault; + /// + ///账号状态 (预留) [1]正常[0]被禁封 + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public global::AxibugProtobuf.LoginResultStatus Status { + get { return status_; } + set { + status_ = value; + } + } + + /// Field number for the "UID" field. + public const int UIDFieldNumber = 5; + private long uID_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public long UID { + get { return uID_; } + set { + uID_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Protobuf_Login_RESP); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Protobuf_Login_RESP other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (Token != other.Token) return false; + if (LastLoginDate != other.LastLoginDate) return false; + if (RegDate != other.RegDate) return false; + if (Status != other.Status) return false; + if (UID != other.UID) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (Token.Length != 0) hash ^= Token.GetHashCode(); + if (LastLoginDate.Length != 0) hash ^= LastLoginDate.GetHashCode(); + if (RegDate.Length != 0) hash ^= RegDate.GetHashCode(); + if (Status != global::AxibugProtobuf.LoginResultStatus.BaseDefault) hash ^= Status.GetHashCode(); + if (UID != 0L) hash ^= UID.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (Token.Length != 0) { + output.WriteRawTag(10); + output.WriteString(Token); + } + if (LastLoginDate.Length != 0) { + output.WriteRawTag(18); + output.WriteString(LastLoginDate); + } + if (RegDate.Length != 0) { + output.WriteRawTag(26); + output.WriteString(RegDate); + } + if (Status != global::AxibugProtobuf.LoginResultStatus.BaseDefault) { + output.WriteRawTag(32); + output.WriteEnum((int) Status); + } + if (UID != 0L) { + output.WriteRawTag(40); + output.WriteInt64(UID); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (Token.Length != 0) { + output.WriteRawTag(10); + output.WriteString(Token); + } + if (LastLoginDate.Length != 0) { + output.WriteRawTag(18); + output.WriteString(LastLoginDate); + } + if (RegDate.Length != 0) { + output.WriteRawTag(26); + output.WriteString(RegDate); + } + if (Status != global::AxibugProtobuf.LoginResultStatus.BaseDefault) { + output.WriteRawTag(32); + output.WriteEnum((int) Status); + } + if (UID != 0L) { + output.WriteRawTag(40); + output.WriteInt64(UID); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (Token.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Token); + } + if (LastLoginDate.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(LastLoginDate); + } + if (RegDate.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(RegDate); + } + if (Status != global::AxibugProtobuf.LoginResultStatus.BaseDefault) { + size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Status); + } + if (UID != 0L) { + size += 1 + pb::CodedOutputStream.ComputeInt64Size(UID); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Protobuf_Login_RESP other) { + if (other == null) { + return; + } + if (other.Token.Length != 0) { + Token = other.Token; + } + if (other.LastLoginDate.Length != 0) { + LastLoginDate = other.LastLoginDate; + } + if (other.RegDate.Length != 0) { + RegDate = other.RegDate; + } + if (other.Status != global::AxibugProtobuf.LoginResultStatus.BaseDefault) { + Status = other.Status; + } + if (other.UID != 0L) { + UID = other.UID; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + Token = input.ReadString(); + break; + } + case 18: { + LastLoginDate = input.ReadString(); + break; + } + case 26: { + RegDate = input.ReadString(); + break; + } + case 32: { + Status = (global::AxibugProtobuf.LoginResultStatus) input.ReadEnum(); + break; + } + case 40: { + UID = input.ReadInt64(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: { + Token = input.ReadString(); + break; + } + case 18: { + LastLoginDate = input.ReadString(); + break; + } + case 26: { + RegDate = input.ReadString(); + break; + } + case 32: { + Status = (global::AxibugProtobuf.LoginResultStatus) input.ReadEnum(); + break; + } + case 40: { + UID = input.ReadInt64(); + break; + } + } + } + } + #endif + + } + + public sealed partial class Protobuf_Screnn_Frame : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_Screnn_Frame()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufAxibugEmuOnlineReflection.Descriptor.MessageTypes[4]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_Screnn_Frame() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_Screnn_Frame(Protobuf_Screnn_Frame other) : this() { + frameID_ = other.frameID_; + rawBitmap_ = other.rawBitmap_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_Screnn_Frame Clone() { + return new Protobuf_Screnn_Frame(this); + } + + /// Field number for the "FrameID" field. + public const int FrameIDFieldNumber = 1; + private int frameID_; + /// + ///帧编号 + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int FrameID { + get { return frameID_; } + set { + frameID_ = value; + } + } + + /// Field number for the "RawBitmap" field. + public const int RawBitmapFieldNumber = 2; + private pb::ByteString rawBitmap_ = pb::ByteString.Empty; + /// + ///渲染层画面 + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public pb::ByteString RawBitmap { + get { return rawBitmap_; } + set { + rawBitmap_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Protobuf_Screnn_Frame); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Protobuf_Screnn_Frame other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (FrameID != other.FrameID) return false; + if (RawBitmap != other.RawBitmap) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (FrameID != 0) hash ^= FrameID.GetHashCode(); + if (RawBitmap.Length != 0) hash ^= RawBitmap.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (FrameID != 0) { + output.WriteRawTag(8); + output.WriteInt32(FrameID); + } + if (RawBitmap.Length != 0) { + output.WriteRawTag(18); + output.WriteBytes(RawBitmap); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (FrameID != 0) { + output.WriteRawTag(8); + output.WriteInt32(FrameID); + } + if (RawBitmap.Length != 0) { + output.WriteRawTag(18); + output.WriteBytes(RawBitmap); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (FrameID != 0) { + size += 1 + pb::CodedOutputStream.ComputeInt32Size(FrameID); + } + if (RawBitmap.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeBytesSize(RawBitmap); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Protobuf_Screnn_Frame other) { + if (other == null) { + return; + } + if (other.FrameID != 0) { + FrameID = other.FrameID; + } + if (other.RawBitmap.Length != 0) { + RawBitmap = other.RawBitmap; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + FrameID = input.ReadInt32(); + break; + } + case 18: { + RawBitmap = input.ReadBytes(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: { + FrameID = input.ReadInt32(); + break; + } + case 18: { + RawBitmap = input.ReadBytes(); + break; + } + } + } + } + #endif + + } + + #endregion + +} + +#endregion Designer generated code diff --git a/AxibugEmuOnline.Client/Assets/Script/Protobuf/ProtobufAxibugEmuOnline.cs.meta b/AxibugEmuOnline.Client/Assets/Script/Protobuf/ProtobufAxibugEmuOnline.cs.meta new file mode 100644 index 0000000..fd85ae8 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/Protobuf/ProtobufAxibugEmuOnline.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 49b94fc04c9e78343a56ad63eda4db56 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Script/UNESTest.cs b/AxibugEmuOnline.Client/Assets/Script/UNESTest.cs new file mode 100644 index 0000000..1776792 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/UNESTest.cs @@ -0,0 +1,45 @@ +using UnityEngine; +using AxibugEmuOnline.Client.UNES; +using AxibugEmuOnline.Client.ClientCore; + +namespace AxibugEmuOnline.Client.Sample +{ + public class UNESTest : MonoBehaviour + { + public string RomFile; + + public bool PlayerP1; + + public static UNESTest instance; + public UNESBehaviour UNES { get; set; } + + public void Awake() + { + Screen.SetResolution(640, 480,false); + + instance = this; + AppAxibugEmuOnline.Init(); + AppAxibugEmuOnline.Connect("127.0.0.1", 10492); + } + + public void Start() + { + UNES = GetComponent(); + if (PlayerP1) + { + var data = Resources.Load(RomFile).bytes; + UNES.Boot(data); + } + else + { + UNES.Boot_Obs(); + } + } + + public void OnDisable() + { + AppAxibugEmuOnline.Close(); + } + + } +} diff --git a/AxibugEmuOnline.Client/Assets/Script/UNESTest.cs.meta b/AxibugEmuOnline.Client/Assets/Script/UNESTest.cs.meta new file mode 100644 index 0000000..5c34fdc --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/UNESTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8e94e6b3864b9034b89b70aa411a2894 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/AxibugEmuOnline.Client.sln b/AxibugEmuOnline.Client/AxibugEmuOnline.Client.sln new file mode 100644 index 0000000..84d1c1e --- /dev/null +++ b/AxibugEmuOnline.Client/AxibugEmuOnline.Client.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AxibugEmuOnline.Client.UNES", "AxibugEmuOnline.Client.UNES.csproj", "{02571108-3006-F6EF-03C9-9DCFC8015A55}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {02571108-3006-F6EF-03C9-9DCFC8015A55}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {02571108-3006-F6EF-03C9-9DCFC8015A55}.Debug|Any CPU.Build.0 = Debug|Any CPU + {02571108-3006-F6EF-03C9-9DCFC8015A55}.Release|Any CPU.ActiveCfg = Release|Any CPU + {02571108-3006-F6EF-03C9-9DCFC8015A55}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/README.md b/README.md index 8c754d4..e8f1112 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,60 @@ # AxibugEmuOnline -用于游戏模拟器同步的联机.Net实现 \ No newline at end of file +用于游戏模拟器同步的联机.Net实现 + + +AxibugEmuOnline.Server 是服务端 .Net 8 + +AxibugEmuOnline.Client 是客户端 Unity + + + + +##就是一种联机方式的探索 + +验证了一下 把模拟器帧缓存 走公网同步,实现联机的另一种方式 + +云游戏,但是不是视频流的方式,是同步模拟器帧缓存,+GZIP压缩。NES这种低分辨率+颜色查找表的方式。画面传输只需要9k/s + + +##TODO: + +1.目前只同步了画面,操作CMD同步还没做。 + +2.以及多用户自行创建房间,和玩家选择要加入的房间列表还没做。 + + + +##简述客户端逻辑: + +Player1主机才跑模拟器实例,然后Player1 会把渲染层的数据上报服务器。服务器广播。 + +Player2即二号手柄玩家,不运行模拟器实例,画面渲染来自网络同步的数据。 + +*之前试过直接上报渲染层,但是这样会有6w左右大小的uint[] + +*初步优化之后,采用只上报每一个像素对应颜色查找表的下标,这样就是一个byte[]了 + +*PorotoBuf 传输使用的是bytes,但是Porotbuff只会对数组里每一个byte进行位压缩,整个byte[]不压缩。于是C#先GZIP压缩之后,在扔给protobuf。对面再解压。超级马里奥最复杂的画面情况是9k每秒的样子/。 + + + +##引用 + + +###本项目使用,我自构建的HaoYueNet高性能网络库作为基础而开发 + +[HaoYueNet-Github](https://github.com/Sin365/HaoYueNet "HaoYueNet-Github") + +[HaoYueNet-自建Git站点](http://git.axibug.com/sin365/HaoYueNet "HaoYueNet-自建Git站点") + +###模拟器内核 + +模拟器内核采用 Emulator.NES https://github.com/Xyene/Emulator.NES + +这是一个单机的 NES模拟器C#实现,我在此基础上做修改 + +做帧缓,颜色查找缓存,存同步,加上网络库,实现服务端。达到如上效果。 + + +