From e8e36b83bd042eea54162a98babba7f4fa43f666 Mon Sep 17 00:00:00 2001 From: PopSlime Date: Fri, 30 Sep 2022 17:32:21 +0800 Subject: [PATCH] Add project files. --- .editorconfig | 7 + .gitignore | 9 + .vsconfig | 6 + Assets/Animations.meta | 9 + Assets/Animations/Canvas.controller | Bin 0 -> 14668 bytes Assets/Animations/Canvas.controller.meta | 8 + Assets/Animations/IMain.anim | Bin 0 -> 18864 bytes Assets/Animations/IMain.anim.meta | 8 + Assets/Animations/IQuit.anim | Bin 0 -> 15116 bytes Assets/Animations/IQuit.anim.meta | 8 + Assets/Animations/ISettings.anim | Bin 0 -> 15420 bytes Assets/Animations/ISettings.anim.meta | 8 + Assets/Animations/IStartup.anim | Bin 0 -> 15392 bytes Assets/Animations/IStartup.anim.meta | 8 + Assets/Animations/TMain_Settings.anim | Bin 0 -> 15748 bytes Assets/Animations/TMain_Settings.anim.meta | 8 + Assets/Animations/TQuit_.anim | Bin 0 -> 15116 bytes Assets/Animations/TQuit_.anim.meta | 8 + Assets/Animations/TSettings_Main.anim | Bin 0 -> 15748 bytes Assets/Animations/TSettings_Main.anim.meta | 8 + Assets/Animations/TStartup_Main.anim | Bin 0 -> 18240 bytes Assets/Animations/TStartup_Main.anim.meta | 8 + Assets/Animations/T_Quit.anim | Bin 0 -> 15052 bytes Assets/Animations/T_Quit.anim.meta | 8 + Assets/Config.unity | Bin 0 -> 18732 bytes Assets/Config.unity.meta | 7 + Assets/Console.unity | Bin 0 -> 37144 bytes Assets/Console.unity.meta | 8 + Assets/Cryville.meta | 9 + Assets/Cryville/Common.meta | 9 + Assets/Cryville/Common/AsyncDelivery.cs | 14 + Assets/Cryville/Common/AsyncDelivery.cs.meta | 12 + Assets/Cryville/Common/BinderAttribute.cs | 59 + .../Cryville/Common/BinderAttribute.cs.meta | 12 + Assets/Cryville/Common/Buffers.meta | 8 + Assets/Cryville/Common/Buffers/ArrayPool.cs | 65 + .../Cryville/Common/Buffers/ArrayPool.cs.meta | 11 + Assets/Cryville/Common/Buffers/ListPool.cs | 71 + .../Cryville/Common/Buffers/ListPool.cs.meta | 11 + Assets/Cryville/Common/Buffers/ObjectPool.cs | 42 + .../Common/Buffers/ObjectPool.cs.meta | 11 + .../Common/Buffers/SimpleObjectPool.cs | 16 + .../Common/Buffers/SimpleObjectPool.cs.meta | 11 + Assets/Cryville/Common/Buffers/WStringPool.cs | 10 + .../Common/Buffers/WStringPool.cs.meta | 11 + Assets/Cryville/Common/ComponentModel.meta | 8 + .../LogarithmicScaleAttribute.cs | 8 + .../LogarithmicScaleAttribute.cs.meta | 11 + .../ComponentModel/PrecisionAttribute.cs | 12 + .../ComponentModel/PrecisionAttribute.cs.meta | 11 + .../Common/ComponentModel/RangeAttribute.cs | 14 + .../ComponentModel/RangeAttribute.cs.meta | 11 + .../Common/ComponentModel/StepAttribute.cs | 11 + .../ComponentModel/StepAttribute.cs.meta | 11 + Assets/Cryville/Common/FileStringAttribute.cs | 17 + .../Common/FileStringAttribute.cs.meta | 12 + Assets/Cryville/Common/Font.meta | 8 + Assets/Cryville/Common/Font/FontUtil.cs | 9 + Assets/Cryville/Common/Font/FontUtil.cs.meta | 11 + Assets/Cryville/Common/IOExtensions.cs | 27 + Assets/Cryville/Common/IOExtensions.cs.meta | 12 + Assets/Cryville/Common/Logger.cs | 79 + Assets/Cryville/Common/Logger.cs.meta | 12 + Assets/Cryville/Common/Math.meta | 9 + Assets/Cryville/Common/Math/ColumnVector.cs | 37 + .../Cryville/Common/Math/ColumnVector.cs.meta | 12 + .../Cryville/Common/Math/IVectorOperator.cs | 6 + .../Common/Math/IVectorOperator.cs.meta | 12 + Assets/Cryville/Common/Math/SquareMatrix.cs | 63 + .../Cryville/Common/Math/SquareMatrix.cs.meta | 12 + Assets/Cryville/Common/Network.meta | 9 + Assets/Cryville/Common/Network/HttpClient.cs | 142 + .../Common/Network/HttpClient.cs.meta | 12 + .../Cryville/Common/Network/HttpResponse.cs | 61 + .../Common/Network/HttpResponse.cs.meta | 12 + .../Common/Network/HttpResponseStream.cs | 135 + .../Common/Network/HttpResponseStream.cs.meta | 12 + Assets/Cryville/Common/Network/HttpsClient.cs | 51 + .../Common/Network/HttpsClient.cs.meta | 12 + .../Cryville/Common/Network/TlsTcpClient.cs | 94 + .../Common/Network/TlsTcpClient.cs.meta | 12 + Assets/Cryville/Common/Pdt.meta | 9 + .../Cryville/Common/Pdt/PdtEvaluatorBase.cs | 155 + .../Common/Pdt/PdtEvaluatorBase.cs.meta | 11 + Assets/Cryville/Common/Pdt/PdtExpression.cs | 247 + .../Cryville/Common/Pdt/PdtExpression.cs.meta | 11 + Assets/Cryville/Common/Pdt/PdtInternalType.cs | 28 + .../Common/Pdt/PdtInternalType.cs.meta | 11 + Assets/Cryville/Common/Pdt/PdtInterpreter.cs | 232 + .../Common/Pdt/PdtInterpreter.cs.meta | 11 + Assets/Cryville/Common/Pdt/PdtOperator.cs | 77 + .../Cryville/Common/Pdt/PdtOperator.cs.meta | 11 + Assets/Cryville/Common/Pdt/PdtReader.cs | 749 ++ Assets/Cryville/Common/Pdt/PdtReader.cs.meta | 12 + .../Cryville/Common/Pdt/PdtVariableMemory.cs | 143 + .../Common/Pdt/PdtVariableMemory.cs.meta | 11 + Assets/Cryville/Common/Plist.meta | 9 + Assets/Cryville/Common/Plist/PlistConvert.cs | 50 + .../Common/Plist/PlistConvert.cs.meta | 12 + Assets/Cryville/Common/ReflectionHelper.cs | 102 + .../Cryville/Common/ReflectionHelper.cs.meta | 12 + Assets/Cryville/Common/StringUtils.cs | 23 + Assets/Cryville/Common/StringUtils.cs.meta | 12 + Assets/Cryville/Common/Unity.meta | 9 + Assets/Cryville/Common/Unity/CallHelper.cs | 34 + .../Cryville/Common/Unity/CallHelper.cs.meta | 12 + Assets/Cryville/Common/Unity/FileDialog.cs | 142 + .../Cryville/Common/Unity/FileDialog.cs.meta | 12 + Assets/Cryville/Common/Unity/Input.meta | 9 + .../Common/Unity/Input/InputHandler.cs | 102 + .../Common/Unity/Input/InputHandler.cs.meta | 11 + .../Common/Unity/Input/InputManager.cs | 194 + .../Common/Unity/Input/InputManager.cs.meta | 12 + .../Cryville/Common/Unity/Input/Messages.cs | 528 + .../Common/Unity/Input/Messages.cs.meta | 12 + .../Common/Unity/Input/NativeMethods.cs | 253 + .../Common/Unity/Input/NativeMethods.cs.meta | 12 + .../Common/Unity/Input/PointerHandler.cs | 57 + .../Common/Unity/Input/PointerHandler.cs.meta | 12 + .../Common/Unity/Input/UnityKeyHandler.cs | 112 + .../Unity/Input/UnityKeyHandler.cs.meta | 11 + .../Common/Unity/Input/UnityMouseHandler.cs | 64 + .../Unity/Input/UnityMouseHandler.cs.meta | 11 + .../Common/Unity/Input/UnityTouchHandler.cs | 74 + .../Unity/Input/UnityTouchHandler.cs.meta | 12 + .../Unity/Input/WindowsPointerHandler.cs | 360 + .../Unity/Input/WindowsPointerHandler.cs.meta | 12 + .../Common/Unity/NetworkTaskWorker.cs | 138 + .../Common/Unity/NetworkTaskWorker.cs.meta | 12 + Assets/Cryville/Common/Unity/Popup.cs | 29 + Assets/Cryville/Common/Unity/Popup.cs.meta | 12 + Assets/Cryville/Common/Unity/PropItem.cs | 145 + Assets/Cryville/Common/Unity/PropItem.cs.meta | 12 + .../Cryville/Common/Unity/PropertyEditor.cs | 61 + .../Common/Unity/PropertyEditor.cs.meta | 12 + Assets/Cryville/Common/Unity/UI.meta | 9 + .../Unity/UI/AspectRatioLayoutElement.cs | 104 + .../Unity/UI/AspectRatioLayoutElement.cs.meta | 12 + .../Unity/UI/DockAspectRatioLayoutGroup.cs | 16 + .../UI/DockAspectRatioLayoutGroup.cs.meta | 12 + .../Common/Unity/UI/DockLayoutGroup.cs | 74 + .../Common/Unity/UI/DockLayoutGroup.cs.meta | 12 + .../Unity/UI/DockOccupiedRatioLayoutGroup.cs | 16 + .../UI/DockOccupiedRatioLayoutGroup.cs.meta | 12 + .../Common/Unity/UI/GridLayoutSizeFitter.cs | 36 + .../Unity/UI/GridLayoutSizeFitter.cs.meta | 12 + .../Cryville/Common/Unity/UI/ImageSliced3.cs | 160 + .../Common/Unity/UI/ImageSliced3.cs.meta | 11 + .../Unity/UI/LayoutAspectRatioFitter.cs | 42 + .../Unity/UI/LayoutAspectRatioFitter.cs.meta | 12 + .../Cryville/Common/Unity/UI/ProgressBar.cs | 27 + .../Common/Unity/UI/ProgressBar.cs.meta | 11 + .../Common/Unity/UI/ScrollableItemGrid.cs | 209 + .../Unity/UI/ScrollableItemGrid.cs.meta | 12 + Assets/Cryville/Crtr.meta | 9 + Assets/Cryville/Crtr/Anchor.cs | 15 + Assets/Cryville/Crtr/Anchor.cs.meta | 12 + Assets/Cryville/Crtr/Browsing.meta | 9 + Assets/Cryville/Crtr/Browsing/BrowserItem.cs | 21 + .../Crtr/Browsing/BrowserItem.cs.meta | 12 + .../Cryville/Crtr/Browsing/BrowserItemTile.cs | 52 + .../Crtr/Browsing/BrowserItemTile.cs.meta | 12 + Assets/Cryville/Crtr/Browsing/DetailPanel.cs | 71 + .../Crtr/Browsing/DetailPanel.cs.meta | 12 + .../Crtr/Browsing/IResourceManager.cs | 14 + .../Crtr/Browsing/IResourceManager.cs.meta | 12 + .../Crtr/Browsing/LegacyResourceManager.cs | 155 + .../Browsing/LegacyResourceManager.cs.meta | 12 + Assets/Cryville/Crtr/Browsing/PVPBool.cs | 55 + Assets/Cryville/Crtr/Browsing/PVPBool.cs.meta | 11 + Assets/Cryville/Crtr/Browsing/PVPNumber.cs | 147 + .../Cryville/Crtr/Browsing/PVPNumber.cs.meta | 11 + Assets/Cryville/Crtr/Browsing/PathPart.cs | 27 + .../Cryville/Crtr/Browsing/PathPart.cs.meta | 12 + .../Crtr/Browsing/PropertyCategoryPanel.cs | 55 + .../Browsing/PropertyCategoryPanel.cs.meta | 12 + .../Cryville/Crtr/Browsing/PropertyPanel.cs | 73 + .../Crtr/Browsing/PropertyPanel.cs.meta | 12 + .../Crtr/Browsing/PropertyValuePanel.cs | 9 + .../Crtr/Browsing/PropertyValuePanel.cs.meta | 11 + .../Cryville/Crtr/Browsing/ResourceBrowser.cs | 73 + .../Crtr/Browsing/ResourceBrowser.cs.meta | 12 + .../Crtr/Browsing/ResourceBrowserMaster.cs | 113 + .../Browsing/ResourceBrowserMaster.cs.meta | 12 + .../Crtr/Browsing/ResourceBrowserUnit.cs | 14 + .../Crtr/Browsing/ResourceBrowserUnit.cs.meta | 12 + .../Crtr/Browsing/ResourceConverter.cs | 33 + .../Crtr/Browsing/ResourceConverter.cs.meta | 12 + Assets/Cryville/Crtr/CastedList.cs | 91 + Assets/Cryville/Crtr/CastedList.cs.meta | 11 + Assets/Cryville/Crtr/Chart.cs | 477 + Assets/Cryville/Crtr/Chart.cs.meta | 12 + Assets/Cryville/Crtr/ChartHandler.cs | 164 + Assets/Cryville/Crtr/ChartHandler.cs.meta | 12 + Assets/Cryville/Crtr/ChartPlayer.cs | 630 ++ Assets/Cryville/Crtr/ChartPlayer.cs.meta | 12 + Assets/Cryville/Crtr/Cocos2dFrames.cs | 188 + Assets/Cryville/Crtr/Cocos2dFrames.cs.meta | 12 + Assets/Cryville/Crtr/Components.meta | 9 + .../Crtr/Components/SectionalGameObject.cs | 291 + .../Components/SectionalGameObject.cs.meta | 12 + .../Cryville/Crtr/Components/SkinComponent.cs | 76 + .../Crtr/Components/SkinComponent.cs.meta | 12 + Assets/Cryville/Crtr/Components/SpriteBase.cs | 155 + .../Crtr/Components/SpriteBase.cs.meta | 12 + .../Cryville/Crtr/Components/SpritePlane.cs | 156 + .../Crtr/Components/SpritePlane.cs.meta | 12 + Assets/Cryville/Crtr/Components/SpriteRect.cs | 39 + .../Crtr/Components/SpriteRect.cs.meta | 12 + .../Cryville/Crtr/Components/SpriteScale3.cs | 93 + .../Crtr/Components/SpriteScale3.cs.meta | 12 + Assets/Cryville/Crtr/Components/SpriteText.cs | 201 + .../Crtr/Components/SpriteText.cs.meta | 12 + Assets/Cryville/Crtr/Components/TrackLine.cs | 31 + .../Crtr/Components/TrackLine.cs.meta | 12 + .../Crtr/Components/TransformInterface.cs | 12 + .../Components/TransformInterface.cs.meta | 11 + Assets/Cryville/Crtr/Console.cs | 170 + Assets/Cryville/Crtr/Console.cs.meta | 12 + Assets/Cryville/Crtr/Evaluator.cs | 331 + Assets/Cryville/Crtr/Evaluator.cs.meta | 12 + Assets/Cryville/Crtr/Event.meta | 9 + .../Cryville/Crtr/Event/ContainerHandler.cs | 137 + .../Crtr/Event/ContainerHandler.cs.meta | 12 + Assets/Cryville/Crtr/Event/ContainerState.cs | 485 + .../Crtr/Event/ContainerState.cs.meta | 12 + Assets/Cryville/Crtr/Event/EventBatch.cs | 47 + Assets/Cryville/Crtr/Event/EventBatch.cs.meta | 12 + Assets/Cryville/Crtr/Event/EventBatcher.cs | 147 + .../Cryville/Crtr/Event/EventBatcher.cs.meta | 12 + Assets/Cryville/Crtr/Event/EventBus.cs | 177 + Assets/Cryville/Crtr/Event/EventBus.cs.meta | 12 + Assets/Cryville/Crtr/Event/RMVPool.cs | 39 + Assets/Cryville/Crtr/Event/RMVPool.cs.meta | 11 + Assets/Cryville/Crtr/Extensions.meta | 9 + Assets/Cryville/Crtr/Extensions/Malody.meta | 9 + .../Extensions/Malody/MalodyChartConverter.cs | 243 + .../Malody/MalodyChartConverter.cs.meta | 12 + Assets/Cryville/Crtr/Game.cs | 191 + Assets/Cryville/Crtr/Game.cs.meta | 12 + Assets/Cryville/Crtr/GenericResources.cs | 38 + Assets/Cryville/Crtr/GenericResources.cs.meta | 12 + Assets/Cryville/Crtr/GroupHandler.cs | 172 + Assets/Cryville/Crtr/GroupHandler.cs.meta | 12 + Assets/Cryville/Crtr/InputProxy.cs | 135 + Assets/Cryville/Crtr/InputProxy.cs.meta | 11 + Assets/Cryville/Crtr/Judge.cs | 731 ++ Assets/Cryville/Crtr/Judge.cs.meta | 12 + Assets/Cryville/Crtr/Master.cs | 23 + Assets/Cryville/Crtr/Master.cs.meta | 12 + Assets/Cryville/Crtr/Menu.cs | 57 + Assets/Cryville/Crtr/Menu.cs.meta | 12 + Assets/Cryville/Crtr/MeshWrapper.cs | 63 + Assets/Cryville/Crtr/MeshWrapper.cs.meta | 12 + Assets/Cryville/Crtr/Motion.cs | 1156 ++ Assets/Cryville/Crtr/Motion.cs.meta | 12 + .../Cryville/Crtr/NetworkTaskWorkerTicker.cs | 36 + .../Crtr/NetworkTaskWorkerTicker.cs.meta | 12 + Assets/Cryville/Crtr/NoteHandler.cs | 297 + Assets/Cryville/Crtr/NoteHandler.cs.meta | 12 + Assets/Cryville/Crtr/PdtEvaluator.cs | 373 + Assets/Cryville/Crtr/PdtEvaluator.cs.meta | 11 + Assets/Cryville/Crtr/PropOp.cs | 115 + Assets/Cryville/Crtr/PropOp.cs.meta | 11 + Assets/Cryville/Crtr/PropSrc.cs | 59 + Assets/Cryville/Crtr/PropSrc.cs.meta | 11 + Assets/Cryville/Crtr/Rin.meta | 9 + Assets/Cryville/Crtr/Rin/Rin.cs | 4 + Assets/Cryville/Crtr/Rin/Rin.cs.meta | 12 + Assets/Cryville/Crtr/Ruleset.cs | 286 + Assets/Cryville/Crtr/Ruleset.cs.meta | 12 + Assets/Cryville/Crtr/RulesetInterpreter.cs | 57 + .../Cryville/Crtr/RulesetInterpreter.cs.meta | 11 + Assets/Cryville/Crtr/RulesetSelectors.cs | 93 + Assets/Cryville/Crtr/RulesetSelectors.cs.meta | 11 + Assets/Cryville/Crtr/Settings.cs | 180 + Assets/Cryville/Crtr/Settings.cs.meta | 12 + Assets/Cryville/Crtr/SettingsPanel.cs | 52 + Assets/Cryville/Crtr/SettingsPanel.cs.meta | 11 + Assets/Cryville/Crtr/Skin.cs | 165 + Assets/Cryville/Crtr/Skin.cs.meta | 12 + Assets/Cryville/Crtr/SkinContainer.cs | 88 + Assets/Cryville/Crtr/SkinContainer.cs.meta | 11 + Assets/Cryville/Crtr/SkinInterpreter.cs | 67 + Assets/Cryville/Crtr/SkinInterpreter.cs.meta | 11 + Assets/Cryville/Crtr/SkinManager.cs | 163 + Assets/Cryville/Crtr/SkinManager.cs.meta | 12 + Assets/Cryville/Crtr/SkinSelectors.cs | 354 + Assets/Cryville/Crtr/SkinSelectors.cs.meta | 12 + Assets/Cryville/Crtr/StampedEvent.cs | 96 + Assets/Cryville/Crtr/StampedEvent.cs.meta | 12 + Assets/Cryville/Crtr/StateBase.cs | 217 + Assets/Cryville/Crtr/StateBase.cs.meta | 12 + Assets/Cryville/Crtr/TrackHandler.cs | 251 + Assets/Cryville/Crtr/TrackHandler.cs.meta | 12 + Assets/Editor.meta | 9 + Assets/Editor/FixProjectVersion.cs | 15 + Assets/Editor/FixProjectVersion.cs.meta | 12 + Assets/EricHaines.meta | 9 + Assets/EricHaines/TextureScale.cs | 144 + Assets/EricHaines/TextureScale.cs.meta | 12 + Assets/GlobalSuppressions.cs | 39 + Assets/GlobalSuppressions.cs.meta | 11 + Assets/Interface.meta | 8 + Assets/Interface/Common.meta | 8 + Assets/Interface/Common/icon_audio.png | Bin 0 -> 625 bytes Assets/Interface/Common/icon_audio.png.meta | 135 + Assets/Interface/Common/icon_graphics.png | Bin 0 -> 567 bytes .../Interface/Common/icon_graphics.png.meta | 135 + Assets/Interface/Common/icon_modal.png | Bin 0 -> 264 bytes Assets/Interface/Common/icon_modal.png.meta | 122 + Assets/Interface/Dialog.meta | 8 + Assets/Interface/Dialog/btn_dialog.png | Bin 0 -> 8257 bytes Assets/Interface/Dialog/btn_dialog.png.meta | 122 + Assets/Interface/Dialog/btn_dialog_close.png | Bin 0 -> 10375 bytes .../Dialog/btn_dialog_close.png.meta | 122 + Assets/Interface/Dialog/pl_dialog_base.png | Bin 0 -> 5519 bytes .../Interface/Dialog/pl_dialog_base.png.meta | 122 + Assets/Interface/Main.meta | 8 + Assets/Interface/Main/box_search.png | Bin 0 -> 550 bytes Assets/Interface/Main/box_search.png.meta | 122 + Assets/Interface/Main/btn_back_overlay.png | Bin 0 -> 4397 bytes .../Interface/Main/btn_back_overlay.png.meta | 122 + Assets/Interface/Main/btn_chart_settings.png | Bin 0 -> 7460 bytes .../Main/btn_chart_settings.png.meta | 122 + Assets/Interface/Main/btn_db_base.png | Bin 0 -> 2436 bytes Assets/Interface/Main/btn_db_base.png.meta | 122 + Assets/Interface/Main/btn_db_local_base.png | Bin 0 -> 1293 bytes .../Interface/Main/btn_db_local_base.png.meta | 122 + .../Interface/Main/btn_db_local_overlay.png | Bin 0 -> 308 bytes .../Main/btn_db_local_overlay.png.meta | 122 + Assets/Interface/Main/btn_db_server_base.png | Bin 0 -> 1436 bytes .../Main/btn_db_server_base.png.meta | 122 + .../Interface/Main/btn_db_server_overlay.png | Bin 0 -> 748 bytes .../Main/btn_db_server_overlay.png.meta | 122 + Assets/Interface/Main/btn_import_base.png | Bin 0 -> 3498 bytes .../Interface/Main/btn_import_base.png.meta | 122 + Assets/Interface/Main/btn_import_overlay.png | Bin 0 -> 459 bytes .../Main/btn_import_overlay.png.meta | 122 + Assets/Interface/Main/btn_play.png | Bin 0 -> 11855 bytes Assets/Interface/Main/btn_play.png.meta | 122 + Assets/Interface/Main/btn_search.png | Bin 0 -> 1463 bytes Assets/Interface/Main/btn_search.png.meta | 122 + Assets/Interface/Main/btn_status.png | Bin 0 -> 559 bytes Assets/Interface/Main/btn_status.png.meta | 122 + .../Main/btn_status_badge_download.png | Bin 0 -> 726 bytes .../Main/btn_status_badge_download.png.meta | 122 + Assets/Interface/Main/orn_1.png | Bin 0 -> 10513 bytes Assets/Interface/Main/orn_1.png.meta | 122 + Assets/Interface/Main/orn_2.png | Bin 0 -> 5875 bytes Assets/Interface/Main/orn_2.png.meta | 122 + Assets/Interface/Main/pl_browser_base.png | Bin 0 -> 4796 bytes .../Interface/Main/pl_browser_base.png.meta | 122 + Assets/Interface/Main/pl_browser_div.png | Bin 0 -> 211 bytes Assets/Interface/Main/pl_browser_div.png.meta | 122 + Assets/Interface/Main/pl_content_base.png | Bin 0 -> 2861 bytes .../Interface/Main/pl_content_base.png.meta | 122 + .../Interface/Main/pl_content_border_br.png | Bin 0 -> 6611 bytes .../Main/pl_content_border_br.png.meta | 122 + .../Interface/Main/pl_content_border_tl.png | Bin 0 -> 3303 bytes .../Main/pl_content_border_tl.png.meta | 122 + .../Interface/Main/pl_content_border_tr.png | Bin 0 -> 1240 bytes .../Main/pl_content_border_tr.png.meta | 122 + Assets/Interface/Main/pl_filter_base.png | Bin 0 -> 16253 bytes Assets/Interface/Main/pl_filter_base.png.meta | 122 + Assets/Interface/Main/pl_nav_base.png | Bin 0 -> 20974 bytes Assets/Interface/Main/pl_nav_base.png.meta | 122 + Assets/Interface/Main/pl_topbar_base.png | Bin 0 -> 11021 bytes Assets/Interface/Main/pl_topbar_base.png.meta | 122 + Assets/Interface/Main/pl_topbar_mask.png | Bin 0 -> 2251 bytes Assets/Interface/Main/pl_topbar_mask.png.meta | 122 + Assets/Interface/Main/pl_topbar_overlay.png | Bin 0 -> 2862 bytes .../Interface/Main/pl_topbar_overlay.png.meta | 122 + Assets/Interface/Settings.meta | 8 + .../Interface/Settings/box_check_base_off.png | Bin 0 -> 963 bytes .../Settings/box_check_base_off.png.meta | 122 + .../Interface/Settings/box_check_base_on.png | Bin 0 -> 1090 bytes .../Settings/box_check_base_on.png.meta | 122 + Assets/Interface/Settings/box_check_mask.png | Bin 0 -> 1606 bytes .../Settings/box_check_mask.png.meta | 122 + Assets/Interface/Settings/box_slider_base.png | Bin 0 -> 1799 bytes .../Settings/box_slider_base.png.meta | 122 + .../Interface/Settings/box_slider_handle.png | Bin 0 -> 3517 bytes .../Settings/box_slider_handle.png.meta | 122 + Assets/Interface/Settings/box_text_base.png | Bin 0 -> 518 bytes .../Interface/Settings/box_text_base.png.meta | 122 + .../Interface/Settings/pl_settings_base.png | Bin 0 -> 5275 bytes .../Settings/pl_settings_base.png.meta | 122 + .../Settings/pl_settings_ctn_base.png | Bin 0 -> 9915 bytes .../Settings/pl_settings_ctn_base.png.meta | 122 + .../Settings/pl_settings_ctn_mask.png | Bin 0 -> 5691 bytes .../Settings/pl_settings_ctn_mask.png.meta | 122 + .../Settings/pl_settings_ctn_overlay.png | Bin 0 -> 3369 bytes .../Settings/pl_settings_ctn_overlay.png.meta | 122 + Assets/Interface/Start.meta | 8 + Assets/Interface/Start/pl_start_overlay.png | Bin 0 -> 7897 bytes .../Interface/Start/pl_start_overlay.png.meta | 122 + Assets/Materials.meta | 9 + Assets/Materials/placeholder.png | Bin 0 -> 3269 bytes Assets/Materials/placeholder.png.meta | 98 + Assets/Menu.unity | Bin 0 -> 134797 bytes Assets/Menu.unity.meta | 8 + Assets/Play.unity | Bin 0 -> 46701 bytes Assets/Play.unity.meta | 8 + Assets/PlaySettings.lighting | Bin 0 -> 4372 bytes Assets/PlaySettings.lighting.meta | 8 + Assets/PlistCS.meta | 9 + Assets/PlistCS/Src.meta | 9 + Assets/PlistCS/Src/Plist.cs | 838 ++ Assets/PlistCS/Src/Plist.cs.meta | 12 + Assets/Plugins.meta | 9 + Assets/Plugins/Android.meta | 8 + Assets/Plugins/Android/arm64-v8a.meta | 8 + .../Plugins/Android/arm64-v8a/libavcodec.so | Bin 0 -> 1644984 bytes .../Android/arm64-v8a/libavcodec.so.meta | 33 + .../Plugins/Android/arm64-v8a/libavfilter.so | Bin 0 -> 132464 bytes .../Android/arm64-v8a/libavfilter.so.meta | 33 + .../Plugins/Android/arm64-v8a/libavformat.so | Bin 0 -> 320952 bytes .../Android/arm64-v8a/libavformat.so.meta | 33 + Assets/Plugins/Android/arm64-v8a/libavutil.so | Bin 0 -> 540024 bytes .../Android/arm64-v8a/libavutil.so.meta | 33 + .../Android/arm64-v8a/libswresample.so | Bin 0 -> 87408 bytes .../Android/arm64-v8a/libswresample.so.meta | 33 + .../Plugins/Android/arm64-v8a/libswscale.so | Bin 0 -> 480696 bytes .../Android/arm64-v8a/libswscale.so.meta | 33 + Assets/Plugins/Android/armeabi-v7a.meta | 8 + .../Plugins/Android/armeabi-v7a/libavcodec.so | Bin 0 -> 1967692 bytes .../Android/armeabi-v7a/libavcodec.so.meta | 33 + .../Android/armeabi-v7a/libavfilter.so | Bin 0 -> 132196 bytes .../Android/armeabi-v7a/libavfilter.so.meta | 33 + .../Android/armeabi-v7a/libavformat.so | Bin 0 -> 336996 bytes .../Android/armeabi-v7a/libavformat.so.meta | 33 + .../Plugins/Android/armeabi-v7a/libavutil.so | Bin 0 -> 592272 bytes .../Android/armeabi-v7a/libavutil.so.meta | 33 + .../Android/armeabi-v7a/libswresample.so | Bin 0 -> 95332 bytes .../Android/armeabi-v7a/libswresample.so.meta | 33 + .../Plugins/Android/armeabi-v7a/libswscale.so | Bin 0 -> 472164 bytes .../Android/armeabi-v7a/libswscale.so.meta | 33 + Assets/Plugins/BouncyCastle.Crypto.dll | Bin 0 -> 2977792 bytes Assets/Plugins/BouncyCastle.Crypto.dll.meta | 33 + Assets/Plugins/Cryville.Audio.dll | Bin 0 -> 217088 bytes Assets/Plugins/Cryville.Audio.dll.meta | 33 + Assets/Plugins/Cryville.Audio.eng-latn.xml | 938 ++ .../Plugins/Cryville.Audio.eng-latn.xml.meta | 7 + Assets/Plugins/Cryville.Audio.xml | 938 ++ Assets/Plugins/Cryville.Audio.xml.meta | 7 + Assets/Plugins/Cryville.Meta.dll | Bin 0 -> 7168 bytes Assets/Plugins/Cryville.Meta.dll.meta | 33 + Assets/Plugins/FFmpeg.AutoGen.dll | Bin 0 -> 621568 bytes Assets/Plugins/FFmpeg.AutoGen.dll.meta | 33 + Assets/Plugins/FFmpeg.AutoGen.xml | 9509 +++++++++++++++++ Assets/Plugins/FFmpeg.AutoGen.xml.meta | 7 + Assets/Plugins/I18N.CJK.dll | Bin 0 -> 680448 bytes Assets/Plugins/I18N.CJK.dll.meta | 33 + Assets/Plugins/I18N.MidEast.dll | Bin 0 -> 29184 bytes Assets/Plugins/I18N.MidEast.dll.meta | 33 + Assets/Plugins/I18N.Other.dll | Bin 0 -> 32256 bytes Assets/Plugins/I18N.Other.dll.meta | 33 + Assets/Plugins/I18N.Rare.dll | Bin 0 -> 171008 bytes Assets/Plugins/I18N.Rare.dll.meta | 33 + Assets/Plugins/I18N.West.dll | Bin 0 -> 65536 bytes Assets/Plugins/I18N.West.dll.meta | 33 + Assets/Plugins/I18N.dll | Bin 0 -> 31744 bytes Assets/Plugins/I18N.dll.meta | 33 + Assets/Plugins/Ionic.Zip.dll | Bin 0 -> 445440 bytes Assets/Plugins/Ionic.Zip.dll.meta | 33 + Assets/Plugins/Windows.meta | 8 + .../Windows/Cryville.Audio.WasapiWrapper.dll | Bin 0 -> 11776 bytes .../Cryville.Audio.WasapiWrapper.dll.meta | 70 + Assets/Plugins/Windows/avcodec-59.dll | Bin 0 -> 6928896 bytes Assets/Plugins/Windows/avcodec-59.dll.meta | 58 + Assets/Plugins/Windows/avfilter-8.dll | Bin 0 -> 161792 bytes Assets/Plugins/Windows/avfilter-8.dll.meta | 58 + Assets/Plugins/Windows/avformat-59.dll | Bin 0 -> 447488 bytes Assets/Plugins/Windows/avformat-59.dll.meta | 58 + Assets/Plugins/Windows/avutil-57.dll | Bin 0 -> 914944 bytes Assets/Plugins/Windows/avutil-57.dll.meta | 58 + Assets/Plugins/Windows/swresample-4.dll | Bin 0 -> 126464 bytes Assets/Plugins/Windows/swresample-4.dll.meta | 58 + Assets/Plugins/Windows/swscale-6.dll | Bin 0 -> 640000 bytes Assets/Plugins/Windows/swscale-6.dll.meta | 58 + Assets/Prefabs.meta | 9 + Assets/Prefabs/BrowserTile.prefab | Bin 0 -> 32048 bytes Assets/Prefabs/BrowserTile.prefab.meta | 8 + Assets/Prefabs/PVBool.prefab | Bin 0 -> 18584 bytes Assets/Prefabs/PVBool.prefab.meta | 8 + Assets/Prefabs/PVNumber.prefab | Bin 0 -> 23184 bytes Assets/Prefabs/PVNumber.prefab.meta | 8 + Assets/Prefabs/PathPart.prefab | Bin 0 -> 14204 bytes Assets/Prefabs/PathPart.prefab.meta | 8 + Assets/Prefabs/Property.prefab | Bin 0 -> 12056 bytes Assets/Prefabs/Property.prefab.meta | 8 + Assets/Prefabs/PropertyCategory.prefab | Bin 0 -> 23636 bytes Assets/Prefabs/PropertyCategory.prefab.meta | 8 + Assets/Resources.meta | 9 + Assets/Resources/Common.meta | 9 + Assets/Resources/Common/Button.prefab | Bin 0 -> 13168 bytes Assets/Resources/Common/Button.prefab.meta | 8 + Assets/Resources/Common/FileDialog.prefab | Bin 0 -> 30032 bytes .../Resources/Common/FileDialog.prefab.meta | 8 + Assets/Resources/Common/Popup.prefab | Bin 0 -> 9972 bytes Assets/Resources/Common/Popup.prefab.meta | 8 + Assets/Resources/Common/PropItem.prefab | Bin 0 -> 21264 bytes Assets/Resources/Common/PropItem.prefab.meta | 8 + Assets/Resources/Common/PropertyEditor.prefab | Bin 0 -> 26480 bytes .../Common/PropertyEditor.prefab.meta | 8 + Assets/Resources/CutoutMat.mat | Bin 0 -> 5408 bytes Assets/Resources/CutoutMat.mat.meta | 8 + Assets/Resources/Materials.meta | 9 + Assets/Resources/Materials/defaultMat.mat | Bin 0 -> 5348 bytes .../Resources/Materials/defaultMat.mat.meta | 8 + Assets/Resources/TransparentMat.mat | Bin 0 -> 5404 bytes Assets/Resources/TransparentMat.mat.meta | 8 + Assets/Resources/default.txt | Bin 0 -> 5275719 bytes Assets/Resources/default.txt.meta | 7 + Assets/Resources/quad.obj | 12 + Assets/Resources/quad.obj.meta | 126 + Assets/Resources/quad_scale3h.obj | 15 + Assets/Resources/quad_scale3h.obj.meta | 126 + Assets/SystemExtensions.meta | 9 + Assets/SystemExtensions/gstring.cs | 1063 ++ Assets/SystemExtensions/gstring.cs.meta | 11 + Assets/UnityVS.meta | 9 + Assets/csc.rsp | 1 + Assets/csc.rsp.meta | 7 + Http/SkinEditor/app.css | 253 + Http/SkinEditor/app.js | 456 + Http/SkinEditor/array_util.js | 26 + Http/SkinEditor/index.html | 24 + Http/SkinEditor/jquery-3.6.0.min.js | 2 + Http/SkinEditor/messages/en_US.js | 65 + Http/SkinEditor/messages/zh_CN.js | 65 + Http/SkinEditor/stretchy.min.js | 5 + Packages/manifest.json | 20 + Packages/packages-lock.json | 156 + ProjectSettings/AudioManager.asset | Bin 0 -> 4152 bytes ProjectSettings/AutoStreamingSettings.asset | 21 + ProjectSettings/ClusterInputManager.asset | Bin 0 -> 4104 bytes ProjectSettings/DynamicsManager.asset | Bin 0 -> 4276 bytes ProjectSettings/EditorBuildSettings.asset | Bin 0 -> 4240 bytes ProjectSettings/EditorSettings.asset | Bin 0 -> 4188 bytes ProjectSettings/GraphicsSettings.asset | Bin 0 -> 4442 bytes ProjectSettings/InputManager.asset | Bin 0 -> 5520 bytes ProjectSettings/MemorySettings.asset | 35 + ProjectSettings/NavMeshAreas.asset | Bin 0 -> 4384 bytes ProjectSettings/NetworkManager.asset | Bin 0 -> 4112 bytes ProjectSettings/PackageManagerSettings.asset | 35 + ProjectSettings/Physics2DSettings.asset | Bin 0 -> 4308 bytes ProjectSettings/PresetManager.asset | 7 + ProjectSettings/ProjectSettings.asset | Bin 0 -> 71358 bytes ProjectSettings/ProjectVersion.txt | 2 + ProjectSettings/QualitySettings.asset | Bin 0 -> 4844 bytes ProjectSettings/SceneTemplateSettings.json | 167 + ProjectSettings/TagManager.asset | Bin 0 -> 4236 bytes ProjectSettings/TimeManager.asset | Bin 0 -> 4112 bytes ProjectSettings/TimelineSettings.asset | 16 + ProjectSettings/UPRSettings.asset | Bin 0 -> 4112 bytes ProjectSettings/UnityConnectSettings.asset | Bin 0 -> 4460 bytes ProjectSettings/VFXManager.asset | 15 + ProjectSettings/VersionControlSettings.asset | 8 + ProjectSettings/boot.config | 0 561 files changed, 40626 insertions(+) create mode 100644 .editorconfig create mode 100644 .vsconfig create mode 100644 Assets/Animations.meta create mode 100644 Assets/Animations/Canvas.controller create mode 100644 Assets/Animations/Canvas.controller.meta create mode 100644 Assets/Animations/IMain.anim create mode 100644 Assets/Animations/IMain.anim.meta create mode 100644 Assets/Animations/IQuit.anim create mode 100644 Assets/Animations/IQuit.anim.meta create mode 100644 Assets/Animations/ISettings.anim create mode 100644 Assets/Animations/ISettings.anim.meta create mode 100644 Assets/Animations/IStartup.anim create mode 100644 Assets/Animations/IStartup.anim.meta create mode 100644 Assets/Animations/TMain_Settings.anim create mode 100644 Assets/Animations/TMain_Settings.anim.meta create mode 100644 Assets/Animations/TQuit_.anim create mode 100644 Assets/Animations/TQuit_.anim.meta create mode 100644 Assets/Animations/TSettings_Main.anim create mode 100644 Assets/Animations/TSettings_Main.anim.meta create mode 100644 Assets/Animations/TStartup_Main.anim create mode 100644 Assets/Animations/TStartup_Main.anim.meta create mode 100644 Assets/Animations/T_Quit.anim create mode 100644 Assets/Animations/T_Quit.anim.meta create mode 100644 Assets/Config.unity create mode 100644 Assets/Config.unity.meta create mode 100644 Assets/Console.unity create mode 100644 Assets/Console.unity.meta create mode 100644 Assets/Cryville.meta create mode 100644 Assets/Cryville/Common.meta create mode 100644 Assets/Cryville/Common/AsyncDelivery.cs create mode 100644 Assets/Cryville/Common/AsyncDelivery.cs.meta create mode 100644 Assets/Cryville/Common/BinderAttribute.cs create mode 100644 Assets/Cryville/Common/BinderAttribute.cs.meta create mode 100644 Assets/Cryville/Common/Buffers.meta create mode 100644 Assets/Cryville/Common/Buffers/ArrayPool.cs create mode 100644 Assets/Cryville/Common/Buffers/ArrayPool.cs.meta create mode 100644 Assets/Cryville/Common/Buffers/ListPool.cs create mode 100644 Assets/Cryville/Common/Buffers/ListPool.cs.meta create mode 100644 Assets/Cryville/Common/Buffers/ObjectPool.cs create mode 100644 Assets/Cryville/Common/Buffers/ObjectPool.cs.meta create mode 100644 Assets/Cryville/Common/Buffers/SimpleObjectPool.cs create mode 100644 Assets/Cryville/Common/Buffers/SimpleObjectPool.cs.meta create mode 100644 Assets/Cryville/Common/Buffers/WStringPool.cs create mode 100644 Assets/Cryville/Common/Buffers/WStringPool.cs.meta create mode 100644 Assets/Cryville/Common/ComponentModel.meta create mode 100644 Assets/Cryville/Common/ComponentModel/LogarithmicScaleAttribute.cs create mode 100644 Assets/Cryville/Common/ComponentModel/LogarithmicScaleAttribute.cs.meta create mode 100644 Assets/Cryville/Common/ComponentModel/PrecisionAttribute.cs create mode 100644 Assets/Cryville/Common/ComponentModel/PrecisionAttribute.cs.meta create mode 100644 Assets/Cryville/Common/ComponentModel/RangeAttribute.cs create mode 100644 Assets/Cryville/Common/ComponentModel/RangeAttribute.cs.meta create mode 100644 Assets/Cryville/Common/ComponentModel/StepAttribute.cs create mode 100644 Assets/Cryville/Common/ComponentModel/StepAttribute.cs.meta create mode 100644 Assets/Cryville/Common/FileStringAttribute.cs create mode 100644 Assets/Cryville/Common/FileStringAttribute.cs.meta create mode 100644 Assets/Cryville/Common/Font.meta create mode 100644 Assets/Cryville/Common/Font/FontUtil.cs create mode 100644 Assets/Cryville/Common/Font/FontUtil.cs.meta create mode 100644 Assets/Cryville/Common/IOExtensions.cs create mode 100644 Assets/Cryville/Common/IOExtensions.cs.meta create mode 100644 Assets/Cryville/Common/Logger.cs create mode 100644 Assets/Cryville/Common/Logger.cs.meta create mode 100644 Assets/Cryville/Common/Math.meta create mode 100644 Assets/Cryville/Common/Math/ColumnVector.cs create mode 100644 Assets/Cryville/Common/Math/ColumnVector.cs.meta create mode 100644 Assets/Cryville/Common/Math/IVectorOperator.cs create mode 100644 Assets/Cryville/Common/Math/IVectorOperator.cs.meta create mode 100644 Assets/Cryville/Common/Math/SquareMatrix.cs create mode 100644 Assets/Cryville/Common/Math/SquareMatrix.cs.meta create mode 100644 Assets/Cryville/Common/Network.meta create mode 100644 Assets/Cryville/Common/Network/HttpClient.cs create mode 100644 Assets/Cryville/Common/Network/HttpClient.cs.meta create mode 100644 Assets/Cryville/Common/Network/HttpResponse.cs create mode 100644 Assets/Cryville/Common/Network/HttpResponse.cs.meta create mode 100644 Assets/Cryville/Common/Network/HttpResponseStream.cs create mode 100644 Assets/Cryville/Common/Network/HttpResponseStream.cs.meta create mode 100644 Assets/Cryville/Common/Network/HttpsClient.cs create mode 100644 Assets/Cryville/Common/Network/HttpsClient.cs.meta create mode 100644 Assets/Cryville/Common/Network/TlsTcpClient.cs create mode 100644 Assets/Cryville/Common/Network/TlsTcpClient.cs.meta create mode 100644 Assets/Cryville/Common/Pdt.meta create mode 100644 Assets/Cryville/Common/Pdt/PdtEvaluatorBase.cs create mode 100644 Assets/Cryville/Common/Pdt/PdtEvaluatorBase.cs.meta create mode 100644 Assets/Cryville/Common/Pdt/PdtExpression.cs create mode 100644 Assets/Cryville/Common/Pdt/PdtExpression.cs.meta create mode 100644 Assets/Cryville/Common/Pdt/PdtInternalType.cs create mode 100644 Assets/Cryville/Common/Pdt/PdtInternalType.cs.meta create mode 100644 Assets/Cryville/Common/Pdt/PdtInterpreter.cs create mode 100644 Assets/Cryville/Common/Pdt/PdtInterpreter.cs.meta create mode 100644 Assets/Cryville/Common/Pdt/PdtOperator.cs create mode 100644 Assets/Cryville/Common/Pdt/PdtOperator.cs.meta create mode 100644 Assets/Cryville/Common/Pdt/PdtReader.cs create mode 100644 Assets/Cryville/Common/Pdt/PdtReader.cs.meta create mode 100644 Assets/Cryville/Common/Pdt/PdtVariableMemory.cs create mode 100644 Assets/Cryville/Common/Pdt/PdtVariableMemory.cs.meta create mode 100644 Assets/Cryville/Common/Plist.meta create mode 100644 Assets/Cryville/Common/Plist/PlistConvert.cs create mode 100644 Assets/Cryville/Common/Plist/PlistConvert.cs.meta create mode 100644 Assets/Cryville/Common/ReflectionHelper.cs create mode 100644 Assets/Cryville/Common/ReflectionHelper.cs.meta create mode 100644 Assets/Cryville/Common/StringUtils.cs create mode 100644 Assets/Cryville/Common/StringUtils.cs.meta create mode 100644 Assets/Cryville/Common/Unity.meta create mode 100644 Assets/Cryville/Common/Unity/CallHelper.cs create mode 100644 Assets/Cryville/Common/Unity/CallHelper.cs.meta create mode 100644 Assets/Cryville/Common/Unity/FileDialog.cs create mode 100644 Assets/Cryville/Common/Unity/FileDialog.cs.meta create mode 100644 Assets/Cryville/Common/Unity/Input.meta create mode 100644 Assets/Cryville/Common/Unity/Input/InputHandler.cs create mode 100644 Assets/Cryville/Common/Unity/Input/InputHandler.cs.meta create mode 100644 Assets/Cryville/Common/Unity/Input/InputManager.cs create mode 100644 Assets/Cryville/Common/Unity/Input/InputManager.cs.meta create mode 100644 Assets/Cryville/Common/Unity/Input/Messages.cs create mode 100644 Assets/Cryville/Common/Unity/Input/Messages.cs.meta create mode 100644 Assets/Cryville/Common/Unity/Input/NativeMethods.cs create mode 100644 Assets/Cryville/Common/Unity/Input/NativeMethods.cs.meta create mode 100644 Assets/Cryville/Common/Unity/Input/PointerHandler.cs create mode 100644 Assets/Cryville/Common/Unity/Input/PointerHandler.cs.meta create mode 100644 Assets/Cryville/Common/Unity/Input/UnityKeyHandler.cs create mode 100644 Assets/Cryville/Common/Unity/Input/UnityKeyHandler.cs.meta create mode 100644 Assets/Cryville/Common/Unity/Input/UnityMouseHandler.cs create mode 100644 Assets/Cryville/Common/Unity/Input/UnityMouseHandler.cs.meta create mode 100644 Assets/Cryville/Common/Unity/Input/UnityTouchHandler.cs create mode 100644 Assets/Cryville/Common/Unity/Input/UnityTouchHandler.cs.meta create mode 100644 Assets/Cryville/Common/Unity/Input/WindowsPointerHandler.cs create mode 100644 Assets/Cryville/Common/Unity/Input/WindowsPointerHandler.cs.meta create mode 100644 Assets/Cryville/Common/Unity/NetworkTaskWorker.cs create mode 100644 Assets/Cryville/Common/Unity/NetworkTaskWorker.cs.meta create mode 100644 Assets/Cryville/Common/Unity/Popup.cs create mode 100644 Assets/Cryville/Common/Unity/Popup.cs.meta create mode 100644 Assets/Cryville/Common/Unity/PropItem.cs create mode 100644 Assets/Cryville/Common/Unity/PropItem.cs.meta create mode 100644 Assets/Cryville/Common/Unity/PropertyEditor.cs create mode 100644 Assets/Cryville/Common/Unity/PropertyEditor.cs.meta create mode 100644 Assets/Cryville/Common/Unity/UI.meta create mode 100644 Assets/Cryville/Common/Unity/UI/AspectRatioLayoutElement.cs create mode 100644 Assets/Cryville/Common/Unity/UI/AspectRatioLayoutElement.cs.meta create mode 100644 Assets/Cryville/Common/Unity/UI/DockAspectRatioLayoutGroup.cs create mode 100644 Assets/Cryville/Common/Unity/UI/DockAspectRatioLayoutGroup.cs.meta create mode 100644 Assets/Cryville/Common/Unity/UI/DockLayoutGroup.cs create mode 100644 Assets/Cryville/Common/Unity/UI/DockLayoutGroup.cs.meta create mode 100644 Assets/Cryville/Common/Unity/UI/DockOccupiedRatioLayoutGroup.cs create mode 100644 Assets/Cryville/Common/Unity/UI/DockOccupiedRatioLayoutGroup.cs.meta create mode 100644 Assets/Cryville/Common/Unity/UI/GridLayoutSizeFitter.cs create mode 100644 Assets/Cryville/Common/Unity/UI/GridLayoutSizeFitter.cs.meta create mode 100644 Assets/Cryville/Common/Unity/UI/ImageSliced3.cs create mode 100644 Assets/Cryville/Common/Unity/UI/ImageSliced3.cs.meta create mode 100644 Assets/Cryville/Common/Unity/UI/LayoutAspectRatioFitter.cs create mode 100644 Assets/Cryville/Common/Unity/UI/LayoutAspectRatioFitter.cs.meta create mode 100644 Assets/Cryville/Common/Unity/UI/ProgressBar.cs create mode 100644 Assets/Cryville/Common/Unity/UI/ProgressBar.cs.meta create mode 100644 Assets/Cryville/Common/Unity/UI/ScrollableItemGrid.cs create mode 100644 Assets/Cryville/Common/Unity/UI/ScrollableItemGrid.cs.meta create mode 100644 Assets/Cryville/Crtr.meta create mode 100644 Assets/Cryville/Crtr/Anchor.cs create mode 100644 Assets/Cryville/Crtr/Anchor.cs.meta create mode 100644 Assets/Cryville/Crtr/Browsing.meta create mode 100644 Assets/Cryville/Crtr/Browsing/BrowserItem.cs create mode 100644 Assets/Cryville/Crtr/Browsing/BrowserItem.cs.meta create mode 100644 Assets/Cryville/Crtr/Browsing/BrowserItemTile.cs create mode 100644 Assets/Cryville/Crtr/Browsing/BrowserItemTile.cs.meta create mode 100644 Assets/Cryville/Crtr/Browsing/DetailPanel.cs create mode 100644 Assets/Cryville/Crtr/Browsing/DetailPanel.cs.meta create mode 100644 Assets/Cryville/Crtr/Browsing/IResourceManager.cs create mode 100644 Assets/Cryville/Crtr/Browsing/IResourceManager.cs.meta create mode 100644 Assets/Cryville/Crtr/Browsing/LegacyResourceManager.cs create mode 100644 Assets/Cryville/Crtr/Browsing/LegacyResourceManager.cs.meta create mode 100644 Assets/Cryville/Crtr/Browsing/PVPBool.cs create mode 100644 Assets/Cryville/Crtr/Browsing/PVPBool.cs.meta create mode 100644 Assets/Cryville/Crtr/Browsing/PVPNumber.cs create mode 100644 Assets/Cryville/Crtr/Browsing/PVPNumber.cs.meta create mode 100644 Assets/Cryville/Crtr/Browsing/PathPart.cs create mode 100644 Assets/Cryville/Crtr/Browsing/PathPart.cs.meta create mode 100644 Assets/Cryville/Crtr/Browsing/PropertyCategoryPanel.cs create mode 100644 Assets/Cryville/Crtr/Browsing/PropertyCategoryPanel.cs.meta create mode 100644 Assets/Cryville/Crtr/Browsing/PropertyPanel.cs create mode 100644 Assets/Cryville/Crtr/Browsing/PropertyPanel.cs.meta create mode 100644 Assets/Cryville/Crtr/Browsing/PropertyValuePanel.cs create mode 100644 Assets/Cryville/Crtr/Browsing/PropertyValuePanel.cs.meta create mode 100644 Assets/Cryville/Crtr/Browsing/ResourceBrowser.cs create mode 100644 Assets/Cryville/Crtr/Browsing/ResourceBrowser.cs.meta create mode 100644 Assets/Cryville/Crtr/Browsing/ResourceBrowserMaster.cs create mode 100644 Assets/Cryville/Crtr/Browsing/ResourceBrowserMaster.cs.meta create mode 100644 Assets/Cryville/Crtr/Browsing/ResourceBrowserUnit.cs create mode 100644 Assets/Cryville/Crtr/Browsing/ResourceBrowserUnit.cs.meta create mode 100644 Assets/Cryville/Crtr/Browsing/ResourceConverter.cs create mode 100644 Assets/Cryville/Crtr/Browsing/ResourceConverter.cs.meta create mode 100644 Assets/Cryville/Crtr/CastedList.cs create mode 100644 Assets/Cryville/Crtr/CastedList.cs.meta create mode 100644 Assets/Cryville/Crtr/Chart.cs create mode 100644 Assets/Cryville/Crtr/Chart.cs.meta create mode 100644 Assets/Cryville/Crtr/ChartHandler.cs create mode 100644 Assets/Cryville/Crtr/ChartHandler.cs.meta create mode 100644 Assets/Cryville/Crtr/ChartPlayer.cs create mode 100644 Assets/Cryville/Crtr/ChartPlayer.cs.meta create mode 100644 Assets/Cryville/Crtr/Cocos2dFrames.cs create mode 100644 Assets/Cryville/Crtr/Cocos2dFrames.cs.meta create mode 100644 Assets/Cryville/Crtr/Components.meta create mode 100644 Assets/Cryville/Crtr/Components/SectionalGameObject.cs create mode 100644 Assets/Cryville/Crtr/Components/SectionalGameObject.cs.meta create mode 100644 Assets/Cryville/Crtr/Components/SkinComponent.cs create mode 100644 Assets/Cryville/Crtr/Components/SkinComponent.cs.meta create mode 100644 Assets/Cryville/Crtr/Components/SpriteBase.cs create mode 100644 Assets/Cryville/Crtr/Components/SpriteBase.cs.meta create mode 100644 Assets/Cryville/Crtr/Components/SpritePlane.cs create mode 100644 Assets/Cryville/Crtr/Components/SpritePlane.cs.meta create mode 100644 Assets/Cryville/Crtr/Components/SpriteRect.cs create mode 100644 Assets/Cryville/Crtr/Components/SpriteRect.cs.meta create mode 100644 Assets/Cryville/Crtr/Components/SpriteScale3.cs create mode 100644 Assets/Cryville/Crtr/Components/SpriteScale3.cs.meta create mode 100644 Assets/Cryville/Crtr/Components/SpriteText.cs create mode 100644 Assets/Cryville/Crtr/Components/SpriteText.cs.meta create mode 100644 Assets/Cryville/Crtr/Components/TrackLine.cs create mode 100644 Assets/Cryville/Crtr/Components/TrackLine.cs.meta create mode 100644 Assets/Cryville/Crtr/Components/TransformInterface.cs create mode 100644 Assets/Cryville/Crtr/Components/TransformInterface.cs.meta create mode 100644 Assets/Cryville/Crtr/Console.cs create mode 100644 Assets/Cryville/Crtr/Console.cs.meta create mode 100644 Assets/Cryville/Crtr/Evaluator.cs create mode 100644 Assets/Cryville/Crtr/Evaluator.cs.meta create mode 100644 Assets/Cryville/Crtr/Event.meta create mode 100644 Assets/Cryville/Crtr/Event/ContainerHandler.cs create mode 100644 Assets/Cryville/Crtr/Event/ContainerHandler.cs.meta create mode 100644 Assets/Cryville/Crtr/Event/ContainerState.cs create mode 100644 Assets/Cryville/Crtr/Event/ContainerState.cs.meta create mode 100644 Assets/Cryville/Crtr/Event/EventBatch.cs create mode 100644 Assets/Cryville/Crtr/Event/EventBatch.cs.meta create mode 100644 Assets/Cryville/Crtr/Event/EventBatcher.cs create mode 100644 Assets/Cryville/Crtr/Event/EventBatcher.cs.meta create mode 100644 Assets/Cryville/Crtr/Event/EventBus.cs create mode 100644 Assets/Cryville/Crtr/Event/EventBus.cs.meta create mode 100644 Assets/Cryville/Crtr/Event/RMVPool.cs create mode 100644 Assets/Cryville/Crtr/Event/RMVPool.cs.meta create mode 100644 Assets/Cryville/Crtr/Extensions.meta create mode 100644 Assets/Cryville/Crtr/Extensions/Malody.meta create mode 100644 Assets/Cryville/Crtr/Extensions/Malody/MalodyChartConverter.cs create mode 100644 Assets/Cryville/Crtr/Extensions/Malody/MalodyChartConverter.cs.meta create mode 100644 Assets/Cryville/Crtr/Game.cs create mode 100644 Assets/Cryville/Crtr/Game.cs.meta create mode 100644 Assets/Cryville/Crtr/GenericResources.cs create mode 100644 Assets/Cryville/Crtr/GenericResources.cs.meta create mode 100644 Assets/Cryville/Crtr/GroupHandler.cs create mode 100644 Assets/Cryville/Crtr/GroupHandler.cs.meta create mode 100644 Assets/Cryville/Crtr/InputProxy.cs create mode 100644 Assets/Cryville/Crtr/InputProxy.cs.meta create mode 100644 Assets/Cryville/Crtr/Judge.cs create mode 100644 Assets/Cryville/Crtr/Judge.cs.meta create mode 100644 Assets/Cryville/Crtr/Master.cs create mode 100644 Assets/Cryville/Crtr/Master.cs.meta create mode 100644 Assets/Cryville/Crtr/Menu.cs create mode 100644 Assets/Cryville/Crtr/Menu.cs.meta create mode 100644 Assets/Cryville/Crtr/MeshWrapper.cs create mode 100644 Assets/Cryville/Crtr/MeshWrapper.cs.meta create mode 100644 Assets/Cryville/Crtr/Motion.cs create mode 100644 Assets/Cryville/Crtr/Motion.cs.meta create mode 100644 Assets/Cryville/Crtr/NetworkTaskWorkerTicker.cs create mode 100644 Assets/Cryville/Crtr/NetworkTaskWorkerTicker.cs.meta create mode 100644 Assets/Cryville/Crtr/NoteHandler.cs create mode 100644 Assets/Cryville/Crtr/NoteHandler.cs.meta create mode 100644 Assets/Cryville/Crtr/PdtEvaluator.cs create mode 100644 Assets/Cryville/Crtr/PdtEvaluator.cs.meta create mode 100644 Assets/Cryville/Crtr/PropOp.cs create mode 100644 Assets/Cryville/Crtr/PropOp.cs.meta create mode 100644 Assets/Cryville/Crtr/PropSrc.cs create mode 100644 Assets/Cryville/Crtr/PropSrc.cs.meta create mode 100644 Assets/Cryville/Crtr/Rin.meta create mode 100644 Assets/Cryville/Crtr/Rin/Rin.cs create mode 100644 Assets/Cryville/Crtr/Rin/Rin.cs.meta create mode 100644 Assets/Cryville/Crtr/Ruleset.cs create mode 100644 Assets/Cryville/Crtr/Ruleset.cs.meta create mode 100644 Assets/Cryville/Crtr/RulesetInterpreter.cs create mode 100644 Assets/Cryville/Crtr/RulesetInterpreter.cs.meta create mode 100644 Assets/Cryville/Crtr/RulesetSelectors.cs create mode 100644 Assets/Cryville/Crtr/RulesetSelectors.cs.meta create mode 100644 Assets/Cryville/Crtr/Settings.cs create mode 100644 Assets/Cryville/Crtr/Settings.cs.meta create mode 100644 Assets/Cryville/Crtr/SettingsPanel.cs create mode 100644 Assets/Cryville/Crtr/SettingsPanel.cs.meta create mode 100644 Assets/Cryville/Crtr/Skin.cs create mode 100644 Assets/Cryville/Crtr/Skin.cs.meta create mode 100644 Assets/Cryville/Crtr/SkinContainer.cs create mode 100644 Assets/Cryville/Crtr/SkinContainer.cs.meta create mode 100644 Assets/Cryville/Crtr/SkinInterpreter.cs create mode 100644 Assets/Cryville/Crtr/SkinInterpreter.cs.meta create mode 100644 Assets/Cryville/Crtr/SkinManager.cs create mode 100644 Assets/Cryville/Crtr/SkinManager.cs.meta create mode 100644 Assets/Cryville/Crtr/SkinSelectors.cs create mode 100644 Assets/Cryville/Crtr/SkinSelectors.cs.meta create mode 100644 Assets/Cryville/Crtr/StampedEvent.cs create mode 100644 Assets/Cryville/Crtr/StampedEvent.cs.meta create mode 100644 Assets/Cryville/Crtr/StateBase.cs create mode 100644 Assets/Cryville/Crtr/StateBase.cs.meta create mode 100644 Assets/Cryville/Crtr/TrackHandler.cs create mode 100644 Assets/Cryville/Crtr/TrackHandler.cs.meta create mode 100644 Assets/Editor.meta create mode 100644 Assets/Editor/FixProjectVersion.cs create mode 100644 Assets/Editor/FixProjectVersion.cs.meta create mode 100644 Assets/EricHaines.meta create mode 100644 Assets/EricHaines/TextureScale.cs create mode 100644 Assets/EricHaines/TextureScale.cs.meta create mode 100644 Assets/GlobalSuppressions.cs create mode 100644 Assets/GlobalSuppressions.cs.meta create mode 100644 Assets/Interface.meta create mode 100644 Assets/Interface/Common.meta create mode 100644 Assets/Interface/Common/icon_audio.png create mode 100644 Assets/Interface/Common/icon_audio.png.meta create mode 100644 Assets/Interface/Common/icon_graphics.png create mode 100644 Assets/Interface/Common/icon_graphics.png.meta create mode 100644 Assets/Interface/Common/icon_modal.png create mode 100644 Assets/Interface/Common/icon_modal.png.meta create mode 100644 Assets/Interface/Dialog.meta create mode 100644 Assets/Interface/Dialog/btn_dialog.png create mode 100644 Assets/Interface/Dialog/btn_dialog.png.meta create mode 100644 Assets/Interface/Dialog/btn_dialog_close.png create mode 100644 Assets/Interface/Dialog/btn_dialog_close.png.meta create mode 100644 Assets/Interface/Dialog/pl_dialog_base.png create mode 100644 Assets/Interface/Dialog/pl_dialog_base.png.meta create mode 100644 Assets/Interface/Main.meta create mode 100644 Assets/Interface/Main/box_search.png create mode 100644 Assets/Interface/Main/box_search.png.meta create mode 100644 Assets/Interface/Main/btn_back_overlay.png create mode 100644 Assets/Interface/Main/btn_back_overlay.png.meta create mode 100644 Assets/Interface/Main/btn_chart_settings.png create mode 100644 Assets/Interface/Main/btn_chart_settings.png.meta create mode 100644 Assets/Interface/Main/btn_db_base.png create mode 100644 Assets/Interface/Main/btn_db_base.png.meta create mode 100644 Assets/Interface/Main/btn_db_local_base.png create mode 100644 Assets/Interface/Main/btn_db_local_base.png.meta create mode 100644 Assets/Interface/Main/btn_db_local_overlay.png create mode 100644 Assets/Interface/Main/btn_db_local_overlay.png.meta create mode 100644 Assets/Interface/Main/btn_db_server_base.png create mode 100644 Assets/Interface/Main/btn_db_server_base.png.meta create mode 100644 Assets/Interface/Main/btn_db_server_overlay.png create mode 100644 Assets/Interface/Main/btn_db_server_overlay.png.meta create mode 100644 Assets/Interface/Main/btn_import_base.png create mode 100644 Assets/Interface/Main/btn_import_base.png.meta create mode 100644 Assets/Interface/Main/btn_import_overlay.png create mode 100644 Assets/Interface/Main/btn_import_overlay.png.meta create mode 100644 Assets/Interface/Main/btn_play.png create mode 100644 Assets/Interface/Main/btn_play.png.meta create mode 100644 Assets/Interface/Main/btn_search.png create mode 100644 Assets/Interface/Main/btn_search.png.meta create mode 100644 Assets/Interface/Main/btn_status.png create mode 100644 Assets/Interface/Main/btn_status.png.meta create mode 100644 Assets/Interface/Main/btn_status_badge_download.png create mode 100644 Assets/Interface/Main/btn_status_badge_download.png.meta create mode 100644 Assets/Interface/Main/orn_1.png create mode 100644 Assets/Interface/Main/orn_1.png.meta create mode 100644 Assets/Interface/Main/orn_2.png create mode 100644 Assets/Interface/Main/orn_2.png.meta create mode 100644 Assets/Interface/Main/pl_browser_base.png create mode 100644 Assets/Interface/Main/pl_browser_base.png.meta create mode 100644 Assets/Interface/Main/pl_browser_div.png create mode 100644 Assets/Interface/Main/pl_browser_div.png.meta create mode 100644 Assets/Interface/Main/pl_content_base.png create mode 100644 Assets/Interface/Main/pl_content_base.png.meta create mode 100644 Assets/Interface/Main/pl_content_border_br.png create mode 100644 Assets/Interface/Main/pl_content_border_br.png.meta create mode 100644 Assets/Interface/Main/pl_content_border_tl.png create mode 100644 Assets/Interface/Main/pl_content_border_tl.png.meta create mode 100644 Assets/Interface/Main/pl_content_border_tr.png create mode 100644 Assets/Interface/Main/pl_content_border_tr.png.meta create mode 100644 Assets/Interface/Main/pl_filter_base.png create mode 100644 Assets/Interface/Main/pl_filter_base.png.meta create mode 100644 Assets/Interface/Main/pl_nav_base.png create mode 100644 Assets/Interface/Main/pl_nav_base.png.meta create mode 100644 Assets/Interface/Main/pl_topbar_base.png create mode 100644 Assets/Interface/Main/pl_topbar_base.png.meta create mode 100644 Assets/Interface/Main/pl_topbar_mask.png create mode 100644 Assets/Interface/Main/pl_topbar_mask.png.meta create mode 100644 Assets/Interface/Main/pl_topbar_overlay.png create mode 100644 Assets/Interface/Main/pl_topbar_overlay.png.meta create mode 100644 Assets/Interface/Settings.meta create mode 100644 Assets/Interface/Settings/box_check_base_off.png create mode 100644 Assets/Interface/Settings/box_check_base_off.png.meta create mode 100644 Assets/Interface/Settings/box_check_base_on.png create mode 100644 Assets/Interface/Settings/box_check_base_on.png.meta create mode 100644 Assets/Interface/Settings/box_check_mask.png create mode 100644 Assets/Interface/Settings/box_check_mask.png.meta create mode 100644 Assets/Interface/Settings/box_slider_base.png create mode 100644 Assets/Interface/Settings/box_slider_base.png.meta create mode 100644 Assets/Interface/Settings/box_slider_handle.png create mode 100644 Assets/Interface/Settings/box_slider_handle.png.meta create mode 100644 Assets/Interface/Settings/box_text_base.png create mode 100644 Assets/Interface/Settings/box_text_base.png.meta create mode 100644 Assets/Interface/Settings/pl_settings_base.png create mode 100644 Assets/Interface/Settings/pl_settings_base.png.meta create mode 100644 Assets/Interface/Settings/pl_settings_ctn_base.png create mode 100644 Assets/Interface/Settings/pl_settings_ctn_base.png.meta create mode 100644 Assets/Interface/Settings/pl_settings_ctn_mask.png create mode 100644 Assets/Interface/Settings/pl_settings_ctn_mask.png.meta create mode 100644 Assets/Interface/Settings/pl_settings_ctn_overlay.png create mode 100644 Assets/Interface/Settings/pl_settings_ctn_overlay.png.meta create mode 100644 Assets/Interface/Start.meta create mode 100644 Assets/Interface/Start/pl_start_overlay.png create mode 100644 Assets/Interface/Start/pl_start_overlay.png.meta create mode 100644 Assets/Materials.meta create mode 100644 Assets/Materials/placeholder.png create mode 100644 Assets/Materials/placeholder.png.meta create mode 100644 Assets/Menu.unity create mode 100644 Assets/Menu.unity.meta create mode 100644 Assets/Play.unity create mode 100644 Assets/Play.unity.meta create mode 100644 Assets/PlaySettings.lighting create mode 100644 Assets/PlaySettings.lighting.meta create mode 100644 Assets/PlistCS.meta create mode 100644 Assets/PlistCS/Src.meta create mode 100644 Assets/PlistCS/Src/Plist.cs create mode 100644 Assets/PlistCS/Src/Plist.cs.meta create mode 100644 Assets/Plugins.meta create mode 100644 Assets/Plugins/Android.meta create mode 100644 Assets/Plugins/Android/arm64-v8a.meta create mode 100644 Assets/Plugins/Android/arm64-v8a/libavcodec.so create mode 100644 Assets/Plugins/Android/arm64-v8a/libavcodec.so.meta create mode 100644 Assets/Plugins/Android/arm64-v8a/libavfilter.so create mode 100644 Assets/Plugins/Android/arm64-v8a/libavfilter.so.meta create mode 100644 Assets/Plugins/Android/arm64-v8a/libavformat.so create mode 100644 Assets/Plugins/Android/arm64-v8a/libavformat.so.meta create mode 100644 Assets/Plugins/Android/arm64-v8a/libavutil.so create mode 100644 Assets/Plugins/Android/arm64-v8a/libavutil.so.meta create mode 100644 Assets/Plugins/Android/arm64-v8a/libswresample.so create mode 100644 Assets/Plugins/Android/arm64-v8a/libswresample.so.meta create mode 100644 Assets/Plugins/Android/arm64-v8a/libswscale.so create mode 100644 Assets/Plugins/Android/arm64-v8a/libswscale.so.meta create mode 100644 Assets/Plugins/Android/armeabi-v7a.meta create mode 100644 Assets/Plugins/Android/armeabi-v7a/libavcodec.so create mode 100644 Assets/Plugins/Android/armeabi-v7a/libavcodec.so.meta create mode 100644 Assets/Plugins/Android/armeabi-v7a/libavfilter.so create mode 100644 Assets/Plugins/Android/armeabi-v7a/libavfilter.so.meta create mode 100644 Assets/Plugins/Android/armeabi-v7a/libavformat.so create mode 100644 Assets/Plugins/Android/armeabi-v7a/libavformat.so.meta create mode 100644 Assets/Plugins/Android/armeabi-v7a/libavutil.so create mode 100644 Assets/Plugins/Android/armeabi-v7a/libavutil.so.meta create mode 100644 Assets/Plugins/Android/armeabi-v7a/libswresample.so create mode 100644 Assets/Plugins/Android/armeabi-v7a/libswresample.so.meta create mode 100644 Assets/Plugins/Android/armeabi-v7a/libswscale.so create mode 100644 Assets/Plugins/Android/armeabi-v7a/libswscale.so.meta create mode 100644 Assets/Plugins/BouncyCastle.Crypto.dll create mode 100644 Assets/Plugins/BouncyCastle.Crypto.dll.meta create mode 100644 Assets/Plugins/Cryville.Audio.dll create mode 100644 Assets/Plugins/Cryville.Audio.dll.meta create mode 100644 Assets/Plugins/Cryville.Audio.eng-latn.xml create mode 100644 Assets/Plugins/Cryville.Audio.eng-latn.xml.meta create mode 100644 Assets/Plugins/Cryville.Audio.xml create mode 100644 Assets/Plugins/Cryville.Audio.xml.meta create mode 100644 Assets/Plugins/Cryville.Meta.dll create mode 100644 Assets/Plugins/Cryville.Meta.dll.meta create mode 100644 Assets/Plugins/FFmpeg.AutoGen.dll create mode 100644 Assets/Plugins/FFmpeg.AutoGen.dll.meta create mode 100644 Assets/Plugins/FFmpeg.AutoGen.xml create mode 100644 Assets/Plugins/FFmpeg.AutoGen.xml.meta create mode 100644 Assets/Plugins/I18N.CJK.dll create mode 100644 Assets/Plugins/I18N.CJK.dll.meta create mode 100644 Assets/Plugins/I18N.MidEast.dll create mode 100644 Assets/Plugins/I18N.MidEast.dll.meta create mode 100644 Assets/Plugins/I18N.Other.dll create mode 100644 Assets/Plugins/I18N.Other.dll.meta create mode 100644 Assets/Plugins/I18N.Rare.dll create mode 100644 Assets/Plugins/I18N.Rare.dll.meta create mode 100644 Assets/Plugins/I18N.West.dll create mode 100644 Assets/Plugins/I18N.West.dll.meta create mode 100644 Assets/Plugins/I18N.dll create mode 100644 Assets/Plugins/I18N.dll.meta create mode 100644 Assets/Plugins/Ionic.Zip.dll create mode 100644 Assets/Plugins/Ionic.Zip.dll.meta create mode 100644 Assets/Plugins/Windows.meta create mode 100644 Assets/Plugins/Windows/Cryville.Audio.WasapiWrapper.dll create mode 100644 Assets/Plugins/Windows/Cryville.Audio.WasapiWrapper.dll.meta create mode 100644 Assets/Plugins/Windows/avcodec-59.dll create mode 100644 Assets/Plugins/Windows/avcodec-59.dll.meta create mode 100644 Assets/Plugins/Windows/avfilter-8.dll create mode 100644 Assets/Plugins/Windows/avfilter-8.dll.meta create mode 100644 Assets/Plugins/Windows/avformat-59.dll create mode 100644 Assets/Plugins/Windows/avformat-59.dll.meta create mode 100644 Assets/Plugins/Windows/avutil-57.dll create mode 100644 Assets/Plugins/Windows/avutil-57.dll.meta create mode 100644 Assets/Plugins/Windows/swresample-4.dll create mode 100644 Assets/Plugins/Windows/swresample-4.dll.meta create mode 100644 Assets/Plugins/Windows/swscale-6.dll create mode 100644 Assets/Plugins/Windows/swscale-6.dll.meta create mode 100644 Assets/Prefabs.meta create mode 100644 Assets/Prefabs/BrowserTile.prefab create mode 100644 Assets/Prefabs/BrowserTile.prefab.meta create mode 100644 Assets/Prefabs/PVBool.prefab create mode 100644 Assets/Prefabs/PVBool.prefab.meta create mode 100644 Assets/Prefabs/PVNumber.prefab create mode 100644 Assets/Prefabs/PVNumber.prefab.meta create mode 100644 Assets/Prefabs/PathPart.prefab create mode 100644 Assets/Prefabs/PathPart.prefab.meta create mode 100644 Assets/Prefabs/Property.prefab create mode 100644 Assets/Prefabs/Property.prefab.meta create mode 100644 Assets/Prefabs/PropertyCategory.prefab create mode 100644 Assets/Prefabs/PropertyCategory.prefab.meta create mode 100644 Assets/Resources.meta create mode 100644 Assets/Resources/Common.meta create mode 100644 Assets/Resources/Common/Button.prefab create mode 100644 Assets/Resources/Common/Button.prefab.meta create mode 100644 Assets/Resources/Common/FileDialog.prefab create mode 100644 Assets/Resources/Common/FileDialog.prefab.meta create mode 100644 Assets/Resources/Common/Popup.prefab create mode 100644 Assets/Resources/Common/Popup.prefab.meta create mode 100644 Assets/Resources/Common/PropItem.prefab create mode 100644 Assets/Resources/Common/PropItem.prefab.meta create mode 100644 Assets/Resources/Common/PropertyEditor.prefab create mode 100644 Assets/Resources/Common/PropertyEditor.prefab.meta create mode 100644 Assets/Resources/CutoutMat.mat create mode 100644 Assets/Resources/CutoutMat.mat.meta create mode 100644 Assets/Resources/Materials.meta create mode 100644 Assets/Resources/Materials/defaultMat.mat create mode 100644 Assets/Resources/Materials/defaultMat.mat.meta create mode 100644 Assets/Resources/TransparentMat.mat create mode 100644 Assets/Resources/TransparentMat.mat.meta create mode 100644 Assets/Resources/default.txt create mode 100644 Assets/Resources/default.txt.meta create mode 100644 Assets/Resources/quad.obj create mode 100644 Assets/Resources/quad.obj.meta create mode 100644 Assets/Resources/quad_scale3h.obj create mode 100644 Assets/Resources/quad_scale3h.obj.meta create mode 100644 Assets/SystemExtensions.meta create mode 100644 Assets/SystemExtensions/gstring.cs create mode 100644 Assets/SystemExtensions/gstring.cs.meta create mode 100644 Assets/UnityVS.meta create mode 100644 Assets/csc.rsp create mode 100644 Assets/csc.rsp.meta create mode 100644 Http/SkinEditor/app.css create mode 100644 Http/SkinEditor/app.js create mode 100644 Http/SkinEditor/array_util.js create mode 100644 Http/SkinEditor/index.html create mode 100644 Http/SkinEditor/jquery-3.6.0.min.js create mode 100644 Http/SkinEditor/messages/en_US.js create mode 100644 Http/SkinEditor/messages/zh_CN.js create mode 100644 Http/SkinEditor/stretchy.min.js create mode 100644 Packages/manifest.json create mode 100644 Packages/packages-lock.json create mode 100644 ProjectSettings/AudioManager.asset create mode 100644 ProjectSettings/AutoStreamingSettings.asset create mode 100644 ProjectSettings/ClusterInputManager.asset create mode 100644 ProjectSettings/DynamicsManager.asset create mode 100644 ProjectSettings/EditorBuildSettings.asset create mode 100644 ProjectSettings/EditorSettings.asset create mode 100644 ProjectSettings/GraphicsSettings.asset create mode 100644 ProjectSettings/InputManager.asset create mode 100644 ProjectSettings/MemorySettings.asset create mode 100644 ProjectSettings/NavMeshAreas.asset create mode 100644 ProjectSettings/NetworkManager.asset create mode 100644 ProjectSettings/PackageManagerSettings.asset create mode 100644 ProjectSettings/Physics2DSettings.asset create mode 100644 ProjectSettings/PresetManager.asset create mode 100644 ProjectSettings/ProjectSettings.asset create mode 100644 ProjectSettings/ProjectVersion.txt create mode 100644 ProjectSettings/QualitySettings.asset create mode 100644 ProjectSettings/SceneTemplateSettings.json create mode 100644 ProjectSettings/TagManager.asset create mode 100644 ProjectSettings/TimeManager.asset create mode 100644 ProjectSettings/TimelineSettings.asset create mode 100644 ProjectSettings/UPRSettings.asset create mode 100644 ProjectSettings/UnityConnectSettings.asset create mode 100644 ProjectSettings/VFXManager.asset create mode 100644 ProjectSettings/VersionControlSettings.asset create mode 100644 ProjectSettings/boot.config diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..13d2135 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,7 @@ +[*.cs] + +# IDE0008: Use explicit type +dotnet_diagnostic.IDE0008.severity = none +csharp_style_var_when_type_is_apparent=false:suggestion +csharp_style_var_for_built_in_types=false:suggestion +csharp_style_var_elsewhere=false:suggestion diff --git a/.gitignore b/.gitignore index 8af868e..dcbcebe 100644 --- a/.gitignore +++ b/.gitignore @@ -58,3 +58,12 @@ sysinfo.txt # Crashlytics generated file crashlytics-build.properties +# +/Docs +/Issues +/Obsolete +/Snapshots +/UI +/UserSettings +/*.zip +*.lnk diff --git a/.vsconfig b/.vsconfig new file mode 100644 index 0000000..d70cd98 --- /dev/null +++ b/.vsconfig @@ -0,0 +1,6 @@ +{ + "version": "1.0", + "components": [ + "Microsoft.VisualStudio.Workload.ManagedGame" + ] +} diff --git a/Assets/Animations.meta b/Assets/Animations.meta new file mode 100644 index 0000000..1376c51 --- /dev/null +++ b/Assets/Animations.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: ff84d017aa87efe40a398305f6c66f4d +folderAsset: yes +timeCreated: 1611481582 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Animations/Canvas.controller b/Assets/Animations/Canvas.controller new file mode 100644 index 0000000000000000000000000000000000000000..c28bc8f4f04d71ea40f302fe5047a0b37709b1eb GIT binary patch literal 14668 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 WGR`P3o(u8FXE+1J{RCN+?D{X1(r4iS literal 0 HcmV?d00001 diff --git a/Assets/Animations/Canvas.controller.meta b/Assets/Animations/Canvas.controller.meta new file mode 100644 index 0000000..b0822ff --- /dev/null +++ b/Assets/Animations/Canvas.controller.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c96c5f91fd684d14d9d4c09a5f34ee5d +timeCreated: 1637144068 +licenseType: Free +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Animations/IMain.anim b/Assets/Animations/IMain.anim new file mode 100644 index 0000000000000000000000000000000000000000..5de880d1d968626d61d8942698e4928938d2c2a9 GIT binary patch literal 18864 zcmeI2eVkoIdB@M)-Gn3rNtAaGmMDsX2_Xt7A>Jh9Wl1&(Ng#k=yxBdwxncL->%DiE zEFv6HFhmdpU#U`~@eQa_v~OD5XkXM?ZIudI+Y+?UN?U7NE3G2w?>8^^%rkT520wo4 z$3HTkJ#*$f-!t>fJTuR8=G?PM(n-g3O3ArD*X4l+^!dEAEIa$Gvlq@^G=I^^!l8x9 zGY1YFD3yRNB0g|n!Iopc_RuX)tvlg+tLL8cosWIvF0k{bCCOo+IA!PJK$Qc$JIPe8 zvQkn?KH8gP50;Xw4-z)X!zOa36@5uI8|NMzlJ_M4fEGCd*6&q3L#|T^HRhxJQ*b#0 zht`p4h@9=8j&sGdkG^(of4brsa-ID4IbICKP~HB`JxSIy?XwTv`ad(MFZ(|$;H6|W z#&;i-(!Ph2XVjt-`d3;A`|u#A4NGO0_bU6Hh&E`OBgmDdZ2jKkV$|J%gZ+L^z)Q(m zunUwtNsiRjIyvo2zS8hHIP zxm=F#C{;)DYjMf(vHhdTvz+%NeF@skc0)wYb>{L?GEMdG3}gRe13q2Y|2Xn8GLuU1 z5UyWq|KlNd*GDh-9gwkqSK@qv$2nJfz}^Qr=kLS<{y5g(J&@DxCn?^KT&GepQ`O&# zOV)orj#AQ(Tqnyvic9j7aTM{78%{qf;`bWfAMhCo`*%O&?BA&Ym;IX;;kJJ-h;ZA# z7e=`4-)RBY{re2$?B9z5F8lZ52)F$^J;H7OUJ~K9e=iOA47Gkf4>{-O48@U|#Pz}T z^%Y!`pNYd=U*xp^!;o`)FH^i9xlVTe_u`WE=i?}vUpu}95pKtKR)pK}Ax?Si>;63o zIs12Zz@_~cMY!$X%Ol+O?-dbl`*%*jrz!jX0CL&~&pFS&nm=Xuc@aJxlfwG140xZ4 z@5g{M{=AAjLuL}*vFislS>$%Wr^wF@FQ(WtYq6!$ssdM)|Ph zgV0a=QNAYN(-bEp$FtaLUypA$AlKI*d4|j+e|+m8XFE3e<693P=U3w88Van z`MnJCZsWh4+*Vd)IsPjGF6Z|(Hn`IH+6ZU|9=(&>;DzXG7_Eq{ns{#U2fN(-G2=QT&}-i@-i}${PmYY z?)J~!f6;eGJnrwmMhp1kSReO5J{!k&#ru)#OME#9`OZ~5paI3!=;Z}bu;BtS|Rvej0{{CnJa(DjK z{s{Kt{)qjbRJ)c#(`8Nc2T;nsfFMYz@f z#(>NH&Gm{SGl~Ak_+sP74UkLwX>Rv7S-|D~=1t_h$t1Kdo{u*|F8x;Hay`viFznMr&ehRh^C zzWo;D-QwFP$!%p-mhtUVlx6u1etdht<9>Ym?SRYp_8@r~nMrLL)t9U0=a=(m_iulyc)zL5du9LsEW&O7 z|2)EN|GyM)8Q;DfaH;<*5pMPWMTA@ZUk$j7Z-1#cGL!uH_BF_*{bYRmdcb9T`z!Jc znMrA8@(;|1rYt z`^)1IZr@*?2)JJV2QX-^kAEW1keTGK|9^&D&aYhmKOnc2Ravh8Cj&11?_bC>WG4Cg z{}u9X`u~mGR#s)H|AztZOHRbM&6z#g{{LRUx8wW5T=3aoKMJ^>pJO2B{QZaG8FHQI zKkoP2|Ag58zRKUsa&|B#oFndI;9{ugqoe|oaO=$`}j(|{i)zW@EKfKQq4f3*M8 z0oTu0YyY1so*~zX{_EQR8HlC*<@!HBp6R;G{q@JebsK+)Jg<(jTz@?Qm+QZmJj)yK z_4kpNT`v7^TF}1K&p3d;PU8H#>;JFwCcP*##W;XPd!~L*a;k_o&|wuL9@#d5+@!DCtE1*@OCfaY_A0M!4O-%!zQj zf0-L_t$)Pme{R5~{^v!w)qhlkTm44|yp+_T`&JzEZ+?eMG8`r$z9|3ykm1J$yjT2w zbsYIVTbpZ1|Nd^@?~YgcbI$$6gJ_%a=LCpP2-?@*H`p)QpWo@+#Q4eYQ+z&=pH#pZ zA8dSne!#VV*!XZVxb*+&B0iiFaJ|02fH6>if6%`Ee(_~+qEjRMA;ag9mvNY6?f)n^ z=jR3FnWbz~+W&{l6&S(tlqJF6|@z_jHf<;O-x>?>H8q{g<%) z42MY^-?6>;u8)KIUmEDw&o4Va_zvRf?-lcNX25%t|E@y&oS&Bk?Q1?{`1}a38@?dI zuQmLv2*2I%g%SQ9!_O|@YhkgEfD@O_5AJi@i?nP=SFxh zj7xN0gdcDCDee%|ZKee|Jg1 z<^GcY3(`&hmV@ZOENEZqzdYb_e|bd#clVdC3AlVdU8#6(K+cc5zrQNr`uCOFjQ_uu zJg*M>OaI?WzR$J4^#9kX_9b_JU#WQQ`~JVp;Lr#xBlOV zaO?lC54iOICVAFTkG@F%Z;_W>F8#k9v@iW{BH+^hCl8|knuF-y8MH6;^Z$tO*Gc~S z<+TOe_5U{nT>AfYif2yy(*NHWaQ*+=d*J^-$@R$iJA_T#A8`NkIm2%tFI&nwI(~f9 z#E*>aXD*lV<4xrITrT6sjpR8-xi|SP+P1&Xyg6vUPwj8*^Z6}7eLcTVn*QAs)R*h) zX7Y000sr@#w+8LY`P~(8t>5{CembQ zGKK%!xhARBHjULAX;PnP>jJtln%3Hb_2D$RCWXd!I;<|LwJqwBx0(`0(o6?xBh?zZ zgx+kZx7yC7?cDn2aN0~77_=Ca#isB1XqVQi+3|*ZLFRQjMO^0Avh&N+6 zEu7a)j1RQaaTYJEv@1B_u1(czX`o9vS`sxn7B+H#6tpYNHqI+1#?q$ggKm0}x&p#@ zs*ZJ0XQ(okntL&yWA#egT;=7Y(r!1a+a}s+GBj3cwJ_1Gp=Px~U7T@Kp;J`Lpfg3# zQ5kQHr5iDksIaA3X(;PsO!bM{FbA+4(*t{==UiOvBsbSswXv*P8?M$ym)F&TqR!<7 zQp|ALtPYu*TgfVMowTPKT&P16t#*BUGcJ;9EAMZkVFoc+X*8fK8JuVh!7R{&$*)7D z=+UOM-Ns!lz1#)jYF|1GN2yMx8`F`rnZgBNbk$ajan`}q^mWShhAFOZR$&vhde)DO zw9@wFxOZ(jnU3MSdSs!1Srkv=(YO|^QLWiEtGF1!QlVR*;&NtTU z?aj?ftu<0_j-wTj!8#XxzM{G4R!qXIt$eMi>ttl2HpF|^F}l>Z?SNkYFqN# z)q3OH)q4aQp&t%yuQvxPJLm7j_0c#G7Z@{I3up^_0r`F$ZnFKE^~i@Wu=1k*bmP(f zRBOLp{W1387Sftz!KUhPx~ewp<$g#k>*vAN!W z72@mT?)P2Zb-i}u-R$se^=mt4Hy}dXFlvk*`e`wD_0K}x@vQ@`r3h!(SP5VCqXp~b zskrStMildd>0UpXHpePc;;Vt##wB&1a%6wu05kdRxUoSNDF?u07fL{^Y7k$Ips%cjGbL^s#57 zTlb}SE&VdpSR`^``MjQ=&(N&8W&-B@^NPp02{p8cLo&&B@%jLK7N literal 0 HcmV?d00001 diff --git a/Assets/Animations/IMain.anim.meta b/Assets/Animations/IMain.anim.meta new file mode 100644 index 0000000..98525fc --- /dev/null +++ b/Assets/Animations/IMain.anim.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2162866fb7549724a85cb3c854a136ad +timeCreated: 1637144548 +licenseType: Free +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Animations/IQuit.anim b/Assets/Animations/IQuit.anim new file mode 100644 index 0000000000000000000000000000000000000000..9a39e8c3547e5e86ef4c0f0d9726b8cb3e68b2aa GIT binary patch literal 15116 zcmds-d7K!M1oNy;Dxt{t|uU(0*VJ-prGJ|isBuAzdEM-RZVUF@IULbT~qzOUGLTPURQT- z6t&V`tx|N{zjgV02dZr2)lsT)l@+2w^nuPOy}J;lU64>E51YuD z7IsA`ThxI=@{Z`I(8wOJey8Foa-9mOF%9|;#OaPWw2f3leZ@!f?yr4^mfzQRn54-ayV zVWF7koof8{gAR_(uHWZK<-2@Ri*IAwyq6w;fuQ203#p4sj`0q_#L}pR}9>Vo&$A2Hl^XsD%{5r_kzSrV+ zUx#z9HiNwra?am=ZTM4If44x+ao=C@Zsa-@qMcOzEjVTUm*OZy-N<#a`~x^8KLAHN z{z1d(XYKe_!@E7cW5o8|1v%UIGLOslO$~6{zJmhXw(sBox9vN`2W&ACYXBg$q=vWBOiFEv( zOP*#I6fi2hzpXI#=XqTAe?ECJUtjir0eOZ|mi=Go@vdksDhwF=i^$VV0pmaSFI8~P z-^t_|Mp@q|I+`@CO38YL;wFA z1lIpcl%*s(x%;p65a+pFe|G=X=W)6I`pJvPOmf#>40*nN`TZAtcfjH9{%f!ee+uj4 z7RV>z*r0efa-H1!YZ>D4?ynf9w%p#o&h(-Gs)c_4MU!vf3-it_;G*4_Kzsuja(;p{?3PZ zy!pEzz-{|SJ+8-(`yblpvr0StTOeordVPS~@w+I%t^JEVF84Q=D2~h|`XA$qjUSgn zF2_%EyT3_2F84QYAm>FULBF^^z7cZizw-Wm8M&>j%JTkxxyN;UyAPEZ->x7}k(uPi zw<{qZFTTBr+*Vd)8Q-p=EX^)(y}>8@W!de_RJ~yY*|==k)<@*XIo$m+|dJkIVS-)&RHm-xlE3{@Xn+|Nx@5Z+~ z$cxBK;`0gPt9?JT6>@1`#J#FF7gzaNp5`m5ai>v0+1zTk0b|BC@`?T-bxwf`lL z%lP(X#gUoh#<#CP?#?gg&+gy8s(81l&1+@*zZT%O{a+7o+y47JF5}z%9+&nX2ykov z8v$oAeXE~wm7LEh`Sw}= zWLzQtd4O}>lRwdhZ;rJ8l0O;Xv`hXAkIVJ{%K*2}FHZ%yeSUe`<9hvXL#Meuenp-l zGs#{5zlL1SuU!AnklV_tEZ6_D9+&?28}byHNv{3hLO!1T-;vwOsx0mQ-s4@-e)zVz zQ->b^KeXW+@O@!-@JV3Ld0fxWUXXMC{-}70TqpWZ{`>8pAa=j6^8MT1(9iMzGkL1( zGI#y|dCJB}bmIG`{Ql}M5X=5|Mu$MR_5Z(;r@Ah4zF(vLO(@eo*OBD%`Sow)MPw$q z`@6qGF6~c@rW^Z{!T#a#9mMy)f41SH=KCMV|6d;0_g6dq|5iLjt`q$?KmPxLSdPD3 z|J%q@U6;AL{@A(k`d=W=s-rB|Ux&x#`tKx9GX<{wF7jfYOaGhT>6i8y2k_TQod5j# z-=Pi9um2rAF4zA~il;gKa{ce@@q(KF*;pg=pIyN7iQjLyzIzOx)Q02wbPf34DD3L- z4)y-27or+$UyXzQ&F^qgio+zt7v=xA89v41o#Oq~-sEGpHrJAV|8Ae}_EGjT&i%#R z(9QU>FU0$L`t|n>wu|G>?{xXZ_{r~6yg!le--a_j*!cWXk8A(1@!HiZ&d^phK zdVPNheW3krPrv?taX&cG%L4pS!>5uLahPPs|7YNwpM%I#OQ}U6AHz=w@L7hxD!`W*eqw<4 z8$LV0hYf!H)eZR~huh~LzPH5?MJEUNEru@+@VgA}32^&- zbxIq~`@4O+~2M7^vnI-sUDa6Oa3p&c=p$A$Np)aerf-7kIVh# z8EtrefB71Z%lp%770(8c^ON7-pXqV^e&rhD|F0v@s$=}6|DQ!ZmLGrV|7R=xlIP#A zlpOu8|F3tr>;HWom;T>RUd-E<|9=vbXV~-q0f)Q(KN#TF|2G7<_5X5!TmL_&4bS`k zxdCqdztVHmqRU;5v$$EE*|Y{&lj+p&Lvr(fFV{}JJ@mE7mc3)}F#|G(bj(*G|~Jk9Bs{(rH@ z_5W{ghW`UammuSN2%ES+;Qr?x!!IQ-TFN>)emr90M@s!^p3C_02J*2ym+|9`pcDX`RhQ# zuMhAe4Zp$Ry}e0e_QL*hQfn-{Ac?EZa;-Wi8aiuHxf1s*K%uvkY(PO>*V~8(O6z;7 z&7@TAi+S17c(Bwrio*QbP`wd1n{hu*PHo1E%Yz$M4wowBWOV*;VyM-JV^~b$esxl=u2ZMH)RfSZM%+^!C|A)Ww5GS#Ome5TaVr}AaU-gu)1p%ro3>}Y zom(vrWxb+aR_!hIog4ShD<^B?K8!5HYtWr0ewPmq^(65SiwjCg2|u`Mb@@UL&|3DE zMD>n^RqP-INvVXmpECK46aHA;0g`sh<_xZ2MS%*XU# zJkfG4t|ZEat5UAdD_8r=)xr5SwV-Hoej6!fIBt~t%*D;t zsNBrjTd$i=EGyOPuoW#EZuVhVU9cyPz#=t$hClt#stfhMGFN}_10{)v3s8n`@fo3`LzmHLK~u=|A3 zDSzto!PEj`zBH zdNzuhX^&pORVoj5Lvb^ygkdOQwP*~Y7*ROKowM1|^ zku%Nfh|)>;Y{MaWTl5pO$R4nMyW%NwoeHQi747ej(+N1Vj#NYBZ2xe4mQ4Gwb zlZQ=~FNc8b?}B4;5t&KkkHWSx&T0Ry_$;Ibvh4J4H_AryT=s8wRY&smIA#CX{>#YI zjJHJ{5!y^QK}61Vmgj|NoU-qgX8iZ`_;@k?dyyBBnN)y>aQ)ix-y8D$`e+Bg6*AiQ zT72%~aL(0cus1=@`J2*$KZEsmH{=}meHHISu2UhJsOoRQDeLctqY!l>*U9pGaZ3Jj z9Ig1f4X2;A;`bTe>G25>?b`}D?K{BZ(!K)&+}d|gfLr?x4sdJVAs*NEeHe1ucc{mu zeTN0OweRo%xAwgvz^#2pczl9dKc9x2^Yco@k(tEx!S(eOoRc4kBfq}LIsT79&i);x zcqek5?EG)RDeF(g(Q1Be|E2}F?cekOxBWw$a@yDSJqbDOJKE!N{AUKZweOe!xAq+y z;MTt5JU&j1@2?@}_~1V0jIZX;8-7B7kH@62{;NFRq2l`<;EX@7CQp%>g!m)k%ZZT7 z_%dF^7v9z7{Erv$-Nx~(eI0+N82u-+erhS(lJ}QW$Vc;B#@`}&hEZ;hj)UO*NXOsV zl#H=aLum^=1E0CC@O*vj6iu-Vv=tg+8NyK6#oo!1&MoO9hSwXBg!jqI;m9<45^IkB?KFkR117r+wYO zO@Lfqi^)@DCb|7v0y*2U$?e}#06G7%f8FFoTbpgk{$a1-v@iR&%;VaA?l)<_+DD}M z_T~Jn@am6K_rJSPpYwNSfNwE;Wed*ziJjk7 zHRMHPCeeQw|80EY9zwRSxs6ZfcwGDcR#f8no=cu0Gs*S;HIU2sm;Qeqxv9$!`u~Fv zSpP3kmXhe??!VSToac7^+5K0K$L0F#B`+c~$z6XjL2j9ynhY`xV?W?0^I7adR*)0 z{)zf)9+&zr3~;Nz9^h7g!{c&)lqinOBzJ!_1bKe`)&2wZr_cxa-j?5(bALEOSA6Gyw z$4_&+zeznV_cvFP^CFYbzPLYL1-bNJd4Io}+*Vd)d4Ipg<2t^536&V%t|d>AndHW| z>mVO1zFkjlE32}MZyP8}vkTn#w$b5keB0!48Q*RoFCsI^jc+$Xp1049Z#OyIjc+%% z;Q9D=i{hQgb#ndVR)|}zU%NhU3vjzWZ}+&2Z+CcH#+TOxxYhsq0Jr+z;Bgt>?)13S z|Hc5f`uQB+YJ9BzH+x*hx3?&c%p^Cy-357m{@wWYR>eC_ZC)$w=Y6b|eb)ZB1-P~U z9*@iTw%OxS|JwuH>VHRoTm6ia(ta7=-l;e;lic`5J#zeHe0!J2WqhL@dH;9g+k421 z$V}q%3FE8%e&{~PrG6RT?)SKkZ$CgK#<#8HDKeAX`1W4N$BJ+7Be#`RS;n{bQ*V^!#~_yL zORrzMK0hAdc71-r<1)TI=yB;EpA2xT|5E{O^?%yqGQNGr<5K@;1KjE#4REXfA&<-W z_ORl}OmgGf=OB0Im-A=$Z=YAZ)70j*(*7?5xV8U_0dDR8lE-Cy`?ANS{;veM)&JE1 zxB9>4aT(vft~fH2-1znl$mRIS`1VbY%lP&!@)Vg#ZhZSTM`1XB=yYcM@9+&a$ zaq=QElic|BL&)>?<>Ol?*b@$S11 z74oM7oa>(ar!DyANc%7O(*aJsn20aQpo7On}?xmtS~Xum5f6G}p&3$x~z| zx$FN|kjwd%>;Ko}wz4YA_5ZBLrT_hgJVj=btN*u2GA(V3%(BT7j^-k1olUd>-pIOa?anM6i<=sME}XZzx^}B?)z1K|F##}=lK7HJk@oX zyZ--I%0@|a;`dMa{ng(fmi=#!4nf=2|DPjIbzSECevSG!p-lZ;N0Q6u*T0h&k(uP~ z@BRU~)IUC&X7o=6`=`fu5byu~)q;79Dlj~ zw~?p1E^~MNv2$bfzd)WL{$cuR{{coJtzSPe+fWKzq{O8yI z4lQ_o{ZH_?T>ldlPjl_d^}nOX3u^vnVU5s#UILy^e1FdM-DUWs797{7E5P?c;iVpL zQ{Nw+1J3oclj5By=|un8jQU$}O8q+rxZS@@4sg4F*~Q~pf1lC6tH-7O-2&X|-#x&s z{+D^Y5LKc3MjZ5SzK4ra93~;YDF1)E;d^?#U3`DF7x}2I&9$Vzf49$fdn^4J=lHp(JeAwUP zdVN2HK2U$B*S>y#@nvwL0|NXJ!w)1c;xNgM|C8XHpM%I#OWCFz|AW2ya{LeR^mjxY zAC5oQ|Dhh2{(Bg>93SbwhdaCtSO1Z=me#F6QS*kGCoRJq_)1evb0m*SyE@sR3R!d|H67H+*`4-(vWT0Ke1lqg(Jr7_oPP z6U_|pQNxc3@UIzuY=D2?aK5X~C(aM`|K9N91H2uBOLRhj?``<20(_?7uMY5qhMySV zy@t;U@FBxbA}?k=w7cPNj~V@o1Kd7eE%CUHe|&CX|M@!&{52EjhxXa$tL^}| z&sS%7T<$NIk*Ce(p-b+smy;LsT<-5yc&(R zXfLs4RzXi|x z{{;bV{ePeZ-<Hxb^>9fLs5+(Bsno>*Q%uJ#3Nw-ykpM zx%B_UYhU``kjJI}4{t~RMcdJTvDd!T&)*T@ubJHE%k?dI-v2N0xb*)^6;E^ROaH&j zuJ+pRQ2SeZf4;`6ujlt!W8bx2eYw7_BQItKxZmGg@3k-IcZ0{Zerx~6 z?dadM9sM_W?MwYPdR#x>JdgfQLbq=6xLiLsE1ot7z`cLm;&DCxlgH`(!L45V`uS^r z!*2`lBMraZ;oaRyeb&6*a#F3&yEus}jdHbeax}PRet977Iu(WPQnC&ObzOHo?klbB zsx*>Pr6=ZPi{k!L&j<>0tAn+A+-StTI61QsFDUn~J7cIcP)wUK)&}q>OC1G%yrL7e^!b-Ofc(xw3qqT8pFVP@)Skqd%@B zi>tkHbWseAN!+VW%9T~>l$V+kdQy+ODt+Y&OoBDt)kcy#wZ<*2_r~?8hE9u4S!`_2 zdON#P9?W{hc3HK%)N?`HJExqijC(M$5U)UY8u(l?G}x8IgDjp}N=o>^Rm;okIY2Af zTN2ef7M8Jt6eOj3g3ozF199Ehpqrkl&VbOLa&B}{r>8U!n`<$j1JzPu&a!e;N|Jhc z?NAa&Jp-ji0~6iosh4Zi#Thphnnkq?no|TFrNP=jybKeG3ajd+ni_rdsXA2YWe4VB zdN7`_oQo@ovf&yi*XEQfz2!>(+^Sko)H%0>6f+#x%RT1eMs%7ukCKrZ7i!N?BdHFq zz)4hYWcJo-rW1=xwHkCqi-#IL7#8TkqAp*^1_(n>UPM zZDearokx8`l^$NZgwdtC_I!9|HjgF79In(p`bl^5v|P!Zz=Ip5{&;DP%`{X9M>LI! z&(@mZoP|la6}*@<5tX}|E0HZxi=Wyd!na-~rKeyQaRrZlBf0;+`%dPual?jLkOw*2 z;6bx@#4)(0t1%lxg`lne9nG4ubU3aLltw&j{?|54fKAp0cO)|1xX7dp=2Q0H(kOCy zzW*G1gue1{HJLhsa$fgSSrfTZZBFjQD{_t&zc6XSa|f=zG!Jb*?s$0SzGJb;kG;TO o1U1uBDDB%k^9y>eb8@Xn<^NwVd4I{q$XyTa7`pt$trxBLztoi7xBvhE literal 0 HcmV?d00001 diff --git a/Assets/Animations/ISettings.anim.meta b/Assets/Animations/ISettings.anim.meta new file mode 100644 index 0000000..3ce9fdf --- /dev/null +++ b/Assets/Animations/ISettings.anim.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8b9f1682ee8026b468ad15885e1ff6a5 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 7400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Animations/IStartup.anim b/Assets/Animations/IStartup.anim new file mode 100644 index 0000000000000000000000000000000000000000..71a808d8979d8896be741fc27dda8efcbb9f5981 GIT binary patch literal 15392 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 literal 0 HcmV?d00001 diff --git a/Assets/Animations/IStartup.anim.meta b/Assets/Animations/IStartup.anim.meta new file mode 100644 index 0000000..df47c85 --- /dev/null +++ b/Assets/Animations/IStartup.anim.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9d0c0a0c88a0e7a43b77b0065bb64721 +timeCreated: 1637144134 +licenseType: Free +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Animations/TMain_Settings.anim b/Assets/Animations/TMain_Settings.anim new file mode 100644 index 0000000000000000000000000000000000000000..1b471ef829bfe5da07aba6f32629c035ee8d6d21 GIT binary patch literal 15748 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 literal 0 HcmV?d00001 diff --git a/Assets/Animations/TMain_Settings.anim.meta b/Assets/Animations/TMain_Settings.anim.meta new file mode 100644 index 0000000..a953c70 --- /dev/null +++ b/Assets/Animations/TMain_Settings.anim.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 961473ba26b4b1942806c224266f8db7 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 7400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Animations/TQuit_.anim b/Assets/Animations/TQuit_.anim new file mode 100644 index 0000000000000000000000000000000000000000..03fe8cbf6da6511dec36231a0f3c352d75ec6179 GIT binary patch literal 15116 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 literal 0 HcmV?d00001 diff --git a/Assets/Animations/TSettings_Main.anim.meta b/Assets/Animations/TSettings_Main.anim.meta new file mode 100644 index 0000000..fee22ac --- /dev/null +++ b/Assets/Animations/TSettings_Main.anim.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9f6fb5723dba03d42b9e8a3c3e9091a5 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 7400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Animations/TStartup_Main.anim b/Assets/Animations/TStartup_Main.anim new file mode 100644 index 0000000000000000000000000000000000000000..2ccfb7d330742ba42f452056368bf9023f539a6a GIT binary patch literal 18240 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 T`IN71edU4peE)j~E%W~XM-NfG literal 0 HcmV?d00001 diff --git a/Assets/Animations/TStartup_Main.anim.meta b/Assets/Animations/TStartup_Main.anim.meta new file mode 100644 index 0000000..9eee4e3 --- /dev/null +++ b/Assets/Animations/TStartup_Main.anim.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 63a0e2075f5ba8d489d8cd318c14720b +timeCreated: 1637144068 +licenseType: Free +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Animations/T_Quit.anim b/Assets/Animations/T_Quit.anim new file mode 100644 index 0000000000000000000000000000000000000000..d1b896b6aef11d64689f7d8f700632c5d863e68f GIT binary patch literal 15052 zcmds-d7KK)AzXw|6rzJ2TGoE-Yt*iV{E& zR6Gy~29SUk-XOYo0Rk$Zc%ULGD5!{v;2nRzI;Q(oO>O@0KkKtyQ~kbO@748QS9fm| zwbHh&Qgp<>b@}MW_3x1fTXx97hfJM3ZSu7Ksl8L9|EyoXzEA)3oZBB%a+@mn(b(bh5bk5@cJ zu9K^u{Y6&{)%vgMh|-49&o+$J{!P64vi+NSyb#Sr|L%cNj_+pVDXr*)_7$dLe0Y#^ z3=73P?^NTr6LfHFHYZmjW$SlFC!_9pIN0ttdAtxU06R{}qv*}LS}W)HlFu=GB7S+; zWcgAEsDBF_6N|`9BL4x}R>nEoza@SPsevpz{o9JN(L9&^+gjC;{34vPf7HJXd7AN# zs4IfbbTvfeTxWS+h{mb*9bm?PJCBbSloV9+SfQM|r$U#rJK&8Gnu@Pm!5~_#@)WF_6pn zGG4@&W65o0RUR+myN%=a5*vSaGWMslPHHK2$@|OkVEpI)r3%jZ zJCQuYDC_&fh^ar9Jk2hEeKCLY$cuR{?++)DXBg#;qT67f<45^?kB?KFkR117N5Agh zYCx{9h2$wRlidC-f}DD6a{IR!K+eDHUk`cF)}}7mKkPLe{jz^cJg(c%{U+P5_7Q1b zznq_CUj1?E{&x%NbN)^V@U@1Y+JC+W|HgwDN17EG5y&-G8lwIM40+v-_`JkIVJfM_xo`lDqz5$n)*X@4x7~{SJ5cUjuFU3s@hw zLOub*U^F%Mg!sf5kYp<@Ww{zQ=L@gnjO>XuslddH);?aC`r(2Dr6f^SHLp z{S)oiJudCPCBUuyMu1!UO^?g{QKC39lidB$5ajv!SNkK3ANNOW|FGiS$aQk(?*fR& zn!gJJ+_rzj<9htK|Dk<8tF+U<7IMa~iv!$_-z5QV?O*C~xxcwgabzaZ{}^9v{J0!) zIewbk{Y~m|xxcxBoEMn{{o?+3CFIh7<^BDwGjg_IC0VnMrPZ zy9)BL;@dmOZDm!K@$H?IrP&2;e7oA=ZhTwqaT(vPAul2`$&GK-#)K+H*%d^|M&vL za((IbYuD!&1Kh69FL_+XxBERV{o{cExAwmr;MV?w9+&a$D;}5jzZ&4y{%C+(`ww|s z#<#C2j?5%CzI`2XcYZm4cK`Mb#k);yUMt)G%>cLU|5kw8_CM@#8Q&i9xU~OhfLr_D z4sdJ#F^|jm_PFB6OmgGf6OhaClkx349+&a$yW}Y{lic|BJ;nN|^jc-46xEtSo({>uQTUGiUfT(19L2e^HHc_F~<^UI4K*Xw^hI?eU*8}byH zN$&dpE#z{3<@$e#+*Vd)x&B}Fxb(l@k*CN^a_#>f^0Dmyf!tPBWoiEvk9S2o;oIgW z9eVu#*oLpd_k}IMCxE@`aXmlVLeBa7lj13Io#;RL@3()3*!{lB_ix)nKga(stfwiSM8C`>Ve~Ec@RX?FHS||6eChbzSCszefA3QKo&aBgy6S>)*(W$V_tg zcYlXm+8-ZHG4>~d{lnuMiSK{^Y{N&)_dkyRzdWw*uXg79Dlj~ z*ORBZE^~MNv2$bfzd)Wgsu_;w!e6z{LLCm*%7xt8?%cl&&|gR-A-?l10x zZpNP-A>Pr`ufK1wT^xUYr^_eCPkx``{fT_%Hk|Rn#^+r;uKmNthh4#?|Bn~(VKOXEe*OL85pbg21N>>jCy^I%m}JNQIdIO;9^|Q|)G5b*Pp`fl|Ghl>T@lBJ zieL;3HC(9iif$kVTRui=veyk_{60Kdrag9H3}!>0!L&4wS+hA+T~-2qNC zEx<<&KQzD}GyJds|DoahR-I3rAKHJ#@FN1e6N5{1WPtBr_)!5q&G4fGe7@nw1bCm} z#|HS2;m45|vmV;-|CfQ&zovuB`>XT)pL{f5U+%Ap#$WpX3i8qX_)GskSLv5L|9++9 z=y&~prNdqS@AbI!|330!-oE_*lbAfip8xkd-1Yx~0Jr|XD!{G(mjm4T|9NeA-v7@J zaO?k-HhfLa{|5uy`al2A34g6*{oDF~Ex@h+*8|-8|64pR{l7t;w#=g~(*K*}#XOh( zpLqJE{|$Lu`v33->|d|}`xkoprG5S%5&l}qeZIV?4bS`k#U7Xbe~IF0PQUd3OFgdt ze|ru5A1JyE8Q(+L#Qg#HKMxpwIeF1i*3t3fDHA_Z>QD1r#*Zt=NAq09k1NSDjB;o6 zEOguVGjH|ucd7lYy+6OrtFPzxWz)X5d-dh|x{AD*HNbs;^A1nHoZokPT-&$pzj_1q zS8u@nHJ*NH|5}gh=bJas{|V^Ubsm@N=Us}YtpRZFAJ=^E9X_4 zNvYZ!^Rfl;K&f{Gg;}-1dLwQ&<3606(v0Vp2UeXtRH~Gdky%5H;TX~-wWO3ly*h73 zph?`QT0zvSE}I{Z^fyX_ag>yi4VNlIadcrcg8$pOASzdvR%-P)stqN&fMyKD)ns9< zFODvVVKIsO)JeIzT%Gb#Q$kM~@w{q(xr!#CH9fUvk~_7HTioc28&Msd7M-%#v_0$X zjB0r>>lO8~YEP;6{J3vsIXN}%#mGXu4BctschS(`yd)lE@q|)R!Vj)mTE2(_bSisG zqI$=|5_XV+q|`|8JA0@SH%uF}>S^i>2>mJNMi+H@OO@DMi}|e7N{Knk%26pv8s(Kk zNgVZ7O3fxFy4l+(*J+D0ZYs2jY8kYq2sTQC^-8=16Nw7T8>PA$ee|g|RPAF2W?_0T zo@hB2R}y8zRVmkJmaBc`>cFg;T2Qn(tBn*h95>3n=Hg~_qBxI|kvbP@?@%+T4KBk; zRBmSNt=CN_7MALD*oqboHG45Eu!G63!K7%>(l|+QRZ}l_fw=5ayqVE5D&){{LUIdJGB^Rb4$&(##y1( zQpn=WN?fH6w#qpxd9htD%BHPng{Pf?OXtUN9hC>l)lx+&$rD?JdfLgAs=3M==QL`A zbK;m2y|CP9D8JC5r?pJg0(WHSyP5MPwOX>QQK~lkYmGr@0a;k%qR&<|7v1b(3~Mu6 zYwA4eAFB59+C_{mwUy_=GqZUtG3Ick_R~*#TBqe|?gSp(EDgkq>r~TJAso>(D!yEA zg>x2e!K())@!RvV7?i6i`V{pa1 z<_ru20x}-V@who0H!7u(oGu8FWEVz@c;{N2q(~H5-S@29e>!Z!c6&}8JZPJ?;6Ii6 zs*qaYq%$tbq}h0oZF=`JXXjaaJJ}VwFWI>n5H-ZK_y0TA Hy3hXw$9a;Z literal 0 HcmV?d00001 diff --git a/Assets/Animations/T_Quit.anim.meta b/Assets/Animations/T_Quit.anim.meta new file mode 100644 index 0000000..0424cdf --- /dev/null +++ b/Assets/Animations/T_Quit.anim.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cc249d3462d795b46aff263bc04baee2 +timeCreated: 1637144561 +licenseType: Free +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Config.unity b/Assets/Config.unity new file mode 100644 index 0000000000000000000000000000000000000000..2f4d2c6663bfd3b0892c07212d04e9671d2599f9 GIT binary patch literal 18732 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 literal 0 HcmV?d00001 diff --git a/Assets/Config.unity.meta b/Assets/Config.unity.meta new file mode 100644 index 0000000..688f8a1 --- /dev/null +++ b/Assets/Config.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 215ebdd4cb9187741a2e24f5e7d8511d +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Console.unity b/Assets/Console.unity new file mode 100644 index 0000000000000000000000000000000000000000..021f929581b14b1bd1d65f095536a22996e05422 GIT binary patch literal 37144 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 { + public Action CancelSource { private get; set; } + public Action Destination { private get; set; } + public void Deliver(bool succeeded, T result) { + if (Destination != null) Destination(succeeded, result); + } + public void Cancel() { + if (CancelSource != null) CancelSource(); + } + } +} diff --git a/Assets/Cryville/Common/AsyncDelivery.cs.meta b/Assets/Cryville/Common/AsyncDelivery.cs.meta new file mode 100644 index 0000000..792cd08 --- /dev/null +++ b/Assets/Cryville/Common/AsyncDelivery.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 857c1f0e990462a47bd0ed83448f923b +timeCreated: 1637755775 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/BinderAttribute.cs b/Assets/Cryville/Common/BinderAttribute.cs new file mode 100644 index 0000000..1a0ab02 --- /dev/null +++ b/Assets/Cryville/Common/BinderAttribute.cs @@ -0,0 +1,59 @@ +using System; +using System.Globalization; +using System.Reflection; + +namespace Cryville.Common { + public class BinderAttribute : Attribute { + public BinderAttribute(Type type) { + BinderType = type; + } + + public Type BinderType; + + public static Binder CreateBinderOfType(Type type) { + var l = type.GetCustomAttributes(typeof(BinderAttribute), true); + if (l.Length > 0) { + return (Binder)ReflectionHelper.InvokeEmptyConstructor( + ((BinderAttribute)l[0]).BinderType + ); + } + return new EmptyBinder(); + } + } + + public class EmptyBinder : Binder { + /*static readonly Type[] emptyTypeArray = {}; + static readonly object[] emptyObjectArray = {};*/ + + public override FieldInfo BindToField(BindingFlags bindingAttr, FieldInfo[] match, object value, CultureInfo culture) { + throw new NotImplementedException(); + } + + public override MethodBase BindToMethod(BindingFlags bindingAttr, MethodBase[] match, ref object[] args, ParameterModifier[] modifiers, CultureInfo culture, string[] names, out object state) { + throw new NotImplementedException(); + } + + public override object ChangeType(object value, Type type, CultureInfo culture) { + if (value == null) + return null; + else if (type == value.GetType()) + return value; + else if (type.IsEnum && value is string) { + return Enum.Parse(type, (string)value); + } + throw new InvalidCastException(); + } + + public override void ReorderArgumentArray(ref object[] args, object state) { + throw new NotImplementedException(); + } + + public override MethodBase SelectMethod(BindingFlags bindingAttr, MethodBase[] match, Type[] types, ParameterModifier[] modifiers) { + throw new NotImplementedException(); + } + + public override PropertyInfo SelectProperty(BindingFlags bindingAttr, PropertyInfo[] match, Type returnType, Type[] indexes, ParameterModifier[] modifiers) { + throw new NotImplementedException(); + } + } +} diff --git a/Assets/Cryville/Common/BinderAttribute.cs.meta b/Assets/Cryville/Common/BinderAttribute.cs.meta new file mode 100644 index 0000000..47d4d8f --- /dev/null +++ b/Assets/Cryville/Common/BinderAttribute.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 146a308dba289ad4f91c07c69bb4688b +timeCreated: 1608801352 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/Buffers.meta b/Assets/Cryville/Common/Buffers.meta new file mode 100644 index 0000000..49a92fe --- /dev/null +++ b/Assets/Cryville/Common/Buffers.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 53f4e3167a1eee2478b0abc6302aee8f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/Buffers/ArrayPool.cs b/Assets/Cryville/Common/Buffers/ArrayPool.cs new file mode 100644 index 0000000..20bef71 --- /dev/null +++ b/Assets/Cryville/Common/Buffers/ArrayPool.cs @@ -0,0 +1,65 @@ +namespace Cryville.Common.Buffers { + /// + /// A resource pool that allows reusing instances of arrays of type . + /// + /// The item type of the arrays in the pool. + public class ArrayPool { + private class Bucket : ObjectPool { + readonly int _size; + public Bucket(int size, int capacity) : base(capacity) { + _size = size; + } + protected override T[] Construct() { + return new T[_size]; + } + } + Bucket[] _buckets; + /// + /// Creates an instance of the class with the default maximum list size and bucket capacity. + /// + public ArrayPool() : this(0x40000000, 256) { } + /// + /// Creates an instance of the class. + /// + /// The maximum size of the arrays in the pool. + /// The capacity of each bucket. The pool groups arrays of similar sizes into buckets for faster access. + public ArrayPool(int maxSize, int capacityPerBucket) { + if (maxSize < 16) maxSize = 16; + int num = GetID(maxSize) + 1; + _buckets = new Bucket[num]; + for (int i = 0; i < num; i++) { + _buckets[i] = new Bucket(GetSize(i), capacityPerBucket); + } + } + /// + /// Rents an array that is at least the specified size from the pool. + /// + /// The minimum size of the array. + /// An array of type that is at least the specified size. + public T[] Rent(int size) { + int len2 = size; + if (len2 < 16) len2 = 16; + var arr = _buckets[GetID(len2)].Rent(); + return arr; + } + /// + /// Returns a rented array to the pool. + /// + /// The array to return. + public void Return(T[] arr) { + int len2 = arr.Length; + if (len2 < 16) len2 = 16; + _buckets[GetID(len2)].Return(arr); + } + static int GetID(int size) { + size -= 1; + size >>= 4; + int num = 0; + for (; size != 0; size >>= 1) num++; + return num; + } + static int GetSize(int id) { + return 0x10 << id; + } + } +} diff --git a/Assets/Cryville/Common/Buffers/ArrayPool.cs.meta b/Assets/Cryville/Common/Buffers/ArrayPool.cs.meta new file mode 100644 index 0000000..36246c1 --- /dev/null +++ b/Assets/Cryville/Common/Buffers/ArrayPool.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: df66519fa93e1b94ea5bb1702cc91b3f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/Buffers/ListPool.cs b/Assets/Cryville/Common/Buffers/ListPool.cs new file mode 100644 index 0000000..90b9e9e --- /dev/null +++ b/Assets/Cryville/Common/Buffers/ListPool.cs @@ -0,0 +1,71 @@ +using System.Collections.Generic; + +namespace Cryville.Common.Buffers { + /// + /// A resource pool that allows reusing instances of lists of type . + /// + /// The item type of the lists in the pool. + public class ListPool { + private class Bucket : ObjectPool> { + readonly int _size; + public Bucket(int size, int capacity) : base(capacity) { + _size = size; + } + protected override List Construct() { + return new List(_size); + } + } + Bucket[] _buckets; + /// + /// Creates an instance of the class with the default maximum list size and bucket capacity. + /// + public ListPool() : this(0x40000000, 256) { } + /// + /// Creates an instance of the class. + /// + /// The maximum size of the lists in the pool. + /// The capacity of each bucket. The pool groups lists of similar sizes into buckets for faster access. + public ListPool(int maxSize, int capacityPerBucket) { + if (maxSize < 16) maxSize = 16; + int num = GetID(maxSize) + 1; + _buckets = new Bucket[num]; + for (int i = 0; i < num; i++) { + _buckets[i] = new Bucket(GetSize(i), capacityPerBucket); + } + } + /// + /// Rents a list of the specified size from the pool. The size of the list must not be changed when it is rented. + /// + /// The size of the list. + /// A of the specified size. + public List Rent(int size) { + int len2 = size; + if (len2 < 16) len2 = 16; + var list = _buckets[GetID(len2)].Rent(); + if (list.Count < size) + for (int i = list.Count; i < size; i++) list.Add(default(T)); + else if (list.Count > size) + list.RemoveRange(size, list.Count - size); + return list; + } + /// + /// Returns a rented list to the pool. + /// + /// The list to return. + public void Return(List list) { + int len2 = list.Capacity; + if (len2 < 16) len2 = 16; + _buckets[GetID(len2)].Return(list); + } + static int GetID(int size) { + size -= 1; + size >>= 4; + int num = 0; + for (; size != 0; size >>= 1) num++; + return num; + } + static int GetSize(int id) { + return 0x10 << id; + } + } +} diff --git a/Assets/Cryville/Common/Buffers/ListPool.cs.meta b/Assets/Cryville/Common/Buffers/ListPool.cs.meta new file mode 100644 index 0000000..68933cc --- /dev/null +++ b/Assets/Cryville/Common/Buffers/ListPool.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2b7b45ff20c33ac47b476371673b037c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/Buffers/ObjectPool.cs b/Assets/Cryville/Common/Buffers/ObjectPool.cs new file mode 100644 index 0000000..3019b50 --- /dev/null +++ b/Assets/Cryville/Common/Buffers/ObjectPool.cs @@ -0,0 +1,42 @@ +namespace Cryville.Common.Buffers { + /// + /// A resource pool that allows reusing instances of type . + /// + /// The type of the objects in the pool. + public abstract class ObjectPool where T : class { + int _index; + readonly T[] _objs; + /// + /// Creates an instance of the class. + /// + /// The capacity of the pool. + public ObjectPool(int capacity) { + _objs = new T[capacity]; + } + /// + /// Rents a object from the pool. + /// + /// The rented object. + public T Rent() { + T obj = null; + if (_index < _objs.Length) { + obj = _objs[_index]; + _objs[_index++] = null; + } + if (obj == null) obj = Construct(); + return obj; + } + /// + /// Returns a rented object to the pool. + /// + /// The object to return. + public void Return(T obj) { + if (_index > 0) _objs[--_index] = obj; + } + /// + /// Constructs a new instance of type . + /// + /// The new instance. + protected abstract T Construct(); + } +} diff --git a/Assets/Cryville/Common/Buffers/ObjectPool.cs.meta b/Assets/Cryville/Common/Buffers/ObjectPool.cs.meta new file mode 100644 index 0000000..d178c09 --- /dev/null +++ b/Assets/Cryville/Common/Buffers/ObjectPool.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2745c44c3cc32be4ab3a43888c14b9a1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/Buffers/SimpleObjectPool.cs b/Assets/Cryville/Common/Buffers/SimpleObjectPool.cs new file mode 100644 index 0000000..fec023b --- /dev/null +++ b/Assets/Cryville/Common/Buffers/SimpleObjectPool.cs @@ -0,0 +1,16 @@ +namespace Cryville.Common.Buffers { + /// + /// A resource pool that allows reusing instances of type , which has a parameterless constructor. + /// + /// The type of the objects in the pool. + public class SimpleObjectPool : ObjectPool where T : class, new() { + /// + /// Creates an instance of the class. + /// + /// The capacity of the pool. + public SimpleObjectPool(int capacity) : base(capacity) { } + protected override T Construct() { + return new T(); + } + } +} diff --git a/Assets/Cryville/Common/Buffers/SimpleObjectPool.cs.meta b/Assets/Cryville/Common/Buffers/SimpleObjectPool.cs.meta new file mode 100644 index 0000000..b1bd779 --- /dev/null +++ b/Assets/Cryville/Common/Buffers/SimpleObjectPool.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b8cd439340f088d4eb83711a5bc6384d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/Buffers/WStringPool.cs b/Assets/Cryville/Common/Buffers/WStringPool.cs new file mode 100644 index 0000000..6218b72 --- /dev/null +++ b/Assets/Cryville/Common/Buffers/WStringPool.cs @@ -0,0 +1,10 @@ +using System; +using System.Runtime.InteropServices; + +namespace Cryville.Common.Buffers { + public class WStringPool { + public WStringPool() { + + } + } +} diff --git a/Assets/Cryville/Common/Buffers/WStringPool.cs.meta b/Assets/Cryville/Common/Buffers/WStringPool.cs.meta new file mode 100644 index 0000000..0e9d82f --- /dev/null +++ b/Assets/Cryville/Common/Buffers/WStringPool.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 704270b37917aa1458db9d14bab07073 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/ComponentModel.meta b/Assets/Cryville/Common/ComponentModel.meta new file mode 100644 index 0000000..49fe228 --- /dev/null +++ b/Assets/Cryville/Common/ComponentModel.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3c27afc8f4f76d04dac0f0914798ccc0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/ComponentModel/LogarithmicScaleAttribute.cs b/Assets/Cryville/Common/ComponentModel/LogarithmicScaleAttribute.cs new file mode 100644 index 0000000..8c81727 --- /dev/null +++ b/Assets/Cryville/Common/ComponentModel/LogarithmicScaleAttribute.cs @@ -0,0 +1,8 @@ +using System; + +namespace Cryville.Common.ComponentModel { + [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] + public class LogarithmicScaleAttribute : Attribute { + public LogarithmicScaleAttribute() { } + } +} diff --git a/Assets/Cryville/Common/ComponentModel/LogarithmicScaleAttribute.cs.meta b/Assets/Cryville/Common/ComponentModel/LogarithmicScaleAttribute.cs.meta new file mode 100644 index 0000000..d2e69d4 --- /dev/null +++ b/Assets/Cryville/Common/ComponentModel/LogarithmicScaleAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c1e8a5b839ed6a64dbb9fc6b0bcf7cc2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/ComponentModel/PrecisionAttribute.cs b/Assets/Cryville/Common/ComponentModel/PrecisionAttribute.cs new file mode 100644 index 0000000..8c6c406 --- /dev/null +++ b/Assets/Cryville/Common/ComponentModel/PrecisionAttribute.cs @@ -0,0 +1,12 @@ +using System; + +namespace Cryville.Common.ComponentModel { + [AttributeUsage(AttributeTargets.Property, Inherited = false)] + public class PrecisionAttribute : Attribute { + public PrecisionAttribute(double precision) { + Precision = precision; + } + + public double Precision { get; set; } + } +} diff --git a/Assets/Cryville/Common/ComponentModel/PrecisionAttribute.cs.meta b/Assets/Cryville/Common/ComponentModel/PrecisionAttribute.cs.meta new file mode 100644 index 0000000..0f45163 --- /dev/null +++ b/Assets/Cryville/Common/ComponentModel/PrecisionAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ea83b8e303a1b8b43a2f2ff74a7a9a7a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/ComponentModel/RangeAttribute.cs b/Assets/Cryville/Common/ComponentModel/RangeAttribute.cs new file mode 100644 index 0000000..ef535fc --- /dev/null +++ b/Assets/Cryville/Common/ComponentModel/RangeAttribute.cs @@ -0,0 +1,14 @@ +using System; + +namespace Cryville.Common.ComponentModel { + [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] + public class RangeAttribute : Attribute { + public RangeAttribute(float min, float max) { + Min = min; + Max = max; + } + + public float Min { get; set; } + public float Max { get; set; } + } +} diff --git a/Assets/Cryville/Common/ComponentModel/RangeAttribute.cs.meta b/Assets/Cryville/Common/ComponentModel/RangeAttribute.cs.meta new file mode 100644 index 0000000..ef066cb --- /dev/null +++ b/Assets/Cryville/Common/ComponentModel/RangeAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 569e766a56b73244dbade8de4c525faa +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/ComponentModel/StepAttribute.cs b/Assets/Cryville/Common/ComponentModel/StepAttribute.cs new file mode 100644 index 0000000..f2d174a --- /dev/null +++ b/Assets/Cryville/Common/ComponentModel/StepAttribute.cs @@ -0,0 +1,11 @@ +using System; + +namespace Cryville.Common.ComponentModel { + [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] + public class StepAttribute : Attribute { + public StepAttribute(float step) { + Step = step; + } + public float Step { get; set; } + } +} diff --git a/Assets/Cryville/Common/ComponentModel/StepAttribute.cs.meta b/Assets/Cryville/Common/ComponentModel/StepAttribute.cs.meta new file mode 100644 index 0000000..51bc31d --- /dev/null +++ b/Assets/Cryville/Common/ComponentModel/StepAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 94340a38155591146ada89db63bc4aeb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/FileStringAttribute.cs b/Assets/Cryville/Common/FileStringAttribute.cs new file mode 100644 index 0000000..dcaa297 --- /dev/null +++ b/Assets/Cryville/Common/FileStringAttribute.cs @@ -0,0 +1,17 @@ +using System; + +namespace Cryville.Common { + public class FileStringAttribute : Attribute { + private readonly string filter; + + public string[] Filter { + get { + return filter.Split('|'); + } + } + + public FileStringAttribute(string ext) { + filter = ext; + } + } +} diff --git a/Assets/Cryville/Common/FileStringAttribute.cs.meta b/Assets/Cryville/Common/FileStringAttribute.cs.meta new file mode 100644 index 0000000..3694490 --- /dev/null +++ b/Assets/Cryville/Common/FileStringAttribute.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c3041eaac507d7548ae3460b33230271 +timeCreated: 1608801352 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/Font.meta b/Assets/Cryville/Common/Font.meta new file mode 100644 index 0000000..711e504 --- /dev/null +++ b/Assets/Cryville/Common/Font.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7ad09f227a3c83141b6d9a0f55b4cb38 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/Font/FontUtil.cs b/Assets/Cryville/Common/Font/FontUtil.cs new file mode 100644 index 0000000..ea43d4f --- /dev/null +++ b/Assets/Cryville/Common/Font/FontUtil.cs @@ -0,0 +1,9 @@ +using System.Globalization; + +namespace Cryville.Common.Font { + public static class FontUtil { + /*public static string MatchFontNameWithLang(string lang) { + + }*/ + } +} diff --git a/Assets/Cryville/Common/Font/FontUtil.cs.meta b/Assets/Cryville/Common/Font/FontUtil.cs.meta new file mode 100644 index 0000000..86f59b8 --- /dev/null +++ b/Assets/Cryville/Common/Font/FontUtil.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f3cd70779125d96409f5a299a8034f5f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/IOExtensions.cs b/Assets/Cryville/Common/IOExtensions.cs new file mode 100644 index 0000000..a0e8ed6 --- /dev/null +++ b/Assets/Cryville/Common/IOExtensions.cs @@ -0,0 +1,27 @@ +using System; +using System.IO; +using System.Text; + +namespace Cryville.Common { + public static class IOExtensions { + public static DirectoryInfo GetSubdirectory(this DirectoryInfo dir, string name) { + var l1 = dir.GetDirectories(name); + if (l1.Length == 0) return dir.CreateSubdirectory(name); + else return l1[0]; + } + + public static string ReadUInt16String(this BinaryReader reader, Encoding encoding = null) { + if (encoding == null) encoding = Encoding.UTF8; + var len = reader.ReadUInt16(); + byte[] buffer = reader.ReadBytes(len); + return encoding.GetString(buffer); + } + + public static void WriteUInt16String(this BinaryWriter writer, string value, Encoding encoding = null) { + if (encoding == null) encoding = Encoding.UTF8; + byte[] buffer = encoding.GetBytes(value); + writer.Write((ushort)buffer.Length); + writer.Write(buffer); + } + } +} diff --git a/Assets/Cryville/Common/IOExtensions.cs.meta b/Assets/Cryville/Common/IOExtensions.cs.meta new file mode 100644 index 0000000..a2a7f6e --- /dev/null +++ b/Assets/Cryville/Common/IOExtensions.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 49f85de87c5e683429e4790c0dc3fd2c +timeCreated: 1620706538 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/Logger.cs b/Assets/Cryville/Common/Logger.cs new file mode 100644 index 0000000..8686222 --- /dev/null +++ b/Assets/Cryville/Common/Logger.cs @@ -0,0 +1,79 @@ +using Ionic.Zip; +using System; +using System.Collections.Generic; +using System.IO; + +namespace Cryville.Common { + public abstract class Logger { + static readonly Dictionary Instances = new Dictionary(); + static readonly Dictionary Files = new Dictionary(); + static string logPath = null; + public static void SetLogPath(string path) { + logPath = path; + var dir = new DirectoryInfo(path); + if (!dir.Exists) Directory.CreateDirectory(dir.FullName); + } + public static void Log(string key, int level, string module, string format, params object[] args) { + if (!Instances.ContainsKey(key)) return; + Instances[key].Log(level, module, string.Format(format, args)); + if (Files.ContainsKey(key)) Files[key].WriteLine("[{0:O}] [{1}] <{2}> {3}", DateTime.UtcNow, level, module, string.Format(format, args)); + } + public static void Create(string key, Logger logger) { + Instances[key] = logger; + if (logPath != null) { + Files[key] = new StreamWriter(logPath + "/" + ((int)DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds).ToString() + "-" + key + ".log"); + Files[key].AutoFlush = true; + } + } + public static void Close() { + Instances.Clear(); + foreach (var f in Files) f.Value.Dispose(); + Files.Clear(); + } + + public virtual void Log(int level, string module, string msg) { } + } + + public class InstantLogger : Logger { + readonly Action callback; + public InstantLogger(Action callback) { + if (callback == null) + throw new ArgumentNullException("callback"); + this.callback = callback; + } + public override void Log(int level, string module, string msg) { + base.Log(level, module, msg); + callback(level, module, msg); + } + } + + public class BufferedLogger : Logger { + readonly List buffer = new List(); + public BufferedLogger() { } + public override void Log(int level, string module, string msg) { + base.Log(level, module, msg); + lock (buffer) { + buffer.Add(new LogEntry(level, module, msg)); + } + } + public void Enumerate(Action callback) { + lock (buffer) { + foreach (var i in buffer) { + callback(i.level, i.module, i.msg); + } + } + buffer.Clear(); + } + } + + public struct LogEntry { + public int level; + public string module; + public string msg; + public LogEntry(int level, string module, string msg) { + this.level = level; + this.module = module; + this.msg = msg; + } + } +} diff --git a/Assets/Cryville/Common/Logger.cs.meta b/Assets/Cryville/Common/Logger.cs.meta new file mode 100644 index 0000000..622df97 --- /dev/null +++ b/Assets/Cryville/Common/Logger.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 1c1729cfde78f1c479c9f7eb166e0107 +timeCreated: 1611126212 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/Math.meta b/Assets/Cryville/Common/Math.meta new file mode 100644 index 0000000..ac60a74 --- /dev/null +++ b/Assets/Cryville/Common/Math.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: c7912778bf022c34592b3ebf16782635 +folderAsset: yes +timeCreated: 1616377089 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/Math/ColumnVector.cs b/Assets/Cryville/Common/Math/ColumnVector.cs new file mode 100644 index 0000000..6e16ed1 --- /dev/null +++ b/Assets/Cryville/Common/Math/ColumnVector.cs @@ -0,0 +1,37 @@ +namespace Cryville.Common.Math { + public class ColumnVector { + readonly T[] content; + public int Size { + get; + private set; + } + public ColumnVector(int size) { + content = new T[size]; + Size = size; + } + public ColumnVector(T[] c) { + Size = c.Length; + content = c; + } + public T this[int i] { + get { + return content[i]; + } + set { + content[i] = value; + } + } + public T Dot(ColumnVector lhs, IVectorOperator o) { + T res = default(T); + for (var i = 0; i < Size; i++) + res = o.Add(res, o.ScalarMultiply(lhs[i], content[i])); + return res; + } + public static ColumnVector WithPolynomialCoefficients(int size, float num) { + var m = new ColumnVector(size); + for (var i = 0; i < size; i++) + m[i] = (float)System.Math.Pow(num, i); + return m; + } + } +} diff --git a/Assets/Cryville/Common/Math/ColumnVector.cs.meta b/Assets/Cryville/Common/Math/ColumnVector.cs.meta new file mode 100644 index 0000000..717b70d --- /dev/null +++ b/Assets/Cryville/Common/Math/ColumnVector.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b99c66d83f1330841a0c5a23e87bf873 +timeCreated: 1616406828 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/Math/IVectorOperator.cs b/Assets/Cryville/Common/Math/IVectorOperator.cs new file mode 100644 index 0000000..0da9fd2 --- /dev/null +++ b/Assets/Cryville/Common/Math/IVectorOperator.cs @@ -0,0 +1,6 @@ +namespace Cryville.Common.Math { + public interface IVectorOperator { + T Add(T lhs, T rhs); + T ScalarMultiply(float lhs, T rhs); + } +} diff --git a/Assets/Cryville/Common/Math/IVectorOperator.cs.meta b/Assets/Cryville/Common/Math/IVectorOperator.cs.meta new file mode 100644 index 0000000..ff34251 --- /dev/null +++ b/Assets/Cryville/Common/Math/IVectorOperator.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6bd0295c670699c49b6f0944832387a9 +timeCreated: 1616379780 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/Math/SquareMatrix.cs b/Assets/Cryville/Common/Math/SquareMatrix.cs new file mode 100644 index 0000000..c19fa6d --- /dev/null +++ b/Assets/Cryville/Common/Math/SquareMatrix.cs @@ -0,0 +1,63 @@ +namespace Cryville.Common.Math { + public class SquareMatrix { + readonly float[,] content; + public int Size { + get; + private set; + } + public SquareMatrix(int size) { + content = new float[size, size]; + Size = size; + } + public float this[int r, int c] { + get { return content[r, c]; } + set { content[r, c] = value; } + } + public ColumnVector Eliminate(ColumnVector v, IVectorOperator o) { + int s = Size; + float[,] d = (float[,])content.Clone(); + int[] refl = new int[s]; + for (int i = 0; i < s; i++) + refl[i] = i; + for (int r = 0; r < s; r++) { + for (int r0 = r; r0 < s; r0++) + if (d[refl[r0], r] != 0) { + refl[r] = r0; + refl[r0] = r; + break; + } + int or = refl[r]; + float sf0 = d[or, r]; + for (int c0 = r; c0 < s; c0++) + d[or, c0] /= sf0; + v[or] = o.ScalarMultiply(1 / sf0, v[or]); + for (int r1 = r + 1; r1 < s; r1++) { + int or1 = refl[r1]; + float sf1 = d[or1, r]; + for (int c1 = r; c1 < s; c1++) + d[or1, c1] -= d[or, c1] * sf1; + v[or1] = o.Add(v[or1], o.ScalarMultiply(-sf1, v[or])); + } + } + T[] res = new T[s]; + for (int r2 = s - 1; r2 >= 0; r2--) { + var v2 = v[refl[r2]]; + for (int c2 = r2 + 1; c2 < s; c2++) + v2 = o.Add(v2, o.ScalarMultiply(-d[refl[r2], c2], res[refl[c2]])); + res[refl[r2]] = v2; + } + return new ColumnVector(res); + } + public static SquareMatrix WithPolynomialCoefficients(int size) { + var m = new SquareMatrix(size); + for (var r = 0; r < size; r++) { + int d = 1; + for (var c = 0; c < size; c++) { + m[r, c] = d; + d *= r; + } + } + return m; + } + } +} diff --git a/Assets/Cryville/Common/Math/SquareMatrix.cs.meta b/Assets/Cryville/Common/Math/SquareMatrix.cs.meta new file mode 100644 index 0000000..f3a01bc --- /dev/null +++ b/Assets/Cryville/Common/Math/SquareMatrix.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: bceea65ebaa5052409eb85086645232e +timeCreated: 1616377102 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/Network.meta b/Assets/Cryville/Common/Network.meta new file mode 100644 index 0000000..f33e300 --- /dev/null +++ b/Assets/Cryville/Common/Network.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: f8303a3eeefeacf4ca0c02b5d32e0cff +folderAsset: yes +timeCreated: 1621071543 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/Network/HttpClient.cs b/Assets/Cryville/Common/Network/HttpClient.cs new file mode 100644 index 0000000..9955097 --- /dev/null +++ b/Assets/Cryville/Common/Network/HttpClient.cs @@ -0,0 +1,142 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Sockets; +using System.Text; +using Microsoft.Win32; + +namespace Cryville.Common.Network { + public class HttpClient { + private readonly string _directHost; + protected string DirectHost { get { return _directHost; } } + + private readonly int _directPort; + protected int DirectPort { get { return _directPort; } } + + readonly Uri _baseUri; + readonly int origPort; + + protected string Version = "HTTP/1.1"; + protected TcpClient TcpClient; + protected virtual Stream Stream { + get { + return TcpClient.GetStream(); + } + } + + private readonly bool _proxied = false; + + public Dictionary Headers { get; set; } + + public HttpClient(Uri baseUri, int port = 80) { + _directHost = baseUri.Host; + _directPort = port; + _baseUri = baseUri; + origPort = _baseUri.Port; + Headers = new Dictionary(); + _proxied = GetProxy(ref _directHost, ref _directPort); + Logger.Log("main", 0, "Network", "Connecting to {0}:{1}", DirectHost, DirectPort); + TcpClient = new TcpClient(DirectHost, DirectPort); + } + + public virtual void Connect() { + if (_proxied) { + Request("CONNECT", _baseUri.Host + ":" + origPort.ToString()); + } + } + + public virtual void Close() { + TcpClient.Close(); + } + + public HttpResponse Request(string method, Uri uri, string body = null, Encoding encoding = null) { + string struri = GetUri(uri).PathAndQuery; + // if (_proxied) struri = GetUri(uri).AbsoluteUri; + return Request(method, struri, body, encoding); + } + + public HttpResponse Request(string method, string uri, string body = null, Encoding encoding = null) { + var headers = new Dictionary(); + // if (Stream.CanTimeout) Stream.ReadTimeout = Stream.WriteTimeout = 5000; + foreach (var h in Headers) + headers.Add(h.Key, h.Value); + // headers["Accept"] = "text/plain, */*"; + // headers["Connection"] = "close"; + headers["Host"] = _baseUri.Host; + byte[] payload = new byte[0]; + if (body != null) { + if (encoding == null) + encoding = Encoding.UTF8; + payload = encoding.GetBytes(body); + headers.Add("Content-Encoding", encoding.EncodingName); + headers.Add("Content-Length", payload.Length.ToString()); + } + string request_line = string.Format( + "{0} {1} {2}\r\n", method, uri, Version + ); + string header_fields = string.Concat(( + from h in headers select h.Key + ":" + h.Value + "\r\n" + ).ToArray()); + byte[] buffer0 = Encoding.ASCII.GetBytes(string.Format( + "{0}{1}\r\n", request_line, header_fields + )); + byte[] buffer1 = new byte[buffer0.Length + payload.Length]; + Array.Copy(buffer0, buffer1, buffer0.Length); + Array.Copy(payload, 0, buffer1, buffer0.Length, payload.Length); + Logger.Log("main", 0, "Network", Encoding.UTF8.GetString(buffer1)); + Stream.Write(buffer1, 0, buffer1.Length); + Stream.Flush(); + var response = new HttpResponse(Stream); + Logger.Log("main", 0, "Network", "{0}", response); + return response; + } + + protected virtual bool GetProxy(ref string host, ref int port) { + if (Environment.OSVersion.Platform == PlatformID.Win32NT) { + var reg = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Internet Settings"); + var proxyEnable = (int)reg.GetValue("ProxyEnable"); + if (proxyEnable == 0) return false; + var proxyStr = (string)reg.GetValue("ProxyServer"); + if (!string.IsNullOrEmpty(proxyStr)) { + string[] proxies = proxyStr.Split(';'); + foreach (var p in proxies) { + if (p.StartsWith("http=")) { + string[] s = p.Split('=', ':'); + host = s[1]; + port = int.Parse(s[2]); + return true; + } + } + } + } + return false; + } + + protected Uri GetUri(string path) { + Uri address; + if (_baseUri != null) { + if (!Uri.TryCreate(_baseUri, path, out address)) { + return new Uri(Path.GetFullPath(path)); + } + } + else { + if (!Uri.TryCreate(path, UriKind.Absolute, out address)) { + return new Uri(Path.GetFullPath(path)); + } + } + return GetUri(address); + } + + protected Uri GetUri(Uri address) { + if (address == null) { + throw new ArgumentNullException("address"); + } + Uri uri = address; + if (!address.IsAbsoluteUri && _baseUri != null && !Uri.TryCreate(_baseUri, address, out uri)) { + return address; + } + return uri; + } + } +} diff --git a/Assets/Cryville/Common/Network/HttpClient.cs.meta b/Assets/Cryville/Common/Network/HttpClient.cs.meta new file mode 100644 index 0000000..0b11648 --- /dev/null +++ b/Assets/Cryville/Common/Network/HttpClient.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5ea931bf5488011468f3d1243a038874 +timeCreated: 1622589817 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/Network/HttpResponse.cs b/Assets/Cryville/Common/Network/HttpResponse.cs new file mode 100644 index 0000000..9d3e4db --- /dev/null +++ b/Assets/Cryville/Common/Network/HttpResponse.cs @@ -0,0 +1,61 @@ +using System.Collections.Generic; +using System.IO; +using System.Text; + +namespace Cryville.Common.Network { + public class HttpResponse { + static readonly char[] spchar = new char[]{ ' ' }; + public string HttpVersion { get; private set; } + public string StatusCode { get; private set; } + public string ReasonPhase { get; private set; } + public Dictionary Headers { get; private set; } + public HttpResponseStream MessageBody { get; private set; } + internal HttpResponse(Stream stream) { + var reader = new BinaryReader(stream, Encoding.ASCII); + var statu_line = ReadLine(reader).Split(spchar, 3); + HttpVersion = statu_line[0]; + StatusCode = statu_line[1]; + ReasonPhase = statu_line[2]; + Logger.Log("main", 0, "Network", "Receive Response: {0} {1} {2}", HttpVersion, StatusCode, ReasonPhase); + Headers = new Dictionary(); + while (ParseHeader(reader, Headers)) ; + if (Headers.ContainsKey("content-length")) { + int length = int.Parse(Headers["content-length"]); + MessageBody = new HttpResponseBlockStream(reader, length); + } + else if (Headers.ContainsKey("transfer-encoding") && Headers["transfer-encoding"] == "chunked") { + MessageBody = new HttpResponseChunkedStream(reader); + } + } + + public override string ToString() { + return string.Format("<{0} {1} {2}>", HttpVersion, StatusCode, ReasonPhase); + } + + internal static bool ParseHeader(BinaryReader reader, Dictionary headers) { + // TODO Multiline header + var header = ReadLine(reader); + if (header == "") return false; + var s = header.Split(':'); + string field_name = s[0].Trim().ToLower(); + string field_value = s[1].Trim(); + if (headers.ContainsKey(field_name)) headers[field_name] += "," + field_value; + else headers.Add(field_name, field_value); + Logger.Log("main", 0, "Network", "Receive Header {0}: {1}", field_name, field_value); + return true; + } + + internal static string ReadLine(BinaryReader reader) { + StringBuilder result = new StringBuilder(); + char c; + while (true) { + c = reader.ReadChar(); + if (c == '\r') break; + result.Append(c); + } + // TODO Unseekable + reader.ReadByte(); + return result.ToString(); + } + } +} diff --git a/Assets/Cryville/Common/Network/HttpResponse.cs.meta b/Assets/Cryville/Common/Network/HttpResponse.cs.meta new file mode 100644 index 0000000..672fcee --- /dev/null +++ b/Assets/Cryville/Common/Network/HttpResponse.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 07e8215a93e3eb1418685009f0c58dcd +timeCreated: 1622596274 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/Network/HttpResponseStream.cs b/Assets/Cryville/Common/Network/HttpResponseStream.cs new file mode 100644 index 0000000..767e944 --- /dev/null +++ b/Assets/Cryville/Common/Network/HttpResponseStream.cs @@ -0,0 +1,135 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; + +namespace Cryville.Common.Network { + public abstract class HttpResponseStream : Stream { + public override bool CanRead { get { return true; } } + + public override bool CanSeek { get { return false; } } + + public override bool CanWrite { get { return false; } } + + public override long Length { get { throw new NotSupportedException(); } } + + public override long Position { + get { throw new NotSupportedException(); } + set { throw new NotSupportedException(); } + } + + public override void Flush() { + // Do nothing + } + + public abstract byte[] ReadToEnd(); + + public override long Seek(long offset, SeekOrigin origin) { + throw new NotSupportedException(); + } + + public override void SetLength(long value) { + throw new NotSupportedException(); + } + + public override void Write(byte[] buffer, int offset, int count) { + throw new NotSupportedException(); + } + } + + internal sealed class HttpResponseBlockStream : HttpResponseStream { + readonly BinaryReader _reader; + readonly int _length; + int _pos = 0; + internal HttpResponseBlockStream(BinaryReader reader, int length) { + _reader = reader; + _length = length; + } + public override int Read(byte[] buffer, int offset, int count) { + int recv = 0; + int recv_len = System.Math.Min(count, _length - _pos); + if (recv_len == 0) return 0; + while (recv < recv_len) { + recv += _reader.Read(buffer, offset + recv, count - recv); + Logger.Log("main", 0, "Network", "Message body received: {0}/{1}/{2}", recv, recv_len, _length); + } + _pos += recv_len; + return recv_len; + } + public override byte[] ReadToEnd() { + byte[] buffer = new byte[_length - _pos]; + Read(buffer, 0, buffer.Length); + return buffer; + } + } + + internal sealed class HttpResponseChunkedStream : HttpResponseStream { + readonly BinaryReader _reader; + byte[] _chunk = null; + int _pos = 0; + internal HttpResponseChunkedStream(BinaryReader reader) { + _reader = reader; + ReadChunk(); + } + public void ReadChunk() { + if (_chunk != null && _chunk.Length == 0) return; + string[] chunkHeader = HttpResponse.ReadLine(_reader).Split(';'); + // int chunkSize = Array.IndexOf(LEN, chunkHeader[0].ToLower()[0]); + int chunkSize = int.Parse(chunkHeader[0], NumberStyles.HexNumber); + if (chunkSize == -1) + throw new IOException("Corrupted chunk received"); + if (chunkSize == 0) { + _chunk = new byte[0]; + // TODO TE Header, now just discard + var headers = new Dictionary(); + while (HttpResponse.ParseHeader(_reader, headers)) ; + return; + } + _chunk = new byte[chunkSize]; + int recv = 0; + while (recv < chunkSize) { + recv += _reader.Read(_chunk, recv, chunkSize - recv); + Logger.Log("main", 0, "Network", "Message chunk received: {0}/{1}", recv, chunkSize); + } + _pos = 0; + if (HttpResponse.ReadLine(_reader) != "") + throw new IOException("Corrupted chunk received"); + } + public override int Read(byte[] buffer, int offset, int count) { + if (_chunk.Length == 0) return 0; + int recv = 0; + while (true) { + if (count - recv <= _chunk.Length - _pos) break; + Array.Copy(_chunk, _pos, buffer, recv, _chunk.Length - _pos); + recv += _chunk.Length - _pos; + ReadChunk(); + if (_chunk.Length == 0) return recv; + } + Array.Copy(_chunk, _pos, buffer, recv, count - recv); + return count; + } + public override byte[] ReadToEnd() { + if (_chunk.Length == 0) return new byte[0]; + List segs = new List(); + while (true) { + if (_pos != 0) { + var buffer = new byte[_chunk.Length - _pos]; + Array.Copy(_chunk, _pos, buffer, 0, buffer.Length); + segs.Add(buffer); + } + else segs.Add(_chunk); + ReadChunk(); + if (_chunk.Length == 0) { + var result = new byte[segs.Sum(i => i.Length)]; + int p = 0; + foreach (var i in segs) { + Array.Copy(i, 0, result, p, i.Length); + p += i.Length; + } + return result; + } + } + } + } +} \ No newline at end of file diff --git a/Assets/Cryville/Common/Network/HttpResponseStream.cs.meta b/Assets/Cryville/Common/Network/HttpResponseStream.cs.meta new file mode 100644 index 0000000..ee4deb4 --- /dev/null +++ b/Assets/Cryville/Common/Network/HttpResponseStream.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f191de447a708da4f9d230e6545ce0a6 +timeCreated: 1635470462 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/Network/HttpsClient.cs b/Assets/Cryville/Common/Network/HttpsClient.cs new file mode 100644 index 0000000..ed991ae --- /dev/null +++ b/Assets/Cryville/Common/Network/HttpsClient.cs @@ -0,0 +1,51 @@ +using Microsoft.Win32; +using System; +using System.IO; +using System.Net.Sockets; + +namespace Cryville.Common.Network { + public class HttpsClient : HttpClient { + readonly TlsTcpClient _tlsTcpClient; + + protected override Stream Stream { + get { + return _tlsTcpClient.Stream; + } + } + + public HttpsClient(Uri baseUri) : base(baseUri, 443) { + _tlsTcpClient = new TlsTcpClient(DirectHost, DirectPort); + } + + public override void Connect() { + _tlsTcpClient.Connect(); + base.Connect(); + } + + public override void Close() { + base.Close(); + _tlsTcpClient.Close(); + } + + protected override bool GetProxy(ref string host, ref int port) { + if (Environment.OSVersion.Platform == PlatformID.Win32NT) { + var reg = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Internet Settings"); + var proxyEnable = (int)reg.GetValue("ProxyEnable"); + if (proxyEnable == 0) return false; + var proxyStr = (string)reg.GetValue("ProxyServer"); + if (!string.IsNullOrEmpty(proxyStr)) { + string[] proxies = proxyStr.Split(';'); + foreach (var p in proxies) { + if (p.StartsWith("https=")) { + string[] s = p.Split('=', ':'); + host = s[1]; + port = int.Parse(s[2]); + return true; + } + } + } + } + return false; + } + } +} diff --git a/Assets/Cryville/Common/Network/HttpsClient.cs.meta b/Assets/Cryville/Common/Network/HttpsClient.cs.meta new file mode 100644 index 0000000..37b119e --- /dev/null +++ b/Assets/Cryville/Common/Network/HttpsClient.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 9b35290e0e147a342acc29a20c8fceaf +timeCreated: 1622503538 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/Network/TlsTcpClient.cs b/Assets/Cryville/Common/Network/TlsTcpClient.cs new file mode 100644 index 0000000..53d967b --- /dev/null +++ b/Assets/Cryville/Common/Network/TlsTcpClient.cs @@ -0,0 +1,94 @@ +using Org.BouncyCastle.Security; +using Org.BouncyCastle.Tls; +using Org.BouncyCastle.Tls.Crypto; +using Org.BouncyCastle.Tls.Crypto.Impl.BC; +using System.Collections; +using System.IO; +using System.Linq; +using System.Net.Sockets; + +namespace Cryville.Common.Network { + public class TlsTcpClient { + readonly TcpClient _tcpClient; + readonly TlsClientProtocol _protocol; + readonly TlsClient _tlsClient; + public Stream Stream { get; private set; } + public TlsTcpClient(string hostname, int port) { + _tcpClient = new TcpClient(hostname, port); + _protocol = new TlsClientProtocol(_tcpClient.GetStream()); + _tlsClient = new InternalTlsClient(new BcTlsCrypto(new SecureRandom())); + } + + public void Connect() { + _protocol.Connect(_tlsClient); + Stream = _protocol.Stream; + } + + public void Close() { + _protocol.Close(); + } + + private class InternalTlsClient : DefaultTlsClient { + public InternalTlsClient(TlsCrypto crypto) : base(crypto) { } + + protected override ProtocolVersion[] GetSupportedVersions() { + return ProtocolVersion.TLSv13.DownTo(ProtocolVersion.TLSv12); + } + + protected override IList GetProtocolNames() { + IList list = new ArrayList { + ProtocolName.Http_1_1, + ProtocolName.Http_2_Tls + }; + return list; + } + + private static readonly int[] supportedCipherSuites = { + CipherSuite.TLS_AES_128_GCM_SHA256, + CipherSuite.TLS_AES_256_GCM_SHA384, + CipherSuite.TLS_CHACHA20_POLY1305_SHA256, + CipherSuite.TLS_AES_128_CCM_SHA256, + CipherSuite.TLS_AES_128_CCM_8_SHA256, + }; + protected override int[] GetSupportedCipherSuites() { + return base.GetSupportedCipherSuites().Union(supportedCipherSuites).ToArray(); + } + + protected override IList GetSupportedSignatureAlgorithms() { + var result = base.GetSupportedSignatureAlgorithms(); + result.Add(SignatureAndHashAlgorithm.ecdsa_brainpoolP256r1tls13_sha256); + result.Add(SignatureAndHashAlgorithm.ecdsa_brainpoolP384r1tls13_sha384); + result.Add(SignatureAndHashAlgorithm.ecdsa_brainpoolP512r1tls13_sha512); + return result; + } + + public override TlsAuthentication GetAuthentication() { + return new NullTlsAuthentication(); + } + + public override void NotifyAlertReceived(short alertLevel, short alertDescription) { + Logger.Log("main", 0, "Network/TLS", "TLS Alert {0} {1}", alertLevel, alertDescription); + } + + public override void NotifyServerVersion(ProtocolVersion serverVersion) { + base.NotifyServerVersion(serverVersion); + Logger.Log("main", 0, "Network/TLS", "NotifyServerVersion {0}", serverVersion); + } + + public override void NotifySelectedCipherSuite(int selectedCipherSuite) { + base.NotifySelectedCipherSuite(selectedCipherSuite); + Logger.Log("main", 0, "Network/TLS", "NotifySelectedCipherSuite {0}", selectedCipherSuite); + } + } + + private class NullTlsAuthentication : TlsAuthentication { + public TlsCredentials GetClientCredentials(CertificateRequest certificateRequest) { + return null; + } + + public void NotifyServerCertificate(TlsServerCertificate serverCertificate) { + // Do nothing + } + } + } +} diff --git a/Assets/Cryville/Common/Network/TlsTcpClient.cs.meta b/Assets/Cryville/Common/Network/TlsTcpClient.cs.meta new file mode 100644 index 0000000..e27e046 --- /dev/null +++ b/Assets/Cryville/Common/Network/TlsTcpClient.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c9c242bb90fc1cc479a8df1407f21940 +timeCreated: 1622021660 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/Pdt.meta b/Assets/Cryville/Common/Pdt.meta new file mode 100644 index 0000000..0d9978e --- /dev/null +++ b/Assets/Cryville/Common/Pdt.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: faaabaf75aa95c94c9671f2e89a01687 +folderAsset: yes +timeCreated: 1605519813 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/Pdt/PdtEvaluatorBase.cs b/Assets/Cryville/Common/Pdt/PdtEvaluatorBase.cs new file mode 100644 index 0000000..2af293a --- /dev/null +++ b/Assets/Cryville/Common/Pdt/PdtEvaluatorBase.cs @@ -0,0 +1,155 @@ +using System; + +namespace Cryville.Common.Pdt { + /// + /// Base of evaluator for PDT expressions. + /// + public abstract class PdtEvaluatorBase { + private struct StackFrame { + public int Offset; + public int Length; + public int Type; + } + int _framecount = 0; + int _goffset = 0; + readonly StackFrame[] _stack = new StackFrame[256]; + readonly byte[] _mem = new byte[0x100000]; + bool _revokepttconst; + /// + /// Evaluates an expression and passes the result to a target operator. + /// + /// The target operator. + /// The expression to evaluate. + public void Evaluate(PdtOperator target, PdtExpression exp) { + _framecount = 0; + _goffset = 0; + _revokepttconst = false; + for (var ins = exp.Instructions.First; ins != null; ins = ins.Next) + ins.Value.Execute(this); + Operate(target, _framecount, true); + if (exp.IsPotentialConstant) { + exp.IsConstant = exp.IsPotentialConstant = !_revokepttconst; + } + } + /// + /// Optimizes an expression by merging its instructions. + /// + /// The expression to optimize. + public void Optimize(PdtExpression exp) { + _framecount = 0; + _goffset = 0; + var il = exp.Instructions; + for (var ins = il.First; ins != null; ins = ins.Next) { + var i = ins.Value; + if (i is PdtInstruction.Operate) { + int fc0 = _framecount; + int fc1 = ((PdtInstruction.Operate)i).ParamCount; + try { i.Execute(this); } catch (Exception) { } + if (fc0 - _framecount == fc1) { + unsafe { + fixed (StackFrame* frame = &_stack[_framecount++]) { + frame->Type = PdtInternalType.Error; + frame->Offset = -1; + frame->Length = 0; + } + } + } + else { + var frame = _stack[_framecount - 1]; + il.AddAfter(ins, new PdtInstruction.PushConstant(frame.Type, _mem, frame.Offset, frame.Length)); + ins = ins.Next; + for (var j = 0; j <= fc1; j++) il.Remove(ins.Previous); + } + } + else if (i is PdtInstruction.PushVariable) { + i.Execute(this); + var frame = _stack[_framecount - 1]; + if (frame.Type != PdtInternalType.Undefined) { + il.AddAfter(ins, new PdtInstruction.PushConstant(frame.Type, _mem, frame.Offset, frame.Length)); + ins = ins.Next; + il.Remove(ins.Previous); + } + } + else i.Execute(this); + } + exp.IsConstant = true; + exp.IsPotentialConstant = true; + for (var ins = il.First; ins != null; ins = ins.Next) { + if (!(ins.Value is PdtInstruction.PushConstant)) { + exp.IsConstant = false; + } + else if (!(ins.Value is PdtInstruction.PushVariable)) { + exp.IsPotentialConstant = false; + return; + } + } + } + /// + /// Revokes the potential constant mark of the current expression. + /// + protected void RevokePotentialConstant() { + _revokepttconst = true; + } + internal unsafe void PushConstant(int type, byte[] value) { + fixed (StackFrame* frame = &_stack[_framecount++]) { + frame->Type = type; + frame->Offset = _goffset; + frame->Length = value.Length; + Array.Copy(value, 0, _mem, _goffset, value.Length); + _goffset += value.Length; + } + } + internal unsafe void PushVariable(ref string name) { + fixed (StackFrame* frame = &_stack[_framecount++]) { + byte[] value; + GetVariable(name, out frame->Type, out value); + frame->Offset = _goffset; + frame->Length = value.Length; + Array.Copy(value, 0, _mem, _goffset, value.Length); + _goffset += value.Length; + } + } + /// + /// Gets a variable of the specified name. + /// + /// The name of the variable. + /// The type of the variable. + /// The value of the variable. + protected abstract void GetVariable(string name, out int type, out byte[] value); + internal void Operate(ref string name, int pc) { + Operate(GetOperator(name, pc), pc); + } + /// + /// Gets an operator of the specified name and the suggested parameter count. + /// + /// The name of the operator. + /// Suggested parameter count. + /// An operator of the specific name. + /// The parameter count of the returned operator does not necessarily equal to . + protected abstract PdtOperator GetOperator(string name, int pc); + bool _failure; + unsafe void Operate(PdtOperator op, int pc, bool noset = false) { + fixed (byte* pmem = _mem) { + op.Begin(this); + for (int i = 0; i < pc; i++) { + var frame = _stack[--_framecount]; + op.LoadOperand(new PdtVariableMemory(frame.Type, pmem + frame.Offset, frame.Length)); + _goffset -= frame.Length; + } + op.Call(pmem + _goffset, noset); + } + } + internal unsafe PdtVariableMemory StackAlloc(int type, byte* ptr, int len) { + fixed (StackFrame* frame = &_stack[_framecount++]) { + frame->Type = type; + frame->Offset = _goffset; + frame->Length = len; + _goffset += len; + return new PdtVariableMemory(type, ptr, len); + } + } + internal void DiscardStack() { + _goffset -= _stack[--_framecount].Length; + } + } +} diff --git a/Assets/Cryville/Common/Pdt/PdtEvaluatorBase.cs.meta b/Assets/Cryville/Common/Pdt/PdtEvaluatorBase.cs.meta new file mode 100644 index 0000000..2ddb185 --- /dev/null +++ b/Assets/Cryville/Common/Pdt/PdtEvaluatorBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e91dc9e4fd28a584c8f2fce4f9e9b648 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/Pdt/PdtExpression.cs b/Assets/Cryville/Common/Pdt/PdtExpression.cs new file mode 100644 index 0000000..769cedc --- /dev/null +++ b/Assets/Cryville/Common/Pdt/PdtExpression.cs @@ -0,0 +1,247 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Cryville.Common.Pdt { + /// + /// PDT expression. + /// + public class PdtExpression { + internal LinkedList Instructions; + /// + /// Whether the value of this expression is constant. + /// + /// The value of this property is false until it is optimized. + public bool IsConstant { get; internal set; } + internal bool IsPotentialConstant; + internal PdtExpression(LinkedList ins) { + Instructions = ins; + } + public override string ToString() { + string r = ""; + bool flag = false; + foreach (PdtInstruction ins in Instructions) { + if (flag) r += "; "; + r += ins.ToString(); + flag = true; + } + return r; + } + } + internal abstract class PdtInstruction { + internal abstract void Execute(PdtEvaluatorBase etor); + public class PushConstant : PdtInstruction { + public int Type { get; private set; } + public byte[] Value { get; private set; } + public PushConstant(int type, byte[] value) { + Type = type; + Value = value; + } + public PushConstant(int type, byte[] buffer, int offset, int len) { + Type = type; + Value = new byte[len]; + Array.Copy(buffer, offset, Value, 0, len); + } + internal override void Execute(PdtEvaluatorBase etor) { + etor.PushConstant(Type, Value); + } + public override string ToString() { + return string.Format("pushc ({0:x8}){1}", Type, BitConverter.ToString(Value)); + } + } + public class PushVariable : PdtInstruction { + private string m_name; + public string Name { get { return m_name; } } + public PushVariable(string name) { + m_name = name; + } + internal override void Execute(PdtEvaluatorBase etor) { + etor.PushVariable(ref m_name); + } + public override string ToString() { + return string.Format("pushv {0}", Name); + } + } + public class Operate : PdtInstruction { + private string m_name; + public string Name { get { return m_name; } } + public int ParamCount { get; private set; } + public Operate(string name, int paramCount) { + m_name = name; + ParamCount = paramCount; + } + internal override void Execute(PdtEvaluatorBase etor) { + etor.Operate(ref m_name, ParamCount); + } + public override string ToString() { + return string.Format("op {0}({1})", Name, ParamCount); + } + } + } + public partial class PdtInterpreter { + readonly static Dictionary pri = new Dictionary { + { '*', 5 }, { '/', 5 }, { '%', 5 }, + { '+', 4 }, { '-', 4 }, + { '=', 3 }, { '<', 3 }, { '>', 3 }, + { '&', 2 }, + { '|', 1 }, { '!', 1 }, + { ',', 0 }, + }; + + readonly static PdtExpression _emptyexp; + static PdtInterpreter() { + var ins = new LinkedList(); + ins.AddLast(new PdtInstruction.PushConstant( + PdtInternalType.Number, BitConverter.GetBytes(1f) + )); + _emptyexp = new PdtExpression(ins); + } + + PdtExpToken GetToken() { + ws(); + var result = new PdtExpToken { + Type = ct & 0x0fe0 + }; + switch (result.Type) { + case 0x0020: result.Value = GetIdentifier(); break; + case 0x0040: result.Value = GetNumber(); break; + case 0x0100: result.Value = GetString(); break; + default: result.Value = cc.ToString(); Position++; break; + } + return result; + } + private struct PdtExpToken { + public int Type { get; set; } + public string Value { get; set; } + public override string ToString() { + return string.Format("0x{0:x4}: {1}", Type, Value); + } + public readonly static PdtExpToken EmptyOperator = new PdtExpToken { + Type = 0x0080, + Value = "", + }; + } + + /// + /// Interprets an expression from the current position and loads it onto an instruction set. + /// + /// The instruction set. + /// + /// The enclosing scope type of the (sub)expression. May be one of the following: + /// + /// -2The expression is in a root scope which ends at a semicolon. + /// -1The expression is in a bracketed scope which ends at a closing parenthesis. + /// Any non-negative valuesThe expression is in an auxiliary scope which ends before a closing parenthesis or an operator whose priority is lower (less) than the value of this parameter. + /// + /// + /// The parameter count in this (sub)expression. + /// The token already parsed but required for the interpretation of the subexpression. + /// The expression token following this (sub)expression. + PdtExpToken InterpretExp(LinkedList ins, int enc, out int pc, PdtExpToken? token = null) { + PdtExpToken t1, t2; + int insc0 = ins.Count; + pc = 1; + if (token == null) t1 = PdtExpToken.EmptyOperator; + else t1 = token.Value; + while (true) { + t2 = InterpretExpBlock(ins); + panic: + switch (t2.Type) { + case 0x0080: + if (t1.Value != "") { + int p1 = pri[t1.Value[0]]; + int p2 = pri[t2.Value[0]]; + if (p2 <= enc) goto exit; + if (p2 > p1) { + int _; + t2 = InterpretExp(ins, p1, out _, t2); + goto panic; + } + if (t1.Value != ",") ins.AddLast(new PdtInstruction.Operate(t1.Value, 2)); + else pc++; + } + t1 = t2; + break; + case 0x0400: + if (enc == -2) throw new FormatException("Expression not enclosed correctly: Too many closing brackets"); + if (ins.Count == insc0) pc = 0; + goto exit; + case 0x0800: + goto exit; + } + } + exit: + if (t1.Value != "," && t1.Value != "") ins.AddLast(new PdtInstruction.Operate(t1.Value, 2)); + else if (t1.Value == ",") pc++; + return t2; + } + + /// + /// Interprets an expression block which consists of several adjacent constants and subexpressions, optionally with a unary operator. + /// + /// The instruction set. + /// The expression token following this expression block. + PdtExpToken InterpretExpBlock(LinkedList ins) { + var t = GetToken(); + if (t.Type == 0x0080) { + var r = InterpretExpBlock(ins); + ins.AddLast(new PdtInstruction.Operate(t.Value, 1)); + return r; + } + bool flag = false; + PdtExpToken? buf = null; + while (true) { + if (buf != null && t.Type != 0x0200) { + PdtExpression def; + if (defs.TryGetValue(buf.Value.Value, out def)) { + foreach (var i in def.Instructions) ins.AddLast(i); + } + else ins.AddLast(new PdtInstruction.PushVariable(buf.Value.Value)); + buf = null; + TryPushAdjMul(ins, ref flag); + } + switch (t.Type) { + case 0x0020: + buf = t; + break; + case 0x0040: + float num = float.Parse(t.Value); + ins.AddLast(new PdtInstruction.PushConstant(PdtInternalType.Number, BitConverter.GetBytes(num))); + break; + case 0x0100: + int strlen = t.Value.Length; + unsafe { + var strbuf = new byte[strlen * sizeof(char) + sizeof(int)]; + fixed (byte* psuffix = strbuf) { + *(int*)psuffix = strlen; + } + Encoding.Unicode.GetBytes(t.Value, 0, strlen, strbuf, sizeof(int)); + ins.AddLast(new PdtInstruction.PushConstant(PdtInternalType.String, strbuf)); + } + break; + case 0x0200: + int pc; + InterpretExp(ins, -1, out pc); + if (buf != null) { + ins.AddLast(new PdtInstruction.Operate(buf.Value.Value, pc)); + buf = null; + } + else if (pc > 1) { + ins.AddLast(new PdtInstruction.Operate(",", pc)); + } + else if (pc == 0) + throw new FormatException("Empty subexpression"); + break; + default: + return t; + } + if (buf == null) TryPushAdjMul(ins, ref flag); + t = GetToken(); + } + } + void TryPushAdjMul(LinkedList ins, ref bool flag) { + if (flag) ins.AddLast(new PdtInstruction.Operate("*", 2)); + else flag = true; + } + } +} diff --git a/Assets/Cryville/Common/Pdt/PdtExpression.cs.meta b/Assets/Cryville/Common/Pdt/PdtExpression.cs.meta new file mode 100644 index 0000000..ed0cfd4 --- /dev/null +++ b/Assets/Cryville/Common/Pdt/PdtExpression.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a551104b532c8d0469917e3e0e8c2cba +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/Pdt/PdtInternalType.cs b/Assets/Cryville/Common/Pdt/PdtInternalType.cs new file mode 100644 index 0000000..a1fcc4a --- /dev/null +++ b/Assets/Cryville/Common/Pdt/PdtInternalType.cs @@ -0,0 +1,28 @@ +namespace Cryville.Common.Pdt { + /// + /// The identifiers of the internal types of PDT. + /// + public static class PdtInternalType { + internal readonly static int Error = "error".GetHashCode(); + /// + /// Array of a same variable-length type, with a suffix indicating the element count and the element type. + /// + public readonly static int Array = "array".GetHashCode(); + /// + /// IEEE 754 32-bit floating-point number. + /// + public readonly static int Number = "number".GetHashCode(); + /// + /// A sequence of UTF-16 code units, with a prefix indicating the number of the code units. + /// + public readonly static int String = "string".GetHashCode(); + /// + /// A sequence of UTF-16 code units representing the name of an undefined variable. + /// + public readonly static int Undefined = "undefined".GetHashCode(); + /// + /// Vector of a same constant-length type, with a suffix indicating the element type. + /// + public readonly static int Vector = "vector".GetHashCode(); + } +} diff --git a/Assets/Cryville/Common/Pdt/PdtInternalType.cs.meta b/Assets/Cryville/Common/Pdt/PdtInternalType.cs.meta new file mode 100644 index 0000000..bf554f6 --- /dev/null +++ b/Assets/Cryville/Common/Pdt/PdtInternalType.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 36eb4aecae64aff4891c4ddd2d1ff68c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/Pdt/PdtInterpreter.cs b/Assets/Cryville/Common/Pdt/PdtInterpreter.cs new file mode 100644 index 0000000..669922e --- /dev/null +++ b/Assets/Cryville/Common/Pdt/PdtInterpreter.cs @@ -0,0 +1,232 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Reflection; +using System.Text.RegularExpressions; + +namespace Cryville.Common.Pdt { + /// + /// Interpreter for Property Definition Tree (PDT) file format. + /// + /// The object type represented by the PDT. + public partial class PdtInterpreter { + /// + /// The character category map. + /// + /// + /// + /// 0x0001White Space + /// 0x0010Identifier + /// 0x0020Identifier Begin + /// 0x0040Digit + /// 0x0080Operator + /// 0x0100String + /// 0x0200Opening Bracket + /// 0x0400Closing Bracket + /// 0x0800End of Expression + /// 0x1000End of Key + /// + /// + readonly static int[] cm = new int[] { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0001, 0x0080, 0x0100, 0x0000, 0x0030, 0x0080, 0x0080, 0x0000, 0x0200, 0x0400, 0x0080, 0x0080, 0x0080, 0x0080, 0x0040, 0x0080, + 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x1000, 0x1800, 0x0080, 0x0080, 0x0080, 0x0000, + 0x0080, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, + 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0030, + 0x0000, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, + 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x1000, 0x0080, 0x1000, 0x0000, 0x0000, + }; + + /// + /// Interprets a source string to an object of type . + /// + /// The source string. + /// The interpreted object. + public static T Interpret(string src) { + return Interpret(src, BinderAttribute.CreateBinderOfType(typeof(T))); + } + /// + /// Interprets a source string to an object of type with a binder. + /// + /// The source string. + /// The binder. + /// The interpreted object. + public static T Interpret(string src, Binder binder) { + return new PdtInterpreter(src, binder).Interpret(); + } + + readonly string _src; + readonly Binder _binder; + protected int Position { get; private set; } +#pragma warning disable IDE1006 + protected char cc { get { return _src[Position]; } } + protected int ct { get { return cm[cc]; } } + protected string tokenb(int flag) { // Token Whitelist + int sp = Position; + while ((ct & flag) == 0) Position++; + return _src.Substring(sp, Position - sp); + } + protected string tokenw(int flag) { // Token Whitelist + int sp = Position; + while ((ct & flag) != 0) Position++; + return _src.Substring(sp, Position - sp); + } + protected void ws() { + while ((ct & 0x0001) != 0) Position++; + } +#pragma warning restore IDE1006 + + protected char GetChar() { + char r = cc; + Position++; + return r; + } + protected string GetIdentifier() { + if ((ct & 0x0020) == 0) return ""; + return tokenw(0x0010); + } + protected string GetNumber() { + return tokenw(0x0040); + } + protected string GetString() { + int sp = Position; + do { + if (cc == '\\') Position++; + Position++; + } while (ct != 0x0100); + Position++; + return Regex.Replace(_src.Substring(sp + 1, Position - sp - 2), @"\\(.)", "$1"); + } + protected PdtExpression GetExp() { + var ins = new LinkedList(); + int _; + InterpretExp(ins, -2, out _); + return new PdtExpression(ins); + } + + readonly Dictionary defs = new Dictionary(); + /// + /// Creates an instance of the class. + /// + /// The source string. + /// The binder. May be null. + public PdtInterpreter(string src, Binder binder) { + _src = src; + _binder = binder; + if (_binder == null) + _binder = BinderAttribute.CreateBinderOfType(typeof(T)); + } + /// + /// Interprets the source to an object of type . + /// + /// The interpreted object. + public T Interpret() { + InterpretDirectives(); + return (T)InterpretObject(typeof(T)); + } + void InterpretDirectives() { + bool flag = false; + ws(); + while (cc == '#') { + Position++; + switch (GetIdentifier()) { + case "ver": + ws(); + Logger.Log("main", 3, "PDT", "Legacy PDT directive #ver={0} found. Ignoring.", GetNumber()); + break; + case "format": + ws(); + if (GetNumber() != "1") + throw new NotSupportedException("Format not supported"); + flag = true; + break; + case "define": + if (!flag) throw new FormatException("Format directive not found"); + ws(); + string dname = GetIdentifier(); + ws(); + PdtExpression dexp = GetExp(); + defs.Add(dname, dexp); + break; + default: + throw new NotSupportedException("Unsupported directive found"); + } + ws(); + } + if (!flag) throw new FormatException("Format directive not found"); + } + object InterpretObject(Type type) { + var result = ReflectionHelper.InvokeEmptyConstructor(type); + bool dictflag = ReflectionHelper.IsGenericDictionary(type); + while (true) { + try { ws(); } + catch (IndexOutOfRangeException) { return result; } + object pkey = InterpretKey(type); + char c = GetChar(); + switch (c) { + case '{': + if (dictflag) { + var ktype = type.GetGenericArguments()[0]; + var ptype = type.GetGenericArguments()[1]; + object key = _binder.ChangeType(pkey, ktype, null); + object value = InterpretObject(ptype); + ((IDictionary)result).Add(key, value); + } + else { + MemberInfo prop; + bool flag = ReflectionHelper.TryFindMemberWithAttribute(type, out prop); + if (!flag && pkey is string) prop = ReflectionHelper.GetMember(type, (string)pkey); + Type ptype = ReflectionHelper.GetMemberType(prop); + if (ReflectionHelper.IsGenericDictionary(ptype)) { + var ktype = ptype.GetGenericArguments()[0]; + var vtype = ptype.GetGenericArguments()[1]; + if (flag) { + object key = _binder.ChangeType(pkey, ktype, null); + object value = InterpretObject(vtype); + ((IDictionary)ReflectionHelper.GetValue(prop, result)).Add(key, value); + } + else ReflectionHelper.SetValue(prop, result, InterpretObject(ptype)); + } + else ReflectionHelper.SetValue(prop, result, InterpretObject(ptype)); + } + break; + case ':': + case ';': + var exp = c == ';' ? _emptyexp : GetExp(); + if (dictflag) { + var ktype = type.GetGenericArguments()[0]; + var vtype = type.GetGenericArguments()[1]; + object key = _binder.ChangeType(pkey, ktype, null); + object value = _binder.ChangeType(exp, vtype, null); + ((IDictionary)result).Add(key, value); + } + else { + MemberInfo prop; + bool flag = ReflectionHelper.TryFindMemberWithAttribute(type, out prop); + if (!flag && pkey is string) prop = ReflectionHelper.GetMember(type, (string)pkey); + var ptype = ReflectionHelper.GetMemberType(prop); + if (!typeof(IDictionary).IsAssignableFrom(ptype)) { + object value = _binder.ChangeType(exp, ptype, null); + ReflectionHelper.SetValue(prop, result, value, _binder); + } + else { + var ktype = ptype.GetGenericArguments()[0]; + var vtype = ptype.GetGenericArguments()[1]; + object key = _binder.ChangeType(pkey, ktype, null); + object value = _binder.ChangeType(exp, vtype, null); + ((IDictionary)ReflectionHelper.GetValue(prop, result)).Add(key, value); + } + } + break; + case '}': + return result; + } + } + } + protected virtual object InterpretKey(Type type) { + return tokenb(0x1000).Trim(); + } + } +} diff --git a/Assets/Cryville/Common/Pdt/PdtInterpreter.cs.meta b/Assets/Cryville/Common/Pdt/PdtInterpreter.cs.meta new file mode 100644 index 0000000..720bdd4 --- /dev/null +++ b/Assets/Cryville/Common/Pdt/PdtInterpreter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2a66a8564bee7c8449417a795cee8729 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/Pdt/PdtOperator.cs b/Assets/Cryville/Common/Pdt/PdtOperator.cs new file mode 100644 index 0000000..d759334 --- /dev/null +++ b/Assets/Cryville/Common/Pdt/PdtOperator.cs @@ -0,0 +1,77 @@ +using System; + +namespace Cryville.Common.Pdt { + /// + /// PDT operator. + /// + public unsafe abstract class PdtOperator { + byte* _prmem; + int _loadindex; + readonly PdtVariableMemory[] _operands; + /// + /// The count of the operands loaded. + /// + protected int LoadedOperandCount { get { return ParamCount - _loadindex; } } + /// + /// Gets the operand at the specified index. + /// + /// The index. + /// The operand at the specified index. + /// is not less than or less than 0. + protected PdtVariableMemory GetOperand(int index) { + if (index >= LoadedOperandCount || index < 0) throw new IndexOutOfRangeException(); + int i = index + _loadindex; + return _operands[i]; + } + internal int ParamCount { get; private set; } + /// + /// Creates an instance of the class. + /// + /// The suggested parameter count. + protected PdtOperator(int pc) { + ParamCount = pc; + _operands = new PdtVariableMemory[pc]; + } + PdtEvaluatorBase _etor; + bool _failure = false; + bool _rfreq = true; + internal void Begin(PdtEvaluatorBase etor) { + _etor = etor; + _failure = false; + _loadindex = ParamCount; + } + internal void LoadOperand(PdtVariableMemory mem) { + if (_loadindex == 0) return; + _operands[--_loadindex] = mem; + } + internal void Call(byte* prmem, bool noset) { + _prmem = prmem; + _rfreq = false; + Execute(); + if (!_rfreq && !noset) throw new InvalidOperationException("Return frame not set"); + if (_failure) { + if (_rfreq) _etor.DiscardStack(); + throw new InvalidOperationException("Evaluation failed"); + } + } + /// + /// Executes the operator. + /// + protected abstract void Execute(); + /// + /// Gets a return frame. + /// + /// The type of the frame. + /// The length of the frame. + /// The return frame. + /// The return frame has already been requested. + protected PdtVariableMemory GetReturnFrame(int type, int len) { + if (_rfreq) { + _failure = true; + throw new InvalidOperationException("Return frame already requested"); + } + _rfreq = true; + return _etor.StackAlloc(type, _prmem, len); + } + } +} \ No newline at end of file diff --git a/Assets/Cryville/Common/Pdt/PdtOperator.cs.meta b/Assets/Cryville/Common/Pdt/PdtOperator.cs.meta new file mode 100644 index 0000000..d9ece16 --- /dev/null +++ b/Assets/Cryville/Common/Pdt/PdtOperator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dc184c2d84fe5ea449cea78cba46d74d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/Pdt/PdtReader.cs b/Assets/Cryville/Common/Pdt/PdtReader.cs new file mode 100644 index 0000000..0aef560 --- /dev/null +++ b/Assets/Cryville/Common/Pdt/PdtReader.cs @@ -0,0 +1,749 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; + +namespace Cryville.Common.Pdt { +#if false + [Obsolete] + public static class PdtReader { + readonly static char[] ws = { + ' ', '\t', '\n', '\r' + }; + readonly static char[] spunc = { + ' ', '\t', '\n', '\r', + '{', '}', ';' + }; + readonly static char[] ipunc = { + ' ', '\t', '\n', '\r', + '{', '}', ';', + ':' + }; + readonly static char[] vpunc = { + '{', '}', ';' + }; + static int pos; + static string data; + static char cc { + get { + return data[pos]; + } + } + static bool eof { + get { + return pos == data.Length; + } + } + static Dictionary definitions; + public static T Read(string _data, Binder binder = null) { + data = _data; + pos = 0; + definitions = new Dictionary(); + while (true) { + if (cc == '#') { + SkipChar(); + var s = GetIdentifier(); + switch (s) { + case "ver": + var s2 = GetString(); + if (s2 != "1") throw new FormatException("Invalid PDT version"); + continue; + case "define": + var s3 = GetString(); + var s4 = GetValue(); + definitions.Add(s3, new Expression(s4, definitions)); + SkipChar(); + // TODO + continue; + default: + SkipLine(); + continue; + } + } + break; + } + if (binder == null) + binder = BinderAttribute.CreateBinderOfType(typeof(T)); + return (T)ParseObject(typeof(T), binder); + } + + static object ParseObject(Type type, Binder binder) { + // TODO Binder + object obj = type.GetConstructor(new Type[]{}).Invoke(new object[]{}); + while (true) { + if (eof) return obj; + string str = GetValue(); + if (cc == '{') { // List item + SkipChar(); + string strkey = str; + if (typeof(IDictionary).IsAssignableFrom(type)) { + var ktype = type.GetGenericArguments()[0]; + var ptype = type.GetGenericArguments()[1]; + object key = binder.ChangeType(strkey, ktype, null); + object value = ParseObject(ptype, binder); + ((IDictionary)obj).Add(key, value); + } + else { + MemberInfo prop = null; + Type ttype = null; + bool flag = ReflectionHelper.TryFindMemberWithAttribute(type, out prop); + if (!flag) + prop = ReflectionHelper.GetMember(type, strkey); + ttype = ReflectionHelper.GetMemberType(prop); + if (!typeof(IDictionary).IsAssignableFrom(ttype)) { + throw new NotImplementedException(); + } + else { + var ktype = ttype.GetGenericArguments()[0]; + var ptype = ttype.GetGenericArguments()[1]; + if (flag) { + object key = binder.ChangeType(strkey, ktype, null); + object value = ParseObject(ptype, binder); + ((IDictionary)ReflectionHelper.GetValue(prop, obj)).Add(key, value); + } + else { + ReflectionHelper.SetValue(prop, obj, ParseObject(ttype, binder)); + } + } + } + } + else if (cc == ';') { // Single property + SkipChar(); + string strkey; + MemberInfo prop = null; + if (str[0] == '*') { // Component-like property + strkey = str.Substring(1); + prop = ReflectionHelper.FindMemberWithAttribute(type); + var ttype = ReflectionHelper.GetMemberType(prop); + if (!typeof(IList).IsAssignableFrom(ttype)) + throw new Exception(); // TODO + var ktype = ttype.GetGenericArguments()[0]; + object key = binder.ChangeType(strkey, ktype, null); + ((IList)ReflectionHelper.GetValue(prop, obj)).Add(key); + } + else { // Common property + var kv = str.Split(new char[]{':'}, 2); + strkey = kv[0]; + // TODO + if (typeof(IDictionary).IsAssignableFrom(type)) { + var ktype = type.GetGenericArguments()[0]; + var ptype = type.GetGenericArguments()[1]; + object key = binder.ChangeType(strkey, ktype, null); + object value = binder.ChangeType(new Expression( + kv.Length == 1 ? "true" : kv[1], definitions + ), ptype, null); + ((IDictionary)obj).Add(key, value); + } + else { + bool flag = ReflectionHelper.TryFindMemberWithAttribute(type, out prop); + if (!flag) + prop = ReflectionHelper.GetMember(type, strkey); + var ttype = ReflectionHelper.GetMemberType(prop); + if (!typeof(IDictionary).IsAssignableFrom(ttype)) { + object value = binder.ChangeType(new Expression( + kv.Length == 1 ? "true" : kv[1], definitions + ), ttype, null); + ReflectionHelper.SetValue(prop, obj, value, binder); + } + else { + var ktype = ttype.GetGenericArguments()[0]; + var ptype = ttype.GetGenericArguments()[1]; + object key = binder.ChangeType(strkey, ktype, null); + object value = binder.ChangeType(new Expression( + kv.Length == 1 ? "true" : kv[1], definitions + ), ptype, null); + ((IDictionary)ReflectionHelper.GetValue(prop, obj)).Add(key, value); + } + } + } + } + else if (cc == '}') { + try { SkipChar(); } + catch (IndexOutOfRangeException) { } + return obj; + } + else throw new Exception(); // TODO + } + } + + static void SkipChar() { + pos++; + SkipWs(); + } + + static void SkipWs() { + while (true) { + for (; ws.Contains(cc); pos++); + if (data[pos] == '/' && data[pos + 1] == '*') { + for (; data[pos] != '*' || data[pos+1] != '/'; pos++); + pos += 2; + } + else return; + } + } + + static string GetIdentifier() { + SkipWs(); + string r = ""; + for (; !ipunc.Contains(cc); pos++) r += cc; + SkipWs(); + return r; + } + + static string GetString() { + SkipWs(); + string r = ""; + for (; !spunc.Contains(cc); pos++) r += cc; + SkipWs(); + return r; + } + + static string GetValue() { + SkipWs(); + string r = ""; + for (; !vpunc.Contains(cc); pos++) r += cc; + SkipWs(); + return r.Trim(); + } + + static void SkipLine() { + for (; cc != '\n'; pos++); + SkipWs(); + } + } +#endif + + public class ElementListAttribute : Attribute { } + public class ComponentListAttribute : Attribute { } + public class PropertyListAttribute : Attribute { } + +#if false + [Obsolete] + public abstract class ExpBase { + public string exp { + get; + private set; + } + public ExpBase(string s) { + exp = s; + } + public override string ToString() { + return exp; + } + } + [Obsolete] + public abstract class ValueBase : ExpBase { + public ValueBase(string s) : base(s) { } + + object preEvalResult; + byte preEvalDepth = 0; + public bool IsDynamic { + get { return preEvalDepth == 0; } + } + + protected abstract object EvalInternal(IEvaluator etor); + public void PreEval(IEvaluator etor, byte depth = 1) { + if (depth == 0) throw new ArgumentException("depth cannot be 0"); + if (preEvalDepth != 0 && preEvalDepth < depth) return; + try { + preEvalResult = PreEvalInternal(etor, depth); + preEvalDepth = depth; + } + catch (Exception) { } + } + protected virtual object PreEvalInternal(IEvaluator etor, byte depth) { + return Eval(etor); + } + public object Eval(IEvaluator etor) { + if (preEvalDepth != 0) + return preEvalResult; + return EvalInternal(etor); + } + } + [Obsolete] + public class Identifier : ValueBase { + public Identifier(string s) : base(s) { } + protected override object EvalInternal(IEvaluator etor) { + return etor.EvalIdentifier(exp); + } + } + [Obsolete] + public class Operand : ExpBase { + public OperandPriority Priority { + get; + private set; + } + public Operand(string s) : base(s) { + switch (s) { + case ".": Priority = OperandPriority.Prop; break; + case "*": case "/": Priority = OperandPriority.Mul; break; + case "+": case "-": Priority = OperandPriority.Add; break; + case " ": case ",": Priority = OperandPriority.Sep; break; + default: Priority = OperandPriority.None; break; + } + } + public Operand(string s, OperandPriority p) : base(s) { + Priority = p; + } + } + [Obsolete] + public enum OperandPriority { + None = 0, + Prop = 5, + NeibMul = 4, + Mul = 3, + Add = 2, + Sep = 1 + } + [Obsolete] + public abstract class ConstantBase : ValueBase { + public ConstantBase(string s) : base(s) { } + } + [Obsolete] + public class CNumber : ConstantBase { + public CNumber(string s) : base(s) { } + protected override object EvalInternal(IEvaluator etor) { + return etor.ParseNumber(exp); + } + } + [Obsolete] + public class CString : ConstantBase { + public CString(string s) : base(s) { } + protected override object EvalInternal(IEvaluator etor) { + return etor.ParseString(exp); + } + } + [Obsolete] + public class BracketInitial : ExpBase { + public BracketInitial() : base("(") { } + } + [Obsolete] + public class BracketFinal : ExpBase { + public BracketFinal() : base(")") { } + } + [Obsolete] + public class Expression : ValueBase { + List estack = new List(); + List ostack = new List(); + StackType type; + enum StackType { + Root, Unary, Bracketed, Supportive, Function + } + + readonly OperandPriority Priority; + public Expression(string s, Dictionary def) : base("") { + var exp = s.Trim(); + type = StackType.Root; + int pos = 0; + var b = new List(); + while (pos < exp.Length) { + b.Add(Forward(ref exp, ref pos)); + } + var lb = b[b.Count - 1]; + if (def.ContainsKey(lb.exp)) { + b.Add(def[lb.exp]); + b.Remove(lb); + } + for (int i = b.Count - 2; i >= 0; i--) { + // TODO Insertion + var lhb = b[i]; + var rhb = b[i + 1]; + if (lhb is ConstantBase || lhb is Expression || lhb is BracketFinal) { + if (rhb is Identifier || rhb is Expression || rhb is BracketInitial) { + b.Insert(i + 1, new Operand("*", OperandPriority.NeibMul)); + } + } + else if (lhb is Identifier) { + if (rhb is Expression) { + b.Insert(i + 1, new Operand("*", OperandPriority.NeibMul)); + } + if (def.ContainsKey(lhb.exp)) { + b.Insert(i, def[lhb.exp]); + b.Remove(lhb); + } + } + } + int p = 0; + estack.Add(new Expression(b, ref p, StackType.Bracketed, def)); + } + + public Expression Clone() { + var r = (Expression)this.MemberwiseClone(); + + var es = new ValueBase[estack.Count]; + estack.CopyTo(es); + r.estack = es.ToList(); + + var os = new Operand[ostack.Count]; + ostack.CopyTo(os); + r.ostack = os.ToList(); + + return r; + } + + Expression(List b, ref int p, StackType t, Dictionary def) : base("") { + type = t; + if (t == StackType.Unary) { + ostack.Add((Operand)b[p]); + p++; + } + while (p < b.Count - 1) { + if (estack.Count == 0) { + var b0 = b[p]; + if (b0 is Operand) { + var lp = p; + var e = new Expression( + b, + ref p, + StackType.Unary, + def + ); + b.Insert(p, e); + b.RemoveRange(lp, p - lp); + p = lp; + } + else if (b0 is BracketInitial) { + var lp = p; + p++; + var e = new Expression( + b, + ref p, + StackType.Bracketed, + def + ); + b.Insert(p, e); + b.RemoveRange(lp, p - lp); + p = lp; + } + estack.Add((ValueBase)b[p]); + p++; + if (t == StackType.Unary) { + if (estack.Count != 1) + throw new Exception(); // TODO + else return; + } + } + if (p >= b.Count) return; + var b1 = b[p]; + if (b1 is BracketFinal) { + if (t == StackType.Bracketed) p++; + return; + } + var b2 = b[p + 1]; + if (b2 is BracketInitial) { + var lp = p + 1; + p += 2; + var e = new Expression( + b, + ref p, + StackType.Bracketed, + def + ); + b.Insert(p, e); + b.RemoveRange(lp, p - lp); + p = lp - 1; + b2 = b[p + 1]; + } + if (b1 is Operand) { + if (estack.Count == 1) + Priority = ((Operand)b1).Priority; + if (b2 is Operand) { + var lp = p + 1; + p++; + var e = new Expression( + b, + ref p, + StackType.Unary, + def + ); + b.Insert(p, e); + b.RemoveRange(lp, p - lp); + p = lp - 1; + b2 = b[p + 1]; + } + if (p + 2 >= b.Count) { + ostack.Add((Operand)b1); + estack.Add((ValueBase)b2); + p += 2; + return; + } + var b3 = b[p + 2]; + if (b3 is BracketFinal) { + ostack.Add((Operand)b1); + estack.Add((ValueBase)b2); + p += 2; + if (t == StackType.Bracketed) p++; + return; + } + else if (b3 is Operand) { + var o1 = (Operand)b1; var o2 = (Operand)b3; + if (o2.Priority == Priority) { + ostack.Add(o1); estack.Add((ValueBase)b2); + p += 2; + continue; + } + else if (o2.Priority > Priority) { + var lp = p + 1; + p++; + var e = new Expression( + b, ref p, + StackType.Supportive, def + ); + b.Insert(p, e); + b.RemoveRange(lp, p - lp); + p = lp - 1; + continue; + } + else if (o2.Priority < Priority) { + ostack.Add(o1); + estack.Add((ValueBase)b2); + // b.RemoveRange(0, 2); + if (type == StackType.Bracketed) { + Expression cl = this.Clone(); + cl.type = StackType.Supportive; + estack.Clear(); + ostack.Clear(); + estack.Add(cl); + Priority = o2.Priority; + p += 2; + continue; + } + else { + type = StackType.Supportive; + p += 2; + return; + } + } + } + else + throw new Exception(); // TODO + } + else + throw new Exception(); // TODO + throw new Exception(); // TODO + + /*if (lb is Identifier) { + if (def.ContainsKey(lb.exp)) { + b.Add(def[lb.exp]); + b.Remove(lb); + } + } + // Unary + if (estack.Count == 0) { + if (b[0] is Operand) { + b.Add(new Expression( + b, + ref p, + StackType.Unary, + def + )); + b.RemoveAt(0); + } + if (b[0] is ValueBase) { + estack.Add((ValueBase)b[0]); + b.RemoveAt(0); + if (type == StackType.Unary) return; + if (b.Count == 0) continue; + } + } + if (estack.Count == 1) { + if (b[0] is Operand) + Priority = ((Operand)b[0]).Priority; + } + // Bracket + if (lb is BracketInitial) { + b.Remove(lb); + b.Add(new Expression(b, ref p, StackType.Bracketed, def)); + } + else if (lb is BracketFinal) { + if (type != StackType.Bracketed) p--; + foreach (var i in b) { + if (i is Operand) ostack.Add((Operand)i); + else if (i is BracketFinal) return; + else estack.Add((ValueBase)i); + } + } + var c = b.Count; + if (c <= 1) continue; + // Two blocks + lb = b[c - 1]; + var lb1 = b[c - 2]; + if (lb is Operand && lb1 is Operand) { + b.Add(new Expression( + b, + ref p, + StackType.Unary, + def + )); + b.RemoveAt(b.Count - 2); + } + c = b.Count; + if (c <= 2) continue; + // Three blocks + var b0 = b[0]; + var b1 = b[1]; + var b2 = b[2]; + if (!(b0 is Operand)) + throw new Exception(); // TODO + if (!(b1 is ValueBase)) + throw new Exception(); // TODO + if (!(b2 is Operand)) + throw new Exception(); // TODO + var o1 = (Operand)b0; var o2 = (Operand)b2; + if (o2.Priority == Priority) { + ostack.Add(o1); estack.Add((ValueBase)b1); + b.Remove(o1); b.Remove(b1); + continue; + } + if (o2.Priority > Priority) { + b.Add(new Expression( + b, ref p, + StackType.Supportive, def + )); + b.RemoveRange(1, b.Count - 2); + continue; + } + if (o2.Priority < Priority) { + ostack.Add(o1); + estack.Add((ValueBase)b1); + b.RemoveRange(0, 2); + if (type == StackType.Bracketed) { + Expression cl = this.Clone(); + cl.type = StackType.Supportive; + estack.Clear(); + ostack.Clear(); + estack.Add(cl); + Priority = o2.Priority; + } + else { + type = StackType.Supportive; + // p = o2.Index; + return; + } + }*/ + } + estack.Add((ValueBase)b[b.Count - 1]); + p++; + } + ExpBase Forward(ref string s, ref int p) { + char sc = s[p]; + string r = ""; + if (cat(sc) == 3) { + p++; + return new BracketInitial(); + } + else if (cat(sc) == 4) { + p++; + return new BracketFinal(); + } + else if (cat(sc) == 5) { + for (; p < s.Length; p++) { + if (cat(s[p]) != 5) break; + r += s[p]; + } + if (r == ".") return new Operand(r); + else return new CNumber(r); + } + else if (cat(sc) == 2) { + p++; + for (; s[p] != sc; p++) + r += s[p]; + p++; + return new CString(r); + } + else if (cat(sc) == 0) { + for (; p < s.Length; p++) { + if (cat(s[p]) != 0) break; + r += s[p]; + } + if (p == s.Length) return new Identifier(r); + if (s[p] == '(') return new Operand(r); + else return new Identifier(r); + } + else if (cat(sc) == 1) { + p++; + return new Operand(sc.ToString()); + } + else + throw new Exception(); // TODO + } + + protected override object EvalInternal(IEvaluator etor) { + if (type == StackType.Unary) { + if (ostack[0].Priority == OperandPriority.None) + return etor.OperateFunction(ostack[0], estack[0].Eval(etor)); + else + return etor.OperateUnary(ostack[0], estack[0].Eval(etor)); + } + else { + object r = estack[0].Eval(etor); + for (int i = 0; i < ostack.Count; i++) { + r = etor.OperateBinary( + ostack[i], r, estack[i+1].Eval(etor) + ); + } + return r; + } + } + public T Eval(IEvaluator etor) { + return (T)etor.Cast(typeof(T), EvalInternal(etor)); + } + protected override object PreEvalInternal(IEvaluator etor, byte depth) { + try { return EvalInternal(etor); } + catch (Exception) { + foreach (var v in estack) + v.PreEval(etor, depth); + throw; + } + } + + // 0: Other, 1: Operand, 2: String, + // 3: SOE, 4: EOE, 5: Number + static readonly byte[] ctl = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 2, 1, 0, 1, 1, 2, 3, 4, 1, 1, 1, 1, 5, 1, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, + }; + static byte cat(char c) { + if (c >> 7 != 0) + return 0; + else + return ctl[c]; + } + + public override string ToString() { + if (type == StackType.Unary) + return string.Format("{0}{1}", ostack[0], estack[0]); + if (type == StackType.Function) + return string.Format("{0}{1}", ostack[0], estack[0]); + string r = estack[0].ToString(); + for (int i = 0; i < ostack.Count; i++) { + r += ostack[i].ToString(); + r += estack[i + 1].ToString(); + } + if (type == StackType.Bracketed) + r = string.Format("({0})", r); + return r; + } + } + + [Obsolete] + public interface IEvaluator { + object ParseNumber(string exp); + object ParseString(string exp); + object EvalIdentifier(string exp); + object OperateUnary(Operand op, object q); + object OperateBinary(Operand op, object q, object r); + object OperateFunction(Operand op, object q); + // TODO [Obsolete] + object Cast(Type type, object obj); + //public abstract Func GetCastCallback(Type dest, Type source); + } +#endif +} diff --git a/Assets/Cryville/Common/Pdt/PdtReader.cs.meta b/Assets/Cryville/Common/Pdt/PdtReader.cs.meta new file mode 100644 index 0000000..36b655b --- /dev/null +++ b/Assets/Cryville/Common/Pdt/PdtReader.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 688e46fb4d8e6a041844f592f1333af7 +timeCreated: 1608801352 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/Pdt/PdtVariableMemory.cs b/Assets/Cryville/Common/Pdt/PdtVariableMemory.cs new file mode 100644 index 0000000..a8b6360 --- /dev/null +++ b/Assets/Cryville/Common/Pdt/PdtVariableMemory.cs @@ -0,0 +1,143 @@ +using System; +using System.Text; +using UnityEditor; + +namespace Cryville.Common.Pdt { + /// + /// Span on the memory of a . + /// + public unsafe struct PdtVariableMemory { + byte* _ptr; + /// + /// The length of the span. + /// + public int Length { get; private set; } + /// + /// The type of the span. + /// + public int Type { get; private set; } + internal PdtVariableMemory(int type, byte* ptr, int len) { + Type = type; + _ptr = ptr; + Length = len; + } + /// + /// Copies the memory in the span to a buffer. + /// + /// The destination buffer. + /// The offset on the destination buffer to start copying to. + public void CopyTo(byte[] dest, int destOffset) { + fixed (byte* ptr = dest) { + CopyTo(ptr, destOffset, Length); + } + } + /// + /// Copies the memory in the span to a buffer. + /// + /// The destination buffer. + /// The offset on the destination buffer to start copying to. + /// The length to copy. + public void CopyTo(byte* dest, int destOffset, int length) { + for (int i = 0; i < length; i++) + dest[destOffset + i] = _ptr[i]; + } + /// + /// Gets the memory of the span as a number. + /// + /// A number. + /// The span does not represent a number. + public float AsNumber() { + if (Type != PdtInternalType.Number) + throw new InvalidCastException("Not a number"); + float value; + byte* ptr = (byte*)&value; + for (int i = 0; i < sizeof(float); i++) + ptr[i] = _ptr[i]; + return value; + } + /// + /// Sets the memory of the span to a number. + /// + /// The number. + /// The span does not represent a number. + public void SetNumber(float value) { + if (Type != PdtInternalType.Number) + throw new InvalidCastException("Not a number"); + byte* ptr = (byte*)&value; + for (int i = 0; i < sizeof(float); i++) + _ptr[i] = ptr[i]; + } + /// + /// Gets the memory of the span as a string. + /// + /// The offset on the span to start reading from. + /// A string. + /// The span at the offset does not represent a string. + public string AsString(int offset = 0) { + if (Type != PdtInternalType.String && Type != PdtInternalType.Array) + throw new InvalidCastException("Not a string"); + var len = *(int*)(_ptr + offset); + return new string((char*)(_ptr + offset + sizeof(int)), 0, len); + } + /// + /// Sets the memory of the span to a string. + /// + /// The string. + /// The offset from the start of the span. + /// The span at the offset does not represent a string. + /// The length of the span is not sufficient. + public void SetString(string value, int offset = 0) { + if (Type != PdtInternalType.String && Type != PdtInternalType.Array) + throw new InvalidCastException("Not a string"); + int strlen = value.Length; + if (Length < strlen * sizeof(char) + sizeof(int) + offset) + throw new InvalidOperationException("Frame length not sufficient"); + char* ptr = (char*)(_ptr + offset + sizeof(int)); + *(int*)(_ptr + offset) = strlen; + int i = 0; + foreach (var c in value) ptr[i++] = c; + } + /// + /// Gets the memory of the span as an undefined identifier. + /// + /// The offset on the span to start reading from. + /// The name of an undefined identifier. + /// The span does not represent an undefined identifier. + public string AsIdentifier(int offset = 0) { + if (Type != PdtInternalType.Undefined && Type != PdtInternalType.Array) + throw new InvalidCastException("Not an identifier"); + var len = *(int*)(_ptr + offset); + return new string((char*)(_ptr + offset + sizeof(int)), 0, len); + } + internal void* TrustedAsOfLength(int len) { + if (Length < len) + throw new InvalidCastException("Type not matched"); + return _ptr; + } + /// + /// Gets the array suffix. + /// + /// The type of the array. + /// The item count of the array. + /// The span does not represent an array. + public void GetArraySuffix(out int arrtype, out int pc) { + if (Type != PdtInternalType.Array && Type != PdtInternalType.Array) + throw new InvalidCastException("Not an array or vector"); + arrtype = *(int*)(_ptr + Length - sizeof(int)); + if (Type == PdtInternalType.Array) pc = *(int*)(_ptr + Length - 2 * sizeof(int)); + else pc = -1; + } + /// + /// Sets the array suffix. + /// + /// The type of the array. + /// The item count of the array. + /// The span does not represent an array. + public void SetArraySuffix(int arrtype, int pc = 0) { + if (Type != PdtInternalType.Vector && Type != PdtInternalType.Array) + throw new InvalidCastException("Not an array or vector"); + *(int*)(_ptr + Length - sizeof(int)) = arrtype; + if (Type == PdtInternalType.Array) *(int*)(_ptr + Length - 2 * sizeof(int)) = pc; + } + } +} diff --git a/Assets/Cryville/Common/Pdt/PdtVariableMemory.cs.meta b/Assets/Cryville/Common/Pdt/PdtVariableMemory.cs.meta new file mode 100644 index 0000000..740f536 --- /dev/null +++ b/Assets/Cryville/Common/Pdt/PdtVariableMemory.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0e710eef537a1ac488ef6bce16625b62 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/Plist.meta b/Assets/Cryville/Common/Plist.meta new file mode 100644 index 0000000..7990dfd --- /dev/null +++ b/Assets/Cryville/Common/Plist.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 925f95cb7c6644a4695b2701d42e1ea2 +folderAsset: yes +timeCreated: 1606989037 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/Plist/PlistConvert.cs b/Assets/Cryville/Common/Plist/PlistConvert.cs new file mode 100644 index 0000000..2a082c4 --- /dev/null +++ b/Assets/Cryville/Common/Plist/PlistConvert.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Reflection; + +namespace Cryville.Common.Plist { + public class PlistConvert { + public static T Deserialize(string file) { + return (T)Deserialize(typeof(T), PlistCS.Plist.readPlist(file)); + } + + public static object Deserialize(Type type, object obj, Binder binder = null) { + if (binder == null) + binder = BinderAttribute.CreateBinderOfType(type); + if (obj is IList) { + var lobj = (List)obj; + foreach (var i in lobj) { + throw new NotImplementedException(); // TODO + } + } + else if (obj is IDictionary) { + var dobj = (Dictionary)obj; + if (typeof(IDictionary).IsAssignableFrom(type)) { + var result = (IDictionary)ReflectionHelper.InvokeEmptyConstructor(type); + var it = type.GetGenericArguments()[1]; + foreach (var i in dobj) { + var value = Deserialize(it, i.Value, binder); + result.Add(i.Key, value); + } + return result; + } + else { + var result = ReflectionHelper.InvokeEmptyConstructor(type); + foreach (var i in dobj) { + var imis = type.GetMember(i.Key); + if (imis.Length == 0) continue; + var imi = imis[0]; + var it = ReflectionHelper.GetMemberType(imi); + var value = Deserialize(it, i.Value, binder); + ReflectionHelper.SetValue(imi, result, value, binder); + } + return result; + } + } + else return obj; + throw new Exception(); // TODO + } + } +} diff --git a/Assets/Cryville/Common/Plist/PlistConvert.cs.meta b/Assets/Cryville/Common/Plist/PlistConvert.cs.meta new file mode 100644 index 0000000..3d43254 --- /dev/null +++ b/Assets/Cryville/Common/Plist/PlistConvert.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3bc71e8b62d4022409aa5518bbf3a7d8 +timeCreated: 1608801352 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/ReflectionHelper.cs b/Assets/Cryville/Common/ReflectionHelper.cs new file mode 100644 index 0000000..4bbcf83 --- /dev/null +++ b/Assets/Cryville/Common/ReflectionHelper.cs @@ -0,0 +1,102 @@ +using System; +using System.Reflection; +using System.Collections.Generic; +using System.Linq; + +namespace Cryville.Common { + public static class ReflectionHelper { + static readonly Type[] emptyTypeArray = {}; + public static ConstructorInfo GetEmptyConstructor(Type type) { + return type.GetConstructor(emptyTypeArray); + } + static readonly object[] emptyObjectArray = {}; + public static object InvokeEmptyConstructor(Type type) { + return GetEmptyConstructor(type).Invoke(emptyObjectArray); + } + + public static bool TryFindMemberWithAttribute(Type t, out MemberInfo mi) where T : Attribute { + try { + mi = FindMemberWithAttribute(t); + return true; + } + catch (MissingMemberException) { + mi = null; + return false; + } + } + public static MemberInfo FindMemberWithAttribute(Type type) where T : Attribute { + var mil = type.FindMembers( + MemberTypes.Field | MemberTypes.Property, + BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static, + (m, o) => m.GetCustomAttributes(typeof(T), true).Length != 0, + null + ); + if (mil.Length != 1) + throw new MissingMemberException(type.Name, typeof(T).Name); + return mil[0]; + } + + public static bool IsGenericDictionary(Type type) { + return type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Dictionary<,>); + } + + public static MemberInfo GetMember(Type type, string name) { + var mil = type.GetMember( + name, + MemberTypes.Field | MemberTypes.Property, + BindingFlags.Public | BindingFlags.Instance + ); + if (mil.Length != 1) + throw new MissingMemberException(type.Name, name); + return mil[0]; + } + + public static Type GetMemberType(MemberInfo mi) { + if (mi is FieldInfo) + return ((FieldInfo)mi).FieldType; + if (mi is PropertyInfo) + return ((PropertyInfo)mi).PropertyType; + else + throw new ArgumentException(); + } + + public static object GetValue(MemberInfo mi, object obj) { + if (mi is FieldInfo) + return ((FieldInfo)mi).GetValue(obj); + else if (mi is PropertyInfo) + return ((PropertyInfo)mi).GetValue(obj, new object[]{}); + else + throw new ArgumentException(); + } + + public static void SetValue(MemberInfo mi, object obj, object value, Binder binder = null) { + if (mi is FieldInfo) + ((FieldInfo)mi).SetValue(obj, value, BindingFlags.Default, binder, null); + else if (mi is PropertyInfo) + ((PropertyInfo)mi).SetValue(obj, value, BindingFlags.Default, binder, emptyObjectArray, null); + else + throw new ArgumentException(); + } + + public static Type[] GetSubclassesOf() where T : class { + var assemblies = AppDomain.CurrentDomain.GetAssemblies(); + IEnumerable r = new List(); + foreach (var a in assemblies) + r = r.Concat(a.GetTypes().Where( + t => t.IsClass + && !t.IsAbstract + && t.IsSubclassOf(typeof(T)) + )); + return r.ToArray(); + } + + public static string GetSimpleName(Type type) { + string result = type.Name; + var typeargs = type.GetGenericArguments(); + if (typeargs.Length > 0) { + result = string.Format("{0}[{1}]", result, string.Join(",", from a in typeargs select GetSimpleName(a))); + } + return result; + } + } +} diff --git a/Assets/Cryville/Common/ReflectionHelper.cs.meta b/Assets/Cryville/Common/ReflectionHelper.cs.meta new file mode 100644 index 0000000..fde53ad --- /dev/null +++ b/Assets/Cryville/Common/ReflectionHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 16857d076fc8d534788424e6c6d180e0 +timeCreated: 1608801352 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/StringUtils.cs b/Assets/Cryville/Common/StringUtils.cs new file mode 100644 index 0000000..dc8c6d4 --- /dev/null +++ b/Assets/Cryville/Common/StringUtils.cs @@ -0,0 +1,23 @@ +using System; +using System.Text; + +namespace Cryville.Common { + public static class StringUtils { + public static string TrimExt(string s) { + return s.Substring(0, s.LastIndexOf(".")); + } + public static string ToString(this TimeSpan timeSpan, int digits) { + var b = new StringBuilder(); + bool flag = false; + if (timeSpan.TotalDays >= 1) { + flag = true; + b.Append(timeSpan.Days.ToString() + ":"); + } + if (flag || timeSpan.TotalHours >= 1) + b.Append((timeSpan.Hours % 24).ToString() + ":"); + b.Append((timeSpan.Minutes % 60).ToString("00") + ":"); + b.Append((timeSpan.TotalSeconds % 60).ToString("00." + new string('0', digits))); + return b.ToString(); + } + } +} diff --git a/Assets/Cryville/Common/StringUtils.cs.meta b/Assets/Cryville/Common/StringUtils.cs.meta new file mode 100644 index 0000000..50d701f --- /dev/null +++ b/Assets/Cryville/Common/StringUtils.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 9c45da9ea5560c84b9ecfb5a1161fb77 +timeCreated: 1608801352 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/Unity.meta b/Assets/Cryville/Common/Unity.meta new file mode 100644 index 0000000..c08c05e --- /dev/null +++ b/Assets/Cryville/Common/Unity.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 2debd5a8bd19dea4f9e8b0aab176881d +folderAsset: yes +timeCreated: 1605323649 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/Unity/CallHelper.cs b/Assets/Cryville/Common/Unity/CallHelper.cs new file mode 100644 index 0000000..38b0eff --- /dev/null +++ b/Assets/Cryville/Common/Unity/CallHelper.cs @@ -0,0 +1,34 @@ +using UnityEngine; +using System; + +namespace Cryville.Common.Unity { + static class CallHelper { + public static bool HasFlag(this Enum obj, Enum flag) { + ulong num = Convert.ToUInt64(flag); + ulong num2 = Convert.ToUInt64(obj); + return (num2 & num) == num; + } + + public static void ShowException(Exception ex) { + ShowMessageBox(ex.ToString()); + } + + public static void ShowMessageBox(string message) { + GameObject.Instantiate(Resources.Load("Common/Popup")).GetComponent().Message = message; + } + + public static void Purge(Transform obj) { + foreach (Transform i in obj) + GameObject.Destroy(i.gameObject); + } + + /*public static void DownloadAndUnzip(string url, FileInfo file) { + using (DownloadDialog d = new DownloadDialog()) { + d.Download(url, file); + } + using (ZipFile z = new ZipFile(file.FullName)) { + z.ExtractAll(file.DirectoryName, ExtractExistingFileAction.OverwriteSilently); + } + }*/ + } +} diff --git a/Assets/Cryville/Common/Unity/CallHelper.cs.meta b/Assets/Cryville/Common/Unity/CallHelper.cs.meta new file mode 100644 index 0000000..9c2b67f --- /dev/null +++ b/Assets/Cryville/Common/Unity/CallHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 98b3d4b7cc1ce054598780159356da35 +timeCreated: 1608801352 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Common/Unity/FileDialog.cs b/Assets/Cryville/Common/Unity/FileDialog.cs new file mode 100644 index 0000000..c02952d --- /dev/null +++ b/Assets/Cryville/Common/Unity/FileDialog.cs @@ -0,0 +1,142 @@ +using System; +using System.IO; +using UnityEngine; +using UnityEngine.UI; + +namespace Cryville.Common.Unity { + public class FileDialog : MonoBehaviour { + Transform panel; + Transform title; + Transform drives; + Transform dirs; + Transform files; + + public Action Callback { private get; set; } + +#if UNITY_ANDROID && !UNITY_EDITOR_WIN + string androidStorage = ""; +#endif + + string fileName = ""; + public string FileName { + get { return fileName; } + } + + public string[] m_filter = new string[]{}; + public string[] Filter { + set { m_filter = value; } + } + +#pragma warning disable IDE0051 + void Start() { + panel = gameObject.transform.Find("Panel"); + title = panel.Find("Title/Text"); + drives = panel.Find("Drives/DrivesInner"); + dirs = panel.Find("Directories/DirectoriesInner"); + files = panel.Find("Files/FilesInner"); + if (CurrentDirectory == null) { +#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN + CurrentDirectory = new DirectoryInfo(Directory.GetCurrentDirectory()); +#elif UNITY_ANDROID + using (AndroidJavaClass ajc=new AndroidJavaClass("android.os.Environment")) + using (AndroidJavaObject file=ajc.CallStatic("getExternalStorageDirectory")) { + androidStorage = file.Call("getAbsolutePath"); + CurrentDirectory = new DirectoryInfo(androidStorage); + } +#else +#error No default directory +#endif + } + UpdateGUI(); + } +#pragma warning restore IDE0051 + + public void Show() { + fileName = null; + gameObject.SetActive(true); + } + + public void Close() { + if (Callback != null) Callback.Invoke(); + gameObject.SetActive(false); + } + + public DirectoryInfo CurrentDirectory; + + void OnDriveChanged(string s) { +#if UNITY_STANDALONE_WIN || UNITY_EDITOR_WIN + CurrentDirectory = new DirectoryInfo(s); +#elif UNITY_ANDROID + switch (s) { + case "?storage": + CurrentDirectory = new DirectoryInfo(androidStorage); + break; + } +#else +#error No change drive logic +#endif + UpdateGUI(); + } + + void OnDirectoryChanged(string s) { + CurrentDirectory = new DirectoryInfo(CurrentDirectory.FullName + "/" + s); + UpdateGUI(); + } + + void OnFileChanged(string s) { + fileName = s; + Close(); + } + + void UpdateGUI() { + title.GetComponent().text = CurrentDirectory.FullName; + + CallHelper.Purge(drives); +#if UNITY_STANDALONE_WIN || UNITY_EDITOR_WIN + var dl = Directory.GetLogicalDrives(); + foreach (string d in dl) { + GameObject btn = GameObject.Instantiate(Resources.Load("Common/Button")); + btn.GetComponentInChildren().text = d; + var ts = d; + btn.GetComponentInChildren