├── .gitattributes ├── .github └── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── feature_request.md │ └── refactor-request.md ├── .gitignore ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── DemoImages ├── Colors.txt ├── DarkInstaller.png ├── DarkInstaller.png.import ├── DarkModManager.png ├── DarkModManager.png.import ├── DarkSettings.png ├── DarkSettings.png.import ├── DarkTools.png ├── DarkTools.png.import ├── ItchCover.png ├── ItchCover.png.import ├── ItchCover.psd ├── LightInstaller.png ├── LightInstaller.png.import ├── LightModManager.png ├── LightModManager.png.import ├── LightSettings.png ├── LightSettings.png.import ├── LightTools.png └── LightTools.png.import ├── Fonts ├── Primary.TTF └── Primary.TTF.import ├── ImageAssets ├── Icon.svg ├── Icon.svg.import ├── IconInkscape.svg ├── IconInkscape.svg.import ├── LoadingCircleAnimation │ ├── Spinner-1.1s-800px.zip │ ├── frame-1.png │ ├── frame-1.png.import │ ├── frame-10.png │ ├── frame-10.png.import │ ├── frame-11.png │ ├── frame-11.png.import │ ├── frame-12.png │ ├── frame-12.png.import │ ├── frame-13.png │ ├── frame-13.png.import │ ├── frame-14.png │ ├── frame-14.png.import │ ├── frame-15.png │ ├── frame-15.png.import │ ├── frame-16.png │ ├── frame-16.png.import │ ├── frame-17.png │ ├── frame-17.png.import │ ├── frame-18.png │ ├── frame-18.png.import │ ├── frame-19.png │ ├── frame-19.png.import │ ├── frame-2.png │ ├── frame-2.png.import │ ├── frame-20.png │ ├── frame-20.png.import │ ├── frame-21.png │ ├── frame-21.png.import │ ├── frame-22.png │ ├── frame-22.png.import │ ├── frame-23.png │ ├── frame-23.png.import │ ├── frame-24.png │ ├── frame-24.png.import │ ├── frame-25.png │ ├── frame-25.png.import │ ├── frame-26.png │ ├── frame-26.png.import │ ├── frame-27.png │ ├── frame-27.png.import │ ├── frame-28.png │ ├── frame-28.png.import │ ├── frame-29.png │ ├── frame-29.png.import │ ├── frame-3.png │ ├── frame-3.png.import │ ├── frame-30.png │ ├── frame-30.png.import │ ├── frame-31.png │ ├── frame-31.png.import │ ├── frame-32.png │ ├── frame-32.png.import │ ├── frame-33.png │ ├── frame-33.png.import │ ├── frame-4.png │ ├── frame-4.png.import │ ├── frame-5.png │ ├── frame-5.png.import │ ├── frame-6.png │ ├── frame-6.png.import │ ├── frame-7.png │ ├── frame-7.png.import │ ├── frame-8.png │ ├── frame-8.png.import │ ├── frame-9.png │ └── frame-9.png.import ├── MuteIcon.png ├── MuteIcon.png.import ├── MuteIcon2.png ├── MuteIcon2.png.import ├── MuteIcon3.png ├── MuteIcon3.png.import ├── ShortcutIcon.png ├── ShortcutIcon.png.import ├── SplashScreen.png ├── SplashScreen.png.import ├── SplashScreen.psd ├── WarningSign.png ├── WarningSign.png.import ├── blue-check-mark-icon.svg └── blue-check-mark-icon.svg.import ├── LICENSE ├── README.md ├── Scenes ├── ErrorConsole.tscn ├── Home.tscn ├── InstallerPage.tscn ├── ModManagerPage.tscn ├── SettingsPage.tscn └── ToolsPage.tscn ├── Scripts ├── Game.cs ├── Globals.cs ├── Home.cs ├── Installer.cs ├── ModManager.cs ├── Modes │ ├── Mode.cs │ ├── Ryujinx.cs │ └── Yuzu.cs ├── ResourceSaveManager.cs ├── SettingsPage.cs ├── SettingsResource.cs ├── Sources │ ├── BananaManager.cs │ ├── Mod.cs │ ├── OfficialManager.cs │ └── TotkHoloManager.cs ├── StandardModManagement.cs ├── Tools.cs └── ToolsPage.cs ├── Themes ├── DarkTheme.tres ├── LightTheme.tres └── Styleboxes │ ├── DarkDisabled.tres │ ├── DarkErrorConsole.tres │ ├── DarkFocus.tres │ ├── DarkLoadingLoadbar.tres │ ├── DarkNormal.tres │ ├── DarkNormalLoadbar.tres │ ├── DarkPressed.tres │ ├── DarkPrimary.tres │ ├── DarkTransparent.tres │ ├── DarkVSeparator.tres │ ├── LightDisabled.tres │ ├── LightErrorConsole.tres │ ├── LightFocus.tres │ ├── LightNormal.tres │ ├── LightNormalLoadbar.tres │ ├── LightPressed.tres │ └── LightVSeparator.tres ├── YuzuEAUpdateManager.sln.DotSettings.user ├── YuzuToolbox.csproj ├── YuzuToolbox.csproj.old ├── YuzuToolbox.sln ├── YuzuToolbox.sln.DotSettings.user ├── default_bus_layout.tres ├── export_presets.cfg ├── project.godot └── test.x86_64 /.gitattributes: -------------------------------------------------------------------------------- 1 | # Normalize EOL for all files that Git considers text files. 2 | * text=auto eol=lf 3 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: "[BUG]" 5 | labels: bug 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Version [e.g. 22] 29 | 30 | **Additional context** 31 | Add any other context about the problem here. 32 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: "[FEATURE]" 5 | labels: enhancement 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/refactor-request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Refactor request 3 | about: Describe a feature / code blob which requires a rework / refactoring. 4 | title: "[REFACTOR]" 5 | labels: Refactor 6 | assignees: ZachAR3 7 | 8 | --- 9 | 10 | **Is your refactor request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. E.g instead of turning the music volume extremely low, use the mute feature of the audio bus. 15 | 16 | **Additional context** 17 | Add any other context or screenshots about the feature request here. 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Godot 4+ specific ignores 2 | .godot/ 3 | .idea/ 4 | Releases/ 5 | .vs/ 6 | .vscode/ 7 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | We as members, contributors, and leaders pledge to make participation in our 6 | community a harassment-free experience for everyone, regardless of age, body 7 | size, visible or invisible disability, ethnicity, sex characteristics, gender 8 | identity and expression, level of experience, education, socio-economic status, 9 | nationality, personal appearance, race, religion, or sexual identity 10 | and orientation. 11 | 12 | We pledge to act and interact in ways that contribute to an open, welcoming, 13 | diverse, inclusive, and healthy community. 14 | 15 | ## Our Standards 16 | 17 | Examples of behavior that contributes to a positive environment for our 18 | community include: 19 | 20 | * Demonstrating empathy and kindness toward other people 21 | * Being respectful of differing opinions, viewpoints, and experiences 22 | * Giving and gracefully accepting constructive feedback 23 | * Accepting responsibility and apologizing to those affected by our mistakes, 24 | and learning from the experience 25 | * Focusing on what is best not just for us as individuals, but for the 26 | overall community 27 | 28 | Examples of unacceptable behavior include: 29 | 30 | * The use of sexualized language or imagery, and sexual attention or 31 | advances of any kind 32 | * Trolling, insulting or derogatory comments, and personal or political attacks 33 | * Public or private harassment 34 | * Publishing others' private information, such as a physical or email 35 | address, without their explicit permission 36 | * Other conduct which could reasonably be considered inappropriate in a 37 | professional setting 38 | 39 | ## Enforcement Responsibilities 40 | 41 | Community leaders are responsible for clarifying and enforcing our standards of 42 | acceptable behavior and will take appropriate and fair corrective action in 43 | response to any behavior that they deem inappropriate, threatening, offensive, 44 | or harmful. 45 | 46 | Community leaders have the right and responsibility to remove, edit, or reject 47 | comments, commits, code, wiki edits, issues, and other contributions that are 48 | not aligned to this Code of Conduct, and will communicate reasons for moderation 49 | decisions when appropriate. 50 | 51 | ## Scope 52 | 53 | This Code of Conduct applies within all community spaces, and also applies when 54 | an individual is officially representing the community in public spaces. 55 | Examples of representing our community include using an official e-mail address, 56 | posting via an official social media account, or acting as an appointed 57 | representative at an online or offline event. 58 | 59 | ## Enforcement 60 | 61 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 62 | reported to the community leaders responsible for enforcement at 63 | Zach4R3@gmail.com. 64 | All complaints will be reviewed and investigated promptly and fairly. 65 | 66 | All community leaders are obligated to respect the privacy and security of the 67 | reporter of any incident. 68 | 69 | ## Enforcement Guidelines 70 | 71 | Community leaders will follow these Community Impact Guidelines in determining 72 | the consequences for any action they deem in violation of this Code of Conduct: 73 | 74 | ### 1. Correction 75 | 76 | **Community Impact**: Use of inappropriate language or other behavior deemed 77 | unprofessional or unwelcome in the community. 78 | 79 | **Consequence**: A private, written warning from community leaders, providing 80 | clarity around the nature of the violation and an explanation of why the 81 | behavior was inappropriate. A public apology may be requested. 82 | 83 | ### 2. Warning 84 | 85 | **Community Impact**: A violation through a single incident or series 86 | of actions. 87 | 88 | **Consequence**: A warning with consequences for continued behavior. No 89 | interaction with the people involved, including unsolicited interaction with 90 | those enforcing the Code of Conduct, for a specified period of time. This 91 | includes avoiding interactions in community spaces as well as external channels 92 | like social media. Violating these terms may lead to a temporary or 93 | permanent ban. 94 | 95 | ### 3. Temporary Ban 96 | 97 | **Community Impact**: A serious violation of community standards, including 98 | sustained inappropriate behavior. 99 | 100 | **Consequence**: A temporary ban from any sort of interaction or public 101 | communication with the community for a specified period of time. No public or 102 | private interaction with the people involved, including unsolicited interaction 103 | with those enforcing the Code of Conduct, is allowed during this period. 104 | Violating these terms may lead to a permanent ban. 105 | 106 | ### 4. Permanent Ban 107 | 108 | **Community Impact**: Demonstrating a pattern of violation of community 109 | standards, including sustained inappropriate behavior, harassment of an 110 | individual, or aggression toward or disparagement of classes of individuals. 111 | 112 | **Consequence**: A permanent ban from any sort of public interaction within 113 | the community. 114 | 115 | ## Attribution 116 | 117 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], 118 | version 2.0, available at 119 | https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. 120 | 121 | Community Impact Guidelines were inspired by [Mozilla's code of conduct 122 | enforcement ladder](https://github.com/mozilla/diversity). 123 | 124 | [homepage]: https://www.contributor-covenant.org 125 | 126 | For answers to common questions about this code of conduct, see the FAQ at 127 | https://www.contributor-covenant.org/faq. Translations are available at 128 | https://www.contributor-covenant.org/translations. 129 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | All contributors welcome! I am trying to keep this project relatively clean with how things are implemented, so if it is a hacky solution I will need to investigate other solutions before mering. 2 | -------------------------------------------------------------------------------- /DemoImages/Colors.txt: -------------------------------------------------------------------------------- 1 | Colors 2 | Accent yellow:#fdd809 3 | Primary:#212121 4 | Secondary:#363636 5 | Highlighted 6 | 7 | -------------------------------------------------------------------------------- /DemoImages/DarkInstaller.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/DemoImages/DarkInstaller.png -------------------------------------------------------------------------------- /DemoImages/DarkInstaller.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://yktcpak6y0sk" 6 | path="res://.godot/imported/DarkInstaller.png-d8a0bff22686347684ac951f75d36725.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://DemoImages/DarkInstaller.png" 14 | dest_files=["res://.godot/imported/DarkInstaller.png-d8a0bff22686347684ac951f75d36725.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /DemoImages/DarkModManager.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/DemoImages/DarkModManager.png -------------------------------------------------------------------------------- /DemoImages/DarkModManager.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://dr82l2um8mux2" 6 | path="res://.godot/imported/DarkModManager.png-f1dcf1236c3963a990467431fb11ba4c.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://DemoImages/DarkModManager.png" 14 | dest_files=["res://.godot/imported/DarkModManager.png-f1dcf1236c3963a990467431fb11ba4c.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /DemoImages/DarkSettings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/DemoImages/DarkSettings.png -------------------------------------------------------------------------------- /DemoImages/DarkSettings.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://ciulilevjh4n3" 6 | path="res://.godot/imported/DarkSettings.png-c728ed002a567b04da80746e2dd579ce.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://DemoImages/DarkSettings.png" 14 | dest_files=["res://.godot/imported/DarkSettings.png-c728ed002a567b04da80746e2dd579ce.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /DemoImages/DarkTools.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/DemoImages/DarkTools.png -------------------------------------------------------------------------------- /DemoImages/DarkTools.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://xsgwo4d7qnbt" 6 | path="res://.godot/imported/DarkTools.png-31f0d36b1e9378aa9a6bc887711e670e.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://DemoImages/DarkTools.png" 14 | dest_files=["res://.godot/imported/DarkTools.png-31f0d36b1e9378aa9a6bc887711e670e.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /DemoImages/ItchCover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/DemoImages/ItchCover.png -------------------------------------------------------------------------------- /DemoImages/ItchCover.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://c1mi2bffdxxyp" 6 | path="res://.godot/imported/ItchCover.png-debb8120323446397ae0330bbb585b58.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://DemoImages/ItchCover.png" 14 | dest_files=["res://.godot/imported/ItchCover.png-debb8120323446397ae0330bbb585b58.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /DemoImages/ItchCover.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/DemoImages/ItchCover.psd -------------------------------------------------------------------------------- /DemoImages/LightInstaller.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/DemoImages/LightInstaller.png -------------------------------------------------------------------------------- /DemoImages/LightInstaller.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://y2j6kj72fvsr" 6 | path="res://.godot/imported/LightInstaller.png-404dc29b8ad7796da465e6fdd56e7dc6.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://DemoImages/LightInstaller.png" 14 | dest_files=["res://.godot/imported/LightInstaller.png-404dc29b8ad7796da465e6fdd56e7dc6.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /DemoImages/LightModManager.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/DemoImages/LightModManager.png -------------------------------------------------------------------------------- /DemoImages/LightModManager.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://ccifk7x5lw2wc" 6 | path="res://.godot/imported/LightModManager.png-c90f301e67ff8434e5d576d4c3d958f1.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://DemoImages/LightModManager.png" 14 | dest_files=["res://.godot/imported/LightModManager.png-c90f301e67ff8434e5d576d4c3d958f1.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /DemoImages/LightSettings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/DemoImages/LightSettings.png -------------------------------------------------------------------------------- /DemoImages/LightSettings.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://5pjo64mlh3l6" 6 | path="res://.godot/imported/LightSettings.png-abacd855559b38982f38197fe897d069.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://DemoImages/LightSettings.png" 14 | dest_files=["res://.godot/imported/LightSettings.png-abacd855559b38982f38197fe897d069.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /DemoImages/LightTools.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/DemoImages/LightTools.png -------------------------------------------------------------------------------- /DemoImages/LightTools.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://kbpi0vstpd4j" 6 | path="res://.godot/imported/LightTools.png-ed42e2486b5d0067e85d41e97b0af0f6.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://DemoImages/LightTools.png" 14 | dest_files=["res://.godot/imported/LightTools.png-ed42e2486b5d0067e85d41e97b0af0f6.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /Fonts/Primary.TTF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/Fonts/Primary.TTF -------------------------------------------------------------------------------- /Fonts/Primary.TTF.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="font_data_dynamic" 4 | type="FontFile" 5 | uid="uid://bs747wsxnk330" 6 | path="res://.godot/imported/Primary.TTF-7f93cd7f03560399ad4c35b5b54f4690.fontdata" 7 | 8 | [deps] 9 | 10 | source_file="res://Fonts/Primary.TTF" 11 | dest_files=["res://.godot/imported/Primary.TTF-7f93cd7f03560399ad4c35b5b54f4690.fontdata"] 12 | 13 | [params] 14 | 15 | Rendering=null 16 | antialiasing=1 17 | generate_mipmaps=false 18 | multichannel_signed_distance_field=false 19 | msdf_pixel_range=8 20 | msdf_size=48 21 | allow_system_fallback=true 22 | force_autohinter=false 23 | hinting=1 24 | subpixel_positioning=1 25 | oversampling=0.0 26 | Fallbacks=null 27 | fallbacks=[] 28 | Compress=null 29 | compress=true 30 | preload=[] 31 | language_support={} 32 | script_support={} 33 | opentype_features={} 34 | -------------------------------------------------------------------------------- /ImageAssets/Icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 12 | 14 | 17 | 21 | 25 | 32 | 36 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /ImageAssets/Icon.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://d0oddknmnkwg" 6 | path="res://.godot/imported/Icon.svg-cf8b5a5f25ed45e8c1233b9303b57d06.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/Icon.svg" 14 | dest_files=["res://.godot/imported/Icon.svg-cf8b5a5f25ed45e8c1233b9303b57d06.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /ImageAssets/IconInkscape.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | 40 | 45 | 46 | 48 | 52 | 56 | 60 | 67 | 71 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /ImageAssets/IconInkscape.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://b8why363k6kq" 6 | path="res://.godot/imported/IconInkscape.svg-a179da449e45c66462f9efd49ba6f7d7.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/IconInkscape.svg" 14 | dest_files=["res://.godot/imported/IconInkscape.svg-a179da449e45c66462f9efd49ba6f7d7.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/Spinner-1.1s-800px.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/LoadingCircleAnimation/Spinner-1.1s-800px.zip -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/LoadingCircleAnimation/frame-1.png -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-1.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://6v2ifgmyp6yp" 6 | path="res://.godot/imported/frame-1.png-848b698e59dd6f627663294944e15a56.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/LoadingCircleAnimation/frame-1.png" 14 | dest_files=["res://.godot/imported/frame-1.png-848b698e59dd6f627663294944e15a56.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/LoadingCircleAnimation/frame-10.png -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-10.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://dpkeio6v2yu0k" 6 | path="res://.godot/imported/frame-10.png-719c91863e8fd1e1e6c55b2268f140a1.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/LoadingCircleAnimation/frame-10.png" 14 | dest_files=["res://.godot/imported/frame-10.png-719c91863e8fd1e1e6c55b2268f140a1.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/LoadingCircleAnimation/frame-11.png -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-11.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://bnvtq2no1j8ru" 6 | path="res://.godot/imported/frame-11.png-538e37bd1465ed0afbf12d5e81140591.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/LoadingCircleAnimation/frame-11.png" 14 | dest_files=["res://.godot/imported/frame-11.png-538e37bd1465ed0afbf12d5e81140591.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/LoadingCircleAnimation/frame-12.png -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-12.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://2sw5afdhbno7" 6 | path="res://.godot/imported/frame-12.png-876203253a1f5e916185dcfd11b65603.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/LoadingCircleAnimation/frame-12.png" 14 | dest_files=["res://.godot/imported/frame-12.png-876203253a1f5e916185dcfd11b65603.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/LoadingCircleAnimation/frame-13.png -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-13.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://c4dmpw3d24sw3" 6 | path="res://.godot/imported/frame-13.png-6b72dfc0411f07d75ac508c2dd2dc4fa.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/LoadingCircleAnimation/frame-13.png" 14 | dest_files=["res://.godot/imported/frame-13.png-6b72dfc0411f07d75ac508c2dd2dc4fa.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/LoadingCircleAnimation/frame-14.png -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-14.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://csomaqbrp7pm1" 6 | path="res://.godot/imported/frame-14.png-f7bb1049000fc6ad9c4f09e3f68ee5ee.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/LoadingCircleAnimation/frame-14.png" 14 | dest_files=["res://.godot/imported/frame-14.png-f7bb1049000fc6ad9c4f09e3f68ee5ee.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/LoadingCircleAnimation/frame-15.png -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-15.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://5nxa4amx1ctg" 6 | path="res://.godot/imported/frame-15.png-f1274492d969b9371cb0aa3b9d712169.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/LoadingCircleAnimation/frame-15.png" 14 | dest_files=["res://.godot/imported/frame-15.png-f1274492d969b9371cb0aa3b9d712169.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/LoadingCircleAnimation/frame-16.png -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-16.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://buj451wqmieg2" 6 | path="res://.godot/imported/frame-16.png-d653f437b702f22c30ece0327ca773fd.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/LoadingCircleAnimation/frame-16.png" 14 | dest_files=["res://.godot/imported/frame-16.png-d653f437b702f22c30ece0327ca773fd.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/LoadingCircleAnimation/frame-17.png -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-17.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://vl1mcomcokw0" 6 | path="res://.godot/imported/frame-17.png-e81786bcf16ffbb646a43262195bfc22.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/LoadingCircleAnimation/frame-17.png" 14 | dest_files=["res://.godot/imported/frame-17.png-e81786bcf16ffbb646a43262195bfc22.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/LoadingCircleAnimation/frame-18.png -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-18.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://66wajqj8hf02" 6 | path="res://.godot/imported/frame-18.png-249429dae2f690b2e86af173f774038b.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/LoadingCircleAnimation/frame-18.png" 14 | dest_files=["res://.godot/imported/frame-18.png-249429dae2f690b2e86af173f774038b.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/LoadingCircleAnimation/frame-19.png -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-19.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://b3ee0h7icrrm" 6 | path="res://.godot/imported/frame-19.png-c8cac228112f156557bb2a60e63a5223.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/LoadingCircleAnimation/frame-19.png" 14 | dest_files=["res://.godot/imported/frame-19.png-c8cac228112f156557bb2a60e63a5223.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/LoadingCircleAnimation/frame-2.png -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-2.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://5thiqdc0a2hi" 6 | path="res://.godot/imported/frame-2.png-1e3bda1c3e96884837550be404c3d613.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/LoadingCircleAnimation/frame-2.png" 14 | dest_files=["res://.godot/imported/frame-2.png-1e3bda1c3e96884837550be404c3d613.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/LoadingCircleAnimation/frame-20.png -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-20.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://dj618to1c1bjp" 6 | path="res://.godot/imported/frame-20.png-d7e8264c676c56080e43ea29314f75b7.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/LoadingCircleAnimation/frame-20.png" 14 | dest_files=["res://.godot/imported/frame-20.png-d7e8264c676c56080e43ea29314f75b7.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/LoadingCircleAnimation/frame-21.png -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-21.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://bsmue6kwurrr6" 6 | path="res://.godot/imported/frame-21.png-f857d32d00265a8e04efbf8842b19b76.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/LoadingCircleAnimation/frame-21.png" 14 | dest_files=["res://.godot/imported/frame-21.png-f857d32d00265a8e04efbf8842b19b76.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/LoadingCircleAnimation/frame-22.png -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-22.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://curutnnl7a2cg" 6 | path="res://.godot/imported/frame-22.png-fa565c6a7cfdb9423d4730b0e3e43569.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/LoadingCircleAnimation/frame-22.png" 14 | dest_files=["res://.godot/imported/frame-22.png-fa565c6a7cfdb9423d4730b0e3e43569.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/LoadingCircleAnimation/frame-23.png -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-23.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://clyp8kt2bw73i" 6 | path="res://.godot/imported/frame-23.png-bdfcd695c15a4139ad0f022bb1b5e30a.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/LoadingCircleAnimation/frame-23.png" 14 | dest_files=["res://.godot/imported/frame-23.png-bdfcd695c15a4139ad0f022bb1b5e30a.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/LoadingCircleAnimation/frame-24.png -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-24.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://bjwofdiel6fxb" 6 | path="res://.godot/imported/frame-24.png-5c7b5db369c0de4aa2b803dc69177dcd.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/LoadingCircleAnimation/frame-24.png" 14 | dest_files=["res://.godot/imported/frame-24.png-5c7b5db369c0de4aa2b803dc69177dcd.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/LoadingCircleAnimation/frame-25.png -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-25.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://c7ub38jlgb0yd" 6 | path="res://.godot/imported/frame-25.png-7a0b7791d636a3c3d2b04e29db86d04b.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/LoadingCircleAnimation/frame-25.png" 14 | dest_files=["res://.godot/imported/frame-25.png-7a0b7791d636a3c3d2b04e29db86d04b.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/LoadingCircleAnimation/frame-26.png -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-26.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://cu62qg7q7884c" 6 | path="res://.godot/imported/frame-26.png-312fc2e8c8a63c685943951e614b5d53.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/LoadingCircleAnimation/frame-26.png" 14 | dest_files=["res://.godot/imported/frame-26.png-312fc2e8c8a63c685943951e614b5d53.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/LoadingCircleAnimation/frame-27.png -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-27.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://cynapsche3thd" 6 | path="res://.godot/imported/frame-27.png-0523b379c16edc8c901b85c86f3ea77d.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/LoadingCircleAnimation/frame-27.png" 14 | dest_files=["res://.godot/imported/frame-27.png-0523b379c16edc8c901b85c86f3ea77d.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/LoadingCircleAnimation/frame-28.png -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-28.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://cgvdx2iyuq0fy" 6 | path="res://.godot/imported/frame-28.png-5467f49743b9698f8f0c85c71a78493a.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/LoadingCircleAnimation/frame-28.png" 14 | dest_files=["res://.godot/imported/frame-28.png-5467f49743b9698f8f0c85c71a78493a.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/LoadingCircleAnimation/frame-29.png -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-29.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://bh8ii4gn2cjdt" 6 | path="res://.godot/imported/frame-29.png-faff7e4e4e9032746798fda52dfc67f1.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/LoadingCircleAnimation/frame-29.png" 14 | dest_files=["res://.godot/imported/frame-29.png-faff7e4e4e9032746798fda52dfc67f1.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/LoadingCircleAnimation/frame-3.png -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-3.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://by13358t2kich" 6 | path="res://.godot/imported/frame-3.png-eb26efba0a9a76af09fdbed017a7c585.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/LoadingCircleAnimation/frame-3.png" 14 | dest_files=["res://.godot/imported/frame-3.png-eb26efba0a9a76af09fdbed017a7c585.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/LoadingCircleAnimation/frame-30.png -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-30.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://bcadb74q5qh20" 6 | path="res://.godot/imported/frame-30.png-12048f1ebdfd6765711156771351951a.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/LoadingCircleAnimation/frame-30.png" 14 | dest_files=["res://.godot/imported/frame-30.png-12048f1ebdfd6765711156771351951a.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/LoadingCircleAnimation/frame-31.png -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-31.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://lxh2fqgq76w6" 6 | path="res://.godot/imported/frame-31.png-70c6d787569394bc700ce836beb8dce2.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/LoadingCircleAnimation/frame-31.png" 14 | dest_files=["res://.godot/imported/frame-31.png-70c6d787569394bc700ce836beb8dce2.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/LoadingCircleAnimation/frame-32.png -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-32.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://coa1tpiuy4cbs" 6 | path="res://.godot/imported/frame-32.png-2cfbfc5b6f93aedecf0421e2cea26142.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/LoadingCircleAnimation/frame-32.png" 14 | dest_files=["res://.godot/imported/frame-32.png-2cfbfc5b6f93aedecf0421e2cea26142.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/LoadingCircleAnimation/frame-33.png -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-33.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://clkgpge7ql6qp" 6 | path="res://.godot/imported/frame-33.png-57140b6b9be699ef3cf0b57f3dad2eb1.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/LoadingCircleAnimation/frame-33.png" 14 | dest_files=["res://.godot/imported/frame-33.png-57140b6b9be699ef3cf0b57f3dad2eb1.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/LoadingCircleAnimation/frame-4.png -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-4.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://d4mxpw35xmlax" 6 | path="res://.godot/imported/frame-4.png-831cfa8c7a12e91f8fa0faa34a31a0ab.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/LoadingCircleAnimation/frame-4.png" 14 | dest_files=["res://.godot/imported/frame-4.png-831cfa8c7a12e91f8fa0faa34a31a0ab.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/LoadingCircleAnimation/frame-5.png -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-5.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://wnpgyjmnnoet" 6 | path="res://.godot/imported/frame-5.png-8a0da7d204753e0094683a05cdf7c81b.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/LoadingCircleAnimation/frame-5.png" 14 | dest_files=["res://.godot/imported/frame-5.png-8a0da7d204753e0094683a05cdf7c81b.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/LoadingCircleAnimation/frame-6.png -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-6.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://df5vjnet6id83" 6 | path="res://.godot/imported/frame-6.png-8f2365fd87ba6113c878815dd7ebec24.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/LoadingCircleAnimation/frame-6.png" 14 | dest_files=["res://.godot/imported/frame-6.png-8f2365fd87ba6113c878815dd7ebec24.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/LoadingCircleAnimation/frame-7.png -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-7.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://5o3fvcmp1pvu" 6 | path="res://.godot/imported/frame-7.png-975e823e6b09c435ef613c6295f7235d.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/LoadingCircleAnimation/frame-7.png" 14 | dest_files=["res://.godot/imported/frame-7.png-975e823e6b09c435ef613c6295f7235d.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/LoadingCircleAnimation/frame-8.png -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-8.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://csinyp5jrblvw" 6 | path="res://.godot/imported/frame-8.png-315805b22621aed5f5786dbae4bfb48d.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/LoadingCircleAnimation/frame-8.png" 14 | dest_files=["res://.godot/imported/frame-8.png-315805b22621aed5f5786dbae4bfb48d.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/LoadingCircleAnimation/frame-9.png -------------------------------------------------------------------------------- /ImageAssets/LoadingCircleAnimation/frame-9.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://ij445okwlco6" 6 | path="res://.godot/imported/frame-9.png-725d1c90550bb0d7c30b22071d467a45.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/LoadingCircleAnimation/frame-9.png" 14 | dest_files=["res://.godot/imported/frame-9.png-725d1c90550bb0d7c30b22071d467a45.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /ImageAssets/MuteIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/MuteIcon.png -------------------------------------------------------------------------------- /ImageAssets/MuteIcon.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://b0kf5857cy6bw" 6 | path="res://.godot/imported/MuteIcon.png-fd4235456abbd38d1204794785b89adb.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/MuteIcon.png" 14 | dest_files=["res://.godot/imported/MuteIcon.png-fd4235456abbd38d1204794785b89adb.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /ImageAssets/MuteIcon2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/MuteIcon2.png -------------------------------------------------------------------------------- /ImageAssets/MuteIcon2.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://ddg5xyg231r68" 6 | path="res://.godot/imported/MuteIcon2.png-7fd43517dfa74e36956b34d7a86870f9.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/MuteIcon2.png" 14 | dest_files=["res://.godot/imported/MuteIcon2.png-7fd43517dfa74e36956b34d7a86870f9.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /ImageAssets/MuteIcon3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/MuteIcon3.png -------------------------------------------------------------------------------- /ImageAssets/MuteIcon3.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://dpvdbfye5e4hn" 6 | path="res://.godot/imported/MuteIcon3.png-5fd8812a6eff9e2a78b14b50c682ff95.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/MuteIcon3.png" 14 | dest_files=["res://.godot/imported/MuteIcon3.png-5fd8812a6eff9e2a78b14b50c682ff95.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /ImageAssets/ShortcutIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/ShortcutIcon.png -------------------------------------------------------------------------------- /ImageAssets/ShortcutIcon.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="image" 4 | type="Image" 5 | uid="uid://bvmy5gufcs58i" 6 | path="res://.godot/imported/ShortcutIcon.png-b941d0429959c516a54b10f1a2e89095.image" 7 | 8 | [deps] 9 | 10 | source_file="res://ImageAssets/ShortcutIcon.png" 11 | dest_files=["res://.godot/imported/ShortcutIcon.png-b941d0429959c516a54b10f1a2e89095.image"] 12 | 13 | [params] 14 | 15 | -------------------------------------------------------------------------------- /ImageAssets/SplashScreen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/SplashScreen.png -------------------------------------------------------------------------------- /ImageAssets/SplashScreen.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://bfkovjshr16bw" 6 | path="res://.godot/imported/SplashScreen.png-4e37add3e97fded89a07c32aa0967802.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/SplashScreen.png" 14 | dest_files=["res://.godot/imported/SplashScreen.png-4e37add3e97fded89a07c32aa0967802.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /ImageAssets/SplashScreen.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/SplashScreen.psd -------------------------------------------------------------------------------- /ImageAssets/WarningSign.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZachAR3/YuzuToolbox/4ef7041cbad147d4f5baa2623388c801b5a9a27b/ImageAssets/WarningSign.png -------------------------------------------------------------------------------- /ImageAssets/WarningSign.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://e5vtrghoacs2" 6 | path="res://.godot/imported/WarningSign.png-6d4d13e1fc6ae8d23777ffc9462b286a.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/WarningSign.png" 14 | dest_files=["res://.godot/imported/WarningSign.png-6d4d13e1fc6ae8d23777ffc9462b286a.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /ImageAssets/blue-check-mark-icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ImageAssets/blue-check-mark-icon.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://duqgfmchd1v45" 6 | path="res://.godot/imported/blue-check-mark-icon.svg-e29ae528e502db6fee271e861f573b38.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://ImageAssets/blue-check-mark-icon.svg" 14 | dest_files=["res://.godot/imported/blue-check-mark-icon.svg-e29ae528e502db6fee271e861f573b38.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Notice 2 | This project is currently dead as the code base is a mess and I don't have time to rewrite everything right now. Furthermore Ryujinx and Yuzu were both DMCA'd so downloads would have to be from forks which dissapear alot. I may come back in the future and gut the project but for the time being all active development has been halted. 3 | 4 | # YuzuToolbox 5 | A simple tool to download and update early access builds of yuzu from the [PineappleEA](https://github.com/pineappleEA/pineapple-src "PineappleEA") Github repo. This tool is currently supports 6 | * Cross platform (Windows and Linux) 7 | * updating with overwrites of previous versions 8 | * Simple management tools such as clearing shader caches / install directory 9 | * Shortcut creation and automatic unpacking 10 | * Basic backup tool (allows save directory to be duplicated into another directory and then restored when desired) 11 | * Mod management (downloading, installing and updating mods from a variety of sources; + ability to uninstall and detect manually installed mods) 12 | 13 | # Donate 14 | [![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/R5R4NFO8V) 15 | 16 | # Installing 17 | The recommended method of install is through Itch.io as it provoides updating features and easier launching: https://zachar3.itch.io/yuzutoolbox 18 | However, if one would still like to install it without Itch one can simply go to [releases page](https://github.com/ZachAR3/YuzuToolbox/releases) and download the zip file for your os and then extract it into its own folder. 19 | 20 | # Usage 21 | Simply launch the program and set your install location, then click download and wait for it to finish. Optionally, you can launch the program with --launcher after initially installing Yuzu to automatically check for updates (update if available) and then launch Yuzu closing itself, The recommended method of using this feature is to enable "Auto Updates" with "Create Shortcut" upon installation so the created shortcut leads back to the launcher with this flag. 22 | 23 | (WARNING:Most banana mods are meant for the nintendo switch and NOT Yuzu, meaning they will not work if installed. Please do not make issues regarding this) 24 | 25 | 26 | ![](https://github.com/ZachAR3/YuzuToolbox/blob/main/DemoImages/DarkInstaller.png?raw=true) 27 | ![](https://github.com/ZachAR3/YuzuToolbox/blob/main/DemoImages/DarkTools.png?raw=true) 28 | ![](https://github.com/ZachAR3/YuzuToolbox/blob/main/DemoImages/DarkModManager.png?raw=true) 29 | ![](https://github.com/ZachAR3/YuzuToolbox/blob/main/DemoImages/DarkSettings.png?raw=true) 30 | ![](https://github.com/ZachAR3/YuzuToolbox/blob/main/DemoImages/LightInstaller.png?raw=true) 31 | ![](https://github.com/ZachAR3/YuzuToolbox/blob/main/DemoImages/LightTools.png?raw=true) 32 | ![](https://github.com/ZachAR3/YuzuToolbox/blob/main/DemoImages/LightModManager.png?raw=true) 33 | ![](https://github.com/ZachAR3/YuzuToolbox/blob/main/DemoImages/LightSettings.png?raw=true) 34 | 35 | 36 | # Resources: 37 | Big thanks to the repo owners of: 38 | * https://github.com/pilout/YuzuUpdater/blob/master/YuzuEAUpdater/ 39 | * https://github.com/amakvana/YuzuModDownloader/blob/main/source/YuzuModDownloader/classes/OfficialYuzuModDownloader.cs 40 | 41 | I was able to use a lot of their code for the mod managing, sections which I found difficult (Especially figuring out the XPaths). 42 | 43 | -------------------------------------------------------------------------------- /Scenes/ErrorConsole.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene format=3 uid="uid://b52pqn56qpbg2"] 2 | 3 | [node name="ErrorConsole" type="Control"] 4 | layout_mode = 3 5 | anchors_preset = 15 6 | anchor_right = 1.0 7 | anchor_bottom = 1.0 8 | grow_horizontal = 2 9 | grow_vertical = 2 10 | 11 | [node name="ErrorConsole" type="TextEdit" parent="."] 12 | layout_mode = 1 13 | anchors_preset = -1 14 | anchor_left = 0.01 15 | anchor_right = 0.99 16 | anchor_bottom = 0.680556 17 | grow_horizontal = 2 18 | grow_vertical = 2 19 | editable = false 20 | wrap_mode = 1 21 | draw_control_chars = true 22 | draw_tabs = true 23 | metadata/_edit_use_anchors_ = true 24 | 25 | [node name="CloseButton" type="Button" parent="ErrorConsole"] 26 | layout_mode = 1 27 | anchors_preset = 3 28 | anchor_left = 1.0 29 | anchor_top = 1.0 30 | anchor_right = 1.0 31 | anchor_bottom = 1.0 32 | offset_left = -8.0 33 | offset_top = -8.0 34 | grow_horizontal = 0 35 | grow_vertical = 0 36 | text = "Close" 37 | 38 | [node name="ConsoleHeader" type="RichTextLabel" parent="."] 39 | layout_mode = 1 40 | anchors_preset = -1 41 | anchor_right = 1.00021 42 | anchor_bottom = 0.0686767 43 | grow_horizontal = 2 44 | bbcode_enabled = true 45 | text = "[center][b]Error console[/b][/center]" 46 | fit_content = true 47 | metadata/_edit_use_anchors_ = true 48 | -------------------------------------------------------------------------------- /Scenes/Home.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=20 format=3 uid="uid://c7wdbnvnydnxk"] 2 | 3 | [ext_resource type="Theme" uid="uid://cnnid0n04kfr7" path="res://Themes/DarkTheme.tres" id="1_c22a4"] 4 | [ext_resource type="Script" path="res://Scripts/Home.cs" id="1_p51ic"] 5 | [ext_resource type="Theme" uid="uid://dky537toysr34" path="res://Themes/LightTheme.tres" id="3_a1ctt"] 6 | [ext_resource type="StyleBox" uid="uid://tcrn2c2voh4i" path="res://Themes/Styleboxes/DarkVSeparator.tres" id="5_qxukt"] 7 | [ext_resource type="StyleBox" uid="uid://ct4a4b2lcwimn" path="res://Themes/Styleboxes/LightVSeparator.tres" id="7_iauax"] 8 | [ext_resource type="FontFile" uid="uid://bs747wsxnk330" path="res://Fonts/Primary.TTF" id="7_jk62c"] 9 | [ext_resource type="Texture2D" uid="uid://d0oddknmnkwg" path="res://ImageAssets/Icon.svg" id="7_l0a5h"] 10 | [ext_resource type="PackedScene" uid="uid://cr3wosequvma8" path="res://Scenes/InstallerPage.tscn" id="10_7mm46"] 11 | [ext_resource type="PackedScene" uid="uid://cwwmo68jd12gd" path="res://Scenes/ToolsPage.tscn" id="11_27f86"] 12 | [ext_resource type="PackedScene" uid="uid://deatvphh34eq0" path="res://Scenes/SettingsPage.tscn" id="12_3ds3g"] 13 | [ext_resource type="PackedScene" uid="uid://bdihe2bmwmgtp" path="res://Scenes/ModManagerPage.tscn" id="12_3uycp"] 14 | [ext_resource type="Script" path="res://Scripts/Tools.cs" id="13_s0bjf"] 15 | [ext_resource type="PackedScene" uid="uid://b52pqn56qpbg2" path="res://Scenes/ErrorConsole.tscn" id="14_1b731"] 16 | [ext_resource type="Script" path="res://Scripts/Globals.cs" id="15_p1cux"] 17 | 18 | [sub_resource type="Gradient" id="Gradient_awkjf"] 19 | interpolation_mode = 2 20 | offsets = PackedFloat32Array(0, 0.458333, 1) 21 | colors = PackedColorArray(0.254902, 0.270588, 0.282353, 1, 0.254902, 0.270588, 0.282353, 1, 0.254902, 0.270588, 0.282353, 1) 22 | 23 | [sub_resource type="GradientTexture1D" id="GradientTexture1D_jfc3p"] 24 | gradient = SubResource("Gradient_awkjf") 25 | 26 | [sub_resource type="Gradient" id="Gradient_an2lc"] 27 | interpolation_mode = 2 28 | offsets = PackedFloat32Array(0, 0.274775, 0.72973, 1) 29 | colors = PackedColorArray(0.870588, 0.870588, 0.870588, 1, 0.788235, 0.788235, 0.788235, 1, 0.788235, 0.788235, 0.788235, 1, 0.870588, 0.870588, 0.870588, 1) 30 | 31 | [sub_resource type="GradientTexture1D" id="GradientTexture1D_le02a"] 32 | gradient = SubResource("Gradient_an2lc") 33 | 34 | [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_tufja"] 35 | bg_color = Color(0.6, 0.6, 0.6, 0) 36 | border_width_left = 3 37 | border_width_top = 3 38 | border_width_right = 3 39 | border_width_bottom = 3 40 | border_color = Color(0.8, 0.8, 0.8, 0) 41 | 42 | [node name="Home" type="Control" node_paths=PackedStringArray("_darkBg", "_lightBg", "_downloadWindowApp", "_enableLightTheme", "_header", "_headerLabel", "_latestVersionLabel", "_errorConsole", "_modList", "_modMangerLoadingSprite", "_modManagerLoadingLabel") groups=["Initiate"]] 43 | layout_mode = 3 44 | anchors_preset = 15 45 | anchor_right = 1.0 46 | anchor_bottom = 1.0 47 | grow_horizontal = 2 48 | grow_vertical = 2 49 | size_flags_horizontal = 4 50 | size_flags_vertical = 4 51 | theme = ExtResource("1_c22a4") 52 | script = ExtResource("1_p51ic") 53 | _appVersion = 3.5 54 | _appModes = { 55 | 0: "Yuzu", 56 | 1: "Ryujinx" 57 | } 58 | _darkBg = NodePath("DarkBG") 59 | _lightBg = NodePath("LightBG") 60 | _downloadWindowApp = NodePath("Pages/Installer/DownloadWindow/Window") 61 | _enableLightTheme = NodePath("Header/Option/LightMode") 62 | _themes = Array[Theme]([ExtResource("1_c22a4"), ExtResource("3_a1ctt")]) 63 | _themesSeparator = Array[StyleBoxLine]([ExtResource("5_qxukt"), ExtResource("7_iauax")]) 64 | _header = NodePath("Header") 65 | _headerLabel = NodePath("Header/HeaderLabels/HeaderLabel") 66 | _latestVersionLabel = NodePath("Header/HeaderLabels/LastestVersion") 67 | _errorConsole = NodePath("ErrorConsole") 68 | _modList = NodePath("Pages/ModManager/ModsList") 69 | _modMangerLoadingSprite = NodePath("Pages/ModManager/LoadingWindow/LoadingBarControl/LoadingBarSprite") 70 | _modManagerLoadingLabel = NodePath("Pages/ModManager/LoadingWindow/LoadingBarControl/LoadingLabelBox") 71 | metadata/_edit_use_anchors_ = true 72 | 73 | [node name="DarkBG" type="TextureRect" parent="."] 74 | layout_mode = 1 75 | anchors_preset = 15 76 | anchor_right = 1.0 77 | anchor_bottom = 1.0 78 | grow_horizontal = 2 79 | grow_vertical = 2 80 | texture = SubResource("GradientTexture1D_jfc3p") 81 | 82 | [node name="LightBG" type="TextureRect" parent="."] 83 | visible = false 84 | layout_mode = 1 85 | anchors_preset = 15 86 | anchor_right = 1.0 87 | anchor_bottom = 1.0 88 | grow_horizontal = 2 89 | grow_vertical = 2 90 | texture = SubResource("GradientTexture1D_le02a") 91 | metadata/_edit_use_anchors_ = true 92 | 93 | [node name="Header" type="ColorRect" parent="."] 94 | layout_mode = 1 95 | anchors_preset = -1 96 | anchor_right = 1.0 97 | anchor_bottom = 0.111111 98 | grow_horizontal = 2 99 | grow_vertical = 2 100 | color = Color(0.168627, 0.180392, 0.188235, 1) 101 | 102 | [node name="Icon" type="TextureRect" parent="Header"] 103 | layout_mode = 1 104 | anchors_preset = -1 105 | anchor_left = 0.003125 106 | anchor_top = 0.266667 107 | anchor_right = 0.0208334 108 | anchor_bottom = 0.633334 109 | grow_vertical = 2 110 | texture = ExtResource("7_l0a5h") 111 | expand_mode = 1 112 | metadata/_edit_use_anchors_ = true 113 | 114 | [node name="HeaderLabels" type="HBoxContainer" parent="Header"] 115 | layout_mode = 1 116 | anchors_preset = 4 117 | anchor_top = 0.5 118 | anchor_bottom = 0.5 119 | offset_left = 55.0 120 | offset_top = -30.9999 121 | offset_right = 618.0 122 | offset_bottom = 22.0001 123 | grow_vertical = 2 124 | theme_override_constants/separation = 20 125 | metadata/_edit_group_ = true 126 | 127 | [node name="HeaderLabel" type="Label" parent="Header/HeaderLabels"] 128 | layout_mode = 2 129 | theme_override_font_sizes/font_size = 49 130 | text = "YuzuToolbox" 131 | vertical_alignment = 3 132 | 133 | [node name="VSeparator" type="VSeparator" parent="Header/HeaderLabels"] 134 | layout_mode = 2 135 | 136 | [node name="LastestVersion" type="Label" parent="Header/HeaderLabels"] 137 | layout_mode = 2 138 | theme_override_fonts/font = ExtResource("7_jk62c") 139 | theme_override_font_sizes/font_size = 32 140 | text = "Latest: 0000" 141 | vertical_alignment = 1 142 | 143 | [node name="Option" type="HBoxContainer" parent="Header"] 144 | layout_mode = 1 145 | anchors_preset = -1 146 | anchor_left = 0.715625 147 | anchor_top = 0.325 148 | anchor_right = 0.989062 149 | anchor_bottom = 0.675001 150 | grow_horizontal = 0 151 | grow_vertical = 2 152 | theme_override_constants/separation = 29 153 | alignment = 1 154 | metadata/_edit_use_anchors_ = true 155 | 156 | [node name="OptionButton" type="OptionButton" parent="Header/Option"] 157 | layout_mode = 2 158 | item_count = 2 159 | selected = 1 160 | popup/item_0/text = "Yuzu" 161 | popup/item_0/id = 0 162 | popup/item_1/text = "Ryujinx" 163 | popup/item_1/id = 1 164 | 165 | [node name="LightMode" type="CheckButton" parent="Header/Option"] 166 | layout_mode = 2 167 | focus_mode = 0 168 | theme_override_styles/normal = SubResource("StyleBoxFlat_tufja") 169 | theme_override_styles/pressed = SubResource("StyleBoxFlat_tufja") 170 | theme_override_styles/hover_pressed = SubResource("StyleBoxFlat_tufja") 171 | text = "Light Mode" 172 | 173 | [node name="QuitButton" type="Button" parent="Header/Option"] 174 | layout_mode = 2 175 | text = "Quit" 176 | 177 | [node name="OpenConsole" type="Button" parent="Header"] 178 | layout_mode = 1 179 | anchors_preset = -1 180 | anchor_left = 0.460938 181 | anchor_right = 0.539063 182 | anchor_bottom = 0.35 183 | grow_horizontal = 2 184 | text = "Console" 185 | metadata/_edit_use_anchors_ = true 186 | 187 | [node name="Pages" type="TabContainer" parent="."] 188 | layout_mode = 1 189 | anchors_preset = -1 190 | anchor_top = 0.0731481 191 | anchor_right = 1.0 192 | anchor_bottom = 1.0 193 | grow_horizontal = 2 194 | grow_vertical = 2 195 | tab_alignment = 1 196 | metadata/_edit_use_anchors_ = true 197 | 198 | [node name="Installer" parent="Pages" node_paths=PackedStringArray("_latestVersionLabel", "_customVersionLineEdit") instance=ExtResource("10_7mm46")] 199 | layout_mode = 2 200 | _latestVersionLabel = NodePath("../../Header/HeaderLabels/LastestVersion") 201 | _customVersionLineEdit = NodePath("ControlsContainer/CustomVersion/CustomVersionLineEdit") 202 | 203 | [node name="Tools" parent="Pages" instance=ExtResource("11_27f86")] 204 | visible = false 205 | layout_mode = 2 206 | 207 | [node name="ModManager" parent="Pages" instance=ExtResource("12_3uycp")] 208 | visible = false 209 | layout_mode = 2 210 | 211 | [node name="Settings" parent="Pages" node_paths=PackedStringArray("_modManager") instance=ExtResource("12_3ds3g")] 212 | visible = false 213 | layout_mode = 2 214 | _modManager = NodePath("../ModManager") 215 | 216 | [node name="ConfirmPopup" type="PopupMenu" parent="."] 217 | title = "Are you sure you?" 218 | initial_position = 1 219 | size = Vector2i(600, 100) 220 | borderless = false 221 | always_on_top = true 222 | item_count = 2 223 | item_0/text = "Confirm" 224 | item_0/id = 0 225 | item_1/text = "Cancel" 226 | item_1/id = 1 227 | 228 | [node name="ErrorConsole" parent="." instance=ExtResource("14_1b731")] 229 | visible = false 230 | layout_mode = 1 231 | 232 | [node name="ErrorNotifier" type="RichTextLabel" parent="."] 233 | visible = false 234 | layout_mode = 1 235 | anchors_preset = -1 236 | anchor_left = 0.589583 237 | anchor_top = 0.960185 238 | anchor_right = 1.0 239 | anchor_bottom = 1.0 240 | grow_horizontal = 2 241 | grow_vertical = 0 242 | bbcode_enabled = true 243 | text = "[color=#ff0000]Error encountered, press TAB for more info" 244 | metadata/_edit_use_anchors_ = true 245 | 246 | [node name="Tools" type="Node" parent="." node_paths=PackedStringArray("_errorConsoleContainer", "_errorConsole", "_errorNotifier", "_confirmationPopup")] 247 | script = ExtResource("13_s0bjf") 248 | _errorConsoleContainer = NodePath("../ErrorConsole") 249 | _errorConsole = NodePath("../ErrorConsole/ErrorConsole") 250 | _errorNotifier = NodePath("../ErrorNotifier") 251 | _confirmationPopup = NodePath("../ConfirmPopup") 252 | 253 | [node name="Globals" type="Node" parent="."] 254 | script = ExtResource("15_p1cux") 255 | 256 | [node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."] 257 | 258 | [connection signal="item_selected" from="Header/Option/OptionButton" to="." method="ModeChanged"] 259 | [connection signal="toggled" from="Header/Option/LightMode" to="." method="SetTheme"] 260 | [connection signal="pressed" from="Header/Option/QuitButton" to="." method="ExitButtonPressed"] 261 | [connection signal="pressed" from="Header/OpenConsole" to="Tools" method="ToggleConsole"] 262 | [connection signal="pressed" from="ErrorConsole/ErrorConsole/CloseButton" to="Tools" method="ToggleConsole"] 263 | 264 | [editable path="Pages/Installer"] 265 | [editable path="Pages/ModManager"] 266 | [editable path="ErrorConsole"] 267 | -------------------------------------------------------------------------------- /Scenes/InstallerPage.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=5 format=3 uid="uid://cr3wosequvma8"] 2 | 3 | [ext_resource type="Script" path="res://Scripts/Installer.cs" id="1_3lw4p"] 4 | [ext_resource type="Texture2D" uid="uid://e5vtrghoacs2" path="res://ImageAssets/WarningSign.png" id="1_xly6n"] 5 | [ext_resource type="Image" uid="uid://bvmy5gufcs58i" path="res://ImageAssets/ShortcutIcon.png" id="2_dhhpw"] 6 | 7 | [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_7am6t"] 8 | bg_color = Color(0.168627, 0.180392, 0.188235, 0.529412) 9 | 10 | [node name="Installer" type="Control" node_paths=PackedStringArray("_versionButton", "_createShortcutButton", "_autoUpdateButton", "_executableNameLineEdit", "_installLocationButton", "_downloadButton", "_downloadWindow", "_downloadLabel", "_downloadUpdateTimer", "_downloadProgressBar", "_autoUnpackButton", "_customVersionCheckBox", "_downloadRequester", "_extractWarning", "_downloadWarning") groups=["Initiate"]] 11 | layout_mode = 3 12 | anchors_preset = 0 13 | script = ExtResource("1_3lw4p") 14 | _titlesKeySite = "https://switchbrew.org/w/index.php?title=Title_list/Games&mobileaction=toggle_view_desktop" 15 | _icon = ExtResource("2_dhhpw") 16 | _versionButton = NodePath("ControlsContainer/VersionSelectionButton") 17 | _createShortcutButton = NodePath("ControlsContainer/CreateShortcutButton") 18 | _autoUpdateButton = NodePath("ControlsContainer/AutoUpdate") 19 | _executableNameLineEdit = NodePath("ControlsContainer/ExecutableName") 20 | _installLocationButton = NodePath("ControlsContainer/LocationButton") 21 | _downloadButton = NodePath("DownloadButton") 22 | _downloadWindow = NodePath("DownloadWindow") 23 | _downloadLabel = NodePath("DownloadWindow/Window/DownloadLabelBox") 24 | _downloadUpdateTimer = NodePath("DownloadWindow/Window/DownloadProgressUpdater") 25 | _downloadProgressBar = NodePath("DownloadWindow/Window/DownloadProgress") 26 | _autoUnpackButton = NodePath("ControlsContainer/ExtractButton") 27 | _customVersionCheckBox = NodePath("ControlsContainer/CustomVersion/CustomVersionCheckBox") 28 | _downloadRequester = NodePath("DownloadRequester") 29 | _extractWarning = NodePath("ControlsContainer/ExtractLabel/ExtractWarning") 30 | _downloadWarning = NodePath("DownloadButton/DownloadWarning") 31 | metadata/_edit_use_anchors_ = true 32 | 33 | [node name="ControlsContainer" type="GridContainer" parent="."] 34 | layout_mode = 1 35 | anchors_preset = -1 36 | anchor_left = 0.05 37 | anchor_top = 0.12301 38 | anchor_right = 0.95 39 | anchor_bottom = 0.437593 40 | grow_horizontal = 2 41 | grow_vertical = 2 42 | columns = 2 43 | metadata/_edit_use_anchors_ = true 44 | 45 | [node name="VersionSelectionLabel" type="Label" parent="ControlsContainer"] 46 | layout_mode = 2 47 | text = "Versions:" 48 | 49 | [node name="VersionSelectionButton" type="OptionButton" parent="ControlsContainer"] 50 | layout_mode = 2 51 | size_flags_horizontal = 3 52 | size_flags_vertical = 4 53 | focus_mode = 0 54 | alignment = 1 55 | 56 | [node name="UseCustomVersionLabel" type="Label" parent="ControlsContainer"] 57 | layout_mode = 2 58 | text = "Use custom:" 59 | 60 | [node name="CustomVersion" type="HBoxContainer" parent="ControlsContainer"] 61 | layout_mode = 2 62 | size_flags_vertical = 4 63 | 64 | [node name="CustomVersionCheckBox" type="CheckBox" parent="ControlsContainer/CustomVersion"] 65 | layout_mode = 2 66 | focus_mode = 0 67 | flat = true 68 | 69 | [node name="CustomVersionLineEdit" type="LineEdit" parent="ControlsContainer/CustomVersion"] 70 | layout_mode = 2 71 | size_flags_horizontal = 3 72 | 73 | [node name="LocationLabel" type="Label" parent="ControlsContainer"] 74 | layout_mode = 2 75 | text = "Install location:" 76 | 77 | [node name="LocationButton" type="Button" parent="ControlsContainer"] 78 | custom_minimum_size = Vector2(100, 0) 79 | layout_mode = 2 80 | size_flags_horizontal = 3 81 | tooltip_text = "Location to intall Yuzu" 82 | 83 | [node name="ExecutableNameLabel" type="Label" parent="ControlsContainer"] 84 | layout_mode = 2 85 | tooltip_text = "Set a custom executable name, e.g yuzu (turns into yuzu.exe or yuzu.appimage)" 86 | mouse_filter = 1 87 | text = "Executable Name:" 88 | 89 | [node name="ExecutableName" type="LineEdit" parent="ControlsContainer"] 90 | layout_mode = 2 91 | text = "yuzu" 92 | alignment = 1 93 | 94 | [node name="ExtractLabel" type="Label" parent="ControlsContainer"] 95 | layout_mode = 2 96 | size_flags_horizontal = 0 97 | text = "Auto unpack:" 98 | 99 | [node name="ExtractWarning" type="TextureRect" parent="ControlsContainer/ExtractLabel"] 100 | layout_mode = 2 101 | anchor_left = 1.19313 102 | anchor_top = 0.179487 103 | anchor_right = 1.33476 104 | anchor_bottom = 0.897436 105 | grow_horizontal = 2 106 | grow_vertical = 2 107 | texture = ExtResource("1_xly6n") 108 | expand_mode = 1 109 | stretch_mode = 4 110 | metadata/_edit_use_anchors_ = true 111 | 112 | [node name="ExtractButton" type="CheckBox" parent="ControlsContainer"] 113 | layout_mode = 2 114 | tooltip_text = "(Windows only) WARNING WILL DELETE ALL DATA IN SELECTED INSTALL LOCATION!" 115 | focus_mode = 0 116 | text = "Windows only:WARNING WILL DELETE ALL DATA IN INSTALL LOCATION" 117 | alignment = 1 118 | text_overrun_behavior = 4 119 | 120 | [node name="CreateShortcutLabel" type="Label" parent="ControlsContainer"] 121 | layout_mode = 2 122 | text = "Create start shortcut: " 123 | 124 | [node name="CreateShortcutButton" type="CheckBox" parent="ControlsContainer"] 125 | layout_mode = 2 126 | tooltip_text = "Creates a start menu shortcut for yuzu-ea (requires auto unpack and admin privleges on windows)" 127 | focus_mode = 0 128 | text = "Creates a start menu shortcut for yuzu-ea (requires auto unpack and admin privleges on windows)" 129 | alignment = 1 130 | text_overrun_behavior = 4 131 | 132 | [node name="AutoUpdateLabel" type="Label" parent="ControlsContainer"] 133 | layout_mode = 2 134 | size_flags_horizontal = 0 135 | text = "Auto update:" 136 | 137 | [node name="AutoUpdate" type="CheckBox" parent="ControlsContainer"] 138 | layout_mode = 2 139 | tooltip_text = "(Requires create shortcut) Causes shortcut to auto update Yuzu before launching it." 140 | focus_mode = 0 141 | text = "(Requires create shortcut) Auto update Yuzu at launch." 142 | alignment = 1 143 | text_overrun_behavior = 4 144 | 145 | [node name="DownloadButton" type="Button" parent="."] 146 | custom_minimum_size = Vector2(100, 0) 147 | layout_mode = 1 148 | anchors_preset = -1 149 | anchor_left = 0.05 150 | anchor_top = 0.578125 151 | anchor_right = 0.95 152 | anchor_bottom = 0.721875 153 | grow_horizontal = 2 154 | grow_vertical = 2 155 | size_flags_horizontal = 3 156 | size_flags_vertical = 3 157 | focus_next = NodePath(".") 158 | focus_previous = NodePath(".") 159 | text = "Download 160 | " 161 | metadata/_edit_use_anchors_ = true 162 | 163 | [node name="DownloadWarning" type="TextureRect" parent="DownloadButton"] 164 | layout_mode = 1 165 | anchors_preset = -1 166 | anchor_left = -0.0416667 167 | anchor_top = 0.326087 168 | anchor_right = -0.0127315 169 | anchor_bottom = 0.688406 170 | grow_horizontal = 2 171 | grow_vertical = 2 172 | texture = ExtResource("1_xly6n") 173 | expand_mode = 5 174 | stretch_mode = 4 175 | metadata/_edit_use_anchors_ = true 176 | 177 | [node name="DownloadRequester" type="HTTPRequest" parent="."] 178 | 179 | [node name="DownloadWindow" type="Panel" parent="."] 180 | visible = false 181 | layout_mode = 1 182 | anchors_preset = 15 183 | anchor_right = 1.0 184 | anchor_bottom = 1.0 185 | grow_horizontal = 2 186 | grow_vertical = 2 187 | theme_override_styles/panel = SubResource("StyleBoxFlat_7am6t") 188 | 189 | [node name="Window" type="ColorRect" parent="DownloadWindow"] 190 | layout_mode = 1 191 | anchors_preset = 8 192 | anchor_left = 0.5 193 | anchor_top = 0.5 194 | anchor_right = 0.5 195 | anchor_bottom = 0.5 196 | offset_left = -505.0 197 | offset_top = -125.0 198 | offset_right = 505.0 199 | offset_bottom = 127.0 200 | grow_horizontal = 2 201 | grow_vertical = 2 202 | color = Color(0.168627, 0.180392, 0.188235, 1) 203 | 204 | [node name="DownloadLabelBox" type="Label" parent="DownloadWindow/Window"] 205 | layout_mode = 1 206 | anchors_preset = 8 207 | anchor_left = 0.5 208 | anchor_top = 0.5 209 | anchor_right = 0.5 210 | anchor_bottom = 0.5 211 | offset_left = -246.5 212 | offset_top = -93.0 213 | offset_right = 246.5 214 | offset_bottom = -1.0 215 | grow_horizontal = 2 216 | grow_vertical = 2 217 | focus_mode = 2 218 | theme_override_font_sizes/font_size = 64 219 | text = "Downloading..." 220 | horizontal_alignment = 1 221 | vertical_alignment = 1 222 | 223 | [node name="DownloadProgress" type="ProgressBar" parent="DownloadWindow/Window"] 224 | layout_mode = 1 225 | anchors_preset = 7 226 | anchor_left = 0.5 227 | anchor_top = 1.0 228 | anchor_right = 0.5 229 | anchor_bottom = 1.0 230 | offset_left = -491.0 231 | offset_top = -101.0 232 | offset_right = 491.0 233 | offset_bottom = -50.0 234 | grow_horizontal = 2 235 | grow_vertical = 0 236 | size_flags_horizontal = 3 237 | size_flags_vertical = 3 238 | rounded = true 239 | 240 | [node name="DownloadProgressUpdater" type="Timer" parent="DownloadWindow/Window"] 241 | wait_time = 0.1 242 | 243 | [connection signal="toggled" from="ControlsContainer/CustomVersion/CustomVersionCheckBox" to="." method="CustomVersionSpinBoxEditable"] 244 | [connection signal="pressed" from="ControlsContainer/LocationButton" to="." method="OnInstallLocationButtonPressed"] 245 | [connection signal="text_changed" from="ControlsContainer/ExecutableName" to="." method="ExecutableNameChanged"] 246 | [connection signal="toggled" from="ControlsContainer/ExtractButton" to="." method="AutoUnpackToggled"] 247 | [connection signal="toggled" from="ControlsContainer/AutoUpdate" to="." method="AutoUpdateToggled"] 248 | [connection signal="pressed" from="DownloadButton" to="." method="InstallSelectedVersion"] 249 | [connection signal="request_completed" from="DownloadRequester" to="." method="VersionDownloadCompleted"] 250 | [connection signal="timeout" from="DownloadWindow/Window/DownloadProgressUpdater" to="." method="UpdateDownloadBar"] 251 | -------------------------------------------------------------------------------- /Scenes/ModManagerPage.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=38 format=3 uid="uid://bdihe2bmwmgtp"] 2 | 3 | [ext_resource type="Script" path="res://Scripts/ModManager.cs" id="1_g8nhx"] 4 | [ext_resource type="Texture2D" uid="uid://duqgfmchd1v45" path="res://ImageAssets/blue-check-mark-icon.svg" id="2_2ngo2"] 5 | [ext_resource type="Texture2D" uid="uid://6v2ifgmyp6yp" path="res://ImageAssets/LoadingCircleAnimation/frame-1.png" id="3_m1c4w"] 6 | [ext_resource type="Texture2D" uid="uid://5thiqdc0a2hi" path="res://ImageAssets/LoadingCircleAnimation/frame-2.png" id="4_suxsp"] 7 | [ext_resource type="Texture2D" uid="uid://by13358t2kich" path="res://ImageAssets/LoadingCircleAnimation/frame-3.png" id="5_v3vdp"] 8 | [ext_resource type="Texture2D" uid="uid://d4mxpw35xmlax" path="res://ImageAssets/LoadingCircleAnimation/frame-4.png" id="6_ruh65"] 9 | [ext_resource type="Texture2D" uid="uid://wnpgyjmnnoet" path="res://ImageAssets/LoadingCircleAnimation/frame-5.png" id="7_8ddj2"] 10 | [ext_resource type="Texture2D" uid="uid://df5vjnet6id83" path="res://ImageAssets/LoadingCircleAnimation/frame-6.png" id="8_duivn"] 11 | [ext_resource type="Texture2D" uid="uid://5o3fvcmp1pvu" path="res://ImageAssets/LoadingCircleAnimation/frame-7.png" id="9_mtk5j"] 12 | [ext_resource type="Texture2D" uid="uid://csinyp5jrblvw" path="res://ImageAssets/LoadingCircleAnimation/frame-8.png" id="10_udqee"] 13 | [ext_resource type="Texture2D" uid="uid://ij445okwlco6" path="res://ImageAssets/LoadingCircleAnimation/frame-9.png" id="11_jsupf"] 14 | [ext_resource type="Texture2D" uid="uid://dpkeio6v2yu0k" path="res://ImageAssets/LoadingCircleAnimation/frame-10.png" id="12_hkhsd"] 15 | [ext_resource type="Texture2D" uid="uid://bnvtq2no1j8ru" path="res://ImageAssets/LoadingCircleAnimation/frame-11.png" id="13_exv8c"] 16 | [ext_resource type="Texture2D" uid="uid://2sw5afdhbno7" path="res://ImageAssets/LoadingCircleAnimation/frame-12.png" id="14_fvywn"] 17 | [ext_resource type="Texture2D" uid="uid://c4dmpw3d24sw3" path="res://ImageAssets/LoadingCircleAnimation/frame-13.png" id="15_en65g"] 18 | [ext_resource type="Texture2D" uid="uid://csomaqbrp7pm1" path="res://ImageAssets/LoadingCircleAnimation/frame-14.png" id="16_o535n"] 19 | [ext_resource type="Texture2D" uid="uid://5nxa4amx1ctg" path="res://ImageAssets/LoadingCircleAnimation/frame-15.png" id="17_ae313"] 20 | [ext_resource type="Texture2D" uid="uid://buj451wqmieg2" path="res://ImageAssets/LoadingCircleAnimation/frame-16.png" id="18_41won"] 21 | [ext_resource type="Texture2D" uid="uid://vl1mcomcokw0" path="res://ImageAssets/LoadingCircleAnimation/frame-17.png" id="19_o0ufr"] 22 | [ext_resource type="Texture2D" uid="uid://66wajqj8hf02" path="res://ImageAssets/LoadingCircleAnimation/frame-18.png" id="20_vy1cs"] 23 | [ext_resource type="Texture2D" uid="uid://b3ee0h7icrrm" path="res://ImageAssets/LoadingCircleAnimation/frame-19.png" id="21_c5rj8"] 24 | [ext_resource type="Texture2D" uid="uid://dj618to1c1bjp" path="res://ImageAssets/LoadingCircleAnimation/frame-20.png" id="22_yku3t"] 25 | [ext_resource type="Texture2D" uid="uid://bsmue6kwurrr6" path="res://ImageAssets/LoadingCircleAnimation/frame-21.png" id="23_f21n4"] 26 | [ext_resource type="Texture2D" uid="uid://curutnnl7a2cg" path="res://ImageAssets/LoadingCircleAnimation/frame-22.png" id="24_4pw7b"] 27 | [ext_resource type="Texture2D" uid="uid://clyp8kt2bw73i" path="res://ImageAssets/LoadingCircleAnimation/frame-23.png" id="25_flcqx"] 28 | [ext_resource type="Texture2D" uid="uid://bjwofdiel6fxb" path="res://ImageAssets/LoadingCircleAnimation/frame-24.png" id="26_ppm80"] 29 | [ext_resource type="Texture2D" uid="uid://c7ub38jlgb0yd" path="res://ImageAssets/LoadingCircleAnimation/frame-25.png" id="27_xjb5n"] 30 | [ext_resource type="Texture2D" uid="uid://cu62qg7q7884c" path="res://ImageAssets/LoadingCircleAnimation/frame-26.png" id="28_wmr0s"] 31 | [ext_resource type="Texture2D" uid="uid://cynapsche3thd" path="res://ImageAssets/LoadingCircleAnimation/frame-27.png" id="29_r4uts"] 32 | [ext_resource type="Texture2D" uid="uid://cgvdx2iyuq0fy" path="res://ImageAssets/LoadingCircleAnimation/frame-28.png" id="30_pn2mq"] 33 | [ext_resource type="Texture2D" uid="uid://bh8ii4gn2cjdt" path="res://ImageAssets/LoadingCircleAnimation/frame-29.png" id="31_d1suf"] 34 | [ext_resource type="Texture2D" uid="uid://bcadb74q5qh20" path="res://ImageAssets/LoadingCircleAnimation/frame-30.png" id="32_s8fb7"] 35 | [ext_resource type="Texture2D" uid="uid://lxh2fqgq76w6" path="res://ImageAssets/LoadingCircleAnimation/frame-31.png" id="33_qet02"] 36 | [ext_resource type="Texture2D" uid="uid://coa1tpiuy4cbs" path="res://ImageAssets/LoadingCircleAnimation/frame-32.png" id="34_47yqt"] 37 | [ext_resource type="Texture2D" uid="uid://clkgpge7ql6qp" path="res://ImageAssets/LoadingCircleAnimation/frame-33.png" id="35_8s16e"] 38 | 39 | [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_thbu4"] 40 | bg_color = Color(0.168627, 0.180392, 0.188235, 0.529412) 41 | 42 | [sub_resource type="SpriteFrames" id="SpriteFrames_2s7oa"] 43 | animations = [{ 44 | "frames": [{ 45 | "duration": 1.0, 46 | "texture": ExtResource("3_m1c4w") 47 | }, { 48 | "duration": 1.0, 49 | "texture": ExtResource("4_suxsp") 50 | }, { 51 | "duration": 1.0, 52 | "texture": ExtResource("5_v3vdp") 53 | }, { 54 | "duration": 1.0, 55 | "texture": ExtResource("6_ruh65") 56 | }, { 57 | "duration": 1.0, 58 | "texture": ExtResource("7_8ddj2") 59 | }, { 60 | "duration": 1.0, 61 | "texture": ExtResource("8_duivn") 62 | }, { 63 | "duration": 1.0, 64 | "texture": ExtResource("9_mtk5j") 65 | }, { 66 | "duration": 1.0, 67 | "texture": ExtResource("10_udqee") 68 | }, { 69 | "duration": 1.0, 70 | "texture": ExtResource("11_jsupf") 71 | }, { 72 | "duration": 1.0, 73 | "texture": ExtResource("12_hkhsd") 74 | }, { 75 | "duration": 1.0, 76 | "texture": ExtResource("13_exv8c") 77 | }, { 78 | "duration": 1.0, 79 | "texture": ExtResource("14_fvywn") 80 | }, { 81 | "duration": 1.0, 82 | "texture": ExtResource("15_en65g") 83 | }, { 84 | "duration": 1.0, 85 | "texture": ExtResource("16_o535n") 86 | }, { 87 | "duration": 1.0, 88 | "texture": ExtResource("17_ae313") 89 | }, { 90 | "duration": 1.0, 91 | "texture": ExtResource("18_41won") 92 | }, { 93 | "duration": 1.0, 94 | "texture": ExtResource("19_o0ufr") 95 | }, { 96 | "duration": 1.0, 97 | "texture": ExtResource("20_vy1cs") 98 | }, { 99 | "duration": 1.0, 100 | "texture": ExtResource("21_c5rj8") 101 | }, { 102 | "duration": 1.0, 103 | "texture": ExtResource("22_yku3t") 104 | }, { 105 | "duration": 1.0, 106 | "texture": ExtResource("23_f21n4") 107 | }, { 108 | "duration": 1.0, 109 | "texture": ExtResource("24_4pw7b") 110 | }, { 111 | "duration": 1.0, 112 | "texture": ExtResource("25_flcqx") 113 | }, { 114 | "duration": 1.0, 115 | "texture": ExtResource("26_ppm80") 116 | }, { 117 | "duration": 1.0, 118 | "texture": ExtResource("27_xjb5n") 119 | }, { 120 | "duration": 1.0, 121 | "texture": ExtResource("28_wmr0s") 122 | }, { 123 | "duration": 1.0, 124 | "texture": ExtResource("29_r4uts") 125 | }, { 126 | "duration": 1.0, 127 | "texture": ExtResource("30_pn2mq") 128 | }, { 129 | "duration": 1.0, 130 | "texture": ExtResource("31_d1suf") 131 | }, { 132 | "duration": 1.0, 133 | "texture": ExtResource("32_s8fb7") 134 | }, { 135 | "duration": 1.0, 136 | "texture": ExtResource("33_qet02") 137 | }, { 138 | "duration": 1.0, 139 | "texture": ExtResource("34_47yqt") 140 | }, { 141 | "duration": 1.0, 142 | "texture": ExtResource("35_8s16e") 143 | }], 144 | "loop": true, 145 | "name": &"default", 146 | "speed": 30.0 147 | }] 148 | 149 | [node name="ModManager" type="Control" node_paths=PackedStringArray("_modList", "_downloadBar", "_downloadUpdateTimer", "_downloadRequester", "_titleRequester", "_loadingPanel", "_gamePickerButton", "_sourcePickerButton", "_modLocationButton", "_refreshButton", "_updateAllButton", "_updateSelectedButton", "_loadMoreButton") groups=["Initiate"]] 150 | layout_mode = 3 151 | anchors_preset = 15 152 | anchor_right = 1.0 153 | anchor_bottom = 1.0 154 | grow_horizontal = 2 155 | grow_vertical = 2 156 | script = ExtResource("1_g8nhx") 157 | _installedModsPath = "user://InstalledMods.json" 158 | _modList = NodePath("ModsList") 159 | _downloadBar = NodePath("DownloadBar") 160 | _downloadUpdateTimer = NodePath("DownloadUpdateTimer") 161 | _downloadRequester = NodePath("DownloadRequester") 162 | _titleRequester = NodePath("TitleRequester") 163 | _installedIcon = ExtResource("2_2ngo2") 164 | _loadingPanel = NodePath("LoadingWindow") 165 | _gamePickerButton = NodePath("Header/GameSelection") 166 | _sourcePickerButton = NodePath("Header/SourceSelection") 167 | _modLocationButton = NodePath("Header/ModLocationButton") 168 | _refreshButton = NodePath("SideBar/RefreshButton") 169 | _updateAllButton = NodePath("SideBar/UpdateAll") 170 | _updateSelectedButton = NodePath("SideBar/UpdateSelected") 171 | _loadMoreButton = NodePath("SideBar/LoadMore") 172 | metadata/_edit_use_anchors_ = true 173 | 174 | [node name="Header" type="GridContainer" parent="."] 175 | layout_mode = 1 176 | anchors_preset = -1 177 | anchor_left = 0.0130208 178 | anchor_top = 0.018 179 | anchor_right = 0.991667 180 | anchor_bottom = 0.162 181 | grow_horizontal = 2 182 | columns = 2 183 | metadata/_edit_use_anchors_ = true 184 | 185 | [node name="GameSelectedLabel" type="Label" parent="Header"] 186 | layout_mode = 2 187 | size_flags_horizontal = 0 188 | text = "Selected game:" 189 | 190 | [node name="GameSelection" type="OptionButton" parent="Header"] 191 | layout_mode = 2 192 | size_flags_horizontal = 3 193 | size_flags_vertical = 3 194 | tooltip_text = "Button to change the currently selected game." 195 | text_overrun_behavior = 4 196 | metadata/_edit_use_anchors_ = true 197 | 198 | [node name="SourceSelectedLabel" type="Label" parent="Header"] 199 | layout_mode = 2 200 | size_flags_horizontal = 0 201 | text = "Selected source:" 202 | 203 | [node name="SourceSelection" type="OptionButton" parent="Header"] 204 | layout_mode = 2 205 | size_flags_horizontal = 3 206 | size_flags_vertical = 3 207 | tooltip_text = "Button to change the currently selected game." 208 | text_overrun_behavior = 4 209 | metadata/_edit_use_anchors_ = true 210 | 211 | [node name="ModsLocationLabel" type="Label" parent="Header"] 212 | layout_mode = 2 213 | size_flags_horizontal = 0 214 | text = "Mods location: 215 | " 216 | 217 | [node name="ModLocationButton" type="Button" parent="Header"] 218 | layout_mode = 2 219 | size_flags_horizontal = 3 220 | size_flags_vertical = 3 221 | tooltip_text = "Button to change the mods folder. 222 | Linux something like: 223 | /home/username/.local/share/yuzu/load/. 224 | Windows it should be something like 225 | C:\\Users\\username\\AppData\\Roaming\\yuzu\\load" 226 | alignment = 0 227 | text_overrun_behavior = 4 228 | 229 | [node name="SideBar" type="VBoxContainer" parent="."] 230 | layout_mode = 1 231 | anchors_preset = -1 232 | anchor_left = 0.795833 233 | anchor_top = 0.175 234 | anchor_right = 0.991146 235 | anchor_bottom = 0.933 236 | grow_horizontal = 0 237 | grow_vertical = 2 238 | metadata/_edit_use_anchors_ = true 239 | 240 | [node name="RefreshButton" type="Button" parent="SideBar"] 241 | layout_mode = 2 242 | text = "Refresh" 243 | 244 | [node name="UpdateAll" type="Button" parent="SideBar"] 245 | layout_mode = 2 246 | tooltip_text = "Updates all mods from every game" 247 | text = "Update all mods" 248 | metadata/_edit_use_anchors_ = true 249 | 250 | [node name="UpdateSelected" type="Button" parent="SideBar"] 251 | layout_mode = 2 252 | tooltip_text = "Updates the selected mod (if installed)." 253 | text = "Update selected 254 | " 255 | metadata/_edit_use_anchors_ = true 256 | 257 | [node name="ClearMods" type="Button" parent="SideBar"] 258 | layout_mode = 2 259 | tooltip_text = "Clear mods folder (WANRING CLEARS THE ENTIRE MOD FOLDER FOR THE SELECTED GAME)" 260 | text = "Clear mods folder (WANRING CLEARS THE ENTIRE MOD FOLDER FOR THE SELECTED GAME)" 261 | text_overrun_behavior = 4 262 | metadata/_edit_use_anchors_ = true 263 | 264 | [node name="VerticalSpacer" type="Control" parent="SideBar"] 265 | layout_mode = 2 266 | size_flags_vertical = 3 267 | 268 | [node name="LoadMore" type="Button" parent="SideBar"] 269 | layout_mode = 2 270 | size_flags_vertical = 8 271 | text = "Load more" 272 | 273 | [node name="SearchBar" type="LineEdit" parent="."] 274 | layout_mode = 1 275 | anchors_preset = -1 276 | anchor_left = 0.0130208 277 | anchor_top = 0.186111 278 | anchor_right = 0.793229 279 | anchor_bottom = 0.223148 280 | placeholder_text = "Search" 281 | metadata/_edit_use_anchors_ = true 282 | 283 | [node name="ModsList" type="ItemList" parent="."] 284 | clip_contents = false 285 | layout_mode = 1 286 | anchors_preset = -1 287 | anchor_left = 0.0125 288 | anchor_top = 0.24 289 | anchor_right = 0.792708 290 | anchor_bottom = 0.933333 291 | grow_horizontal = 2 292 | grow_vertical = 2 293 | text_overrun_behavior = 4 294 | max_columns = 5 295 | fixed_icon_size = Vector2i(30, 30) 296 | metadata/_edit_use_anchors_ = true 297 | 298 | [node name="DownloadBar" type="ProgressBar" parent="."] 299 | layout_mode = 1 300 | anchors_preset = -1 301 | anchor_left = 0.013 302 | anchor_top = 0.943519 303 | anchor_right = 0.991 304 | anchor_bottom = 0.980556 305 | grow_horizontal = 2 306 | grow_vertical = 0 307 | metadata/_edit_use_anchors_ = true 308 | 309 | [node name="DownloadUpdateTimer" type="Timer" parent="."] 310 | process_mode = 3 311 | wait_time = 0.1 312 | 313 | [node name="LoadingWindow" type="Panel" parent="."] 314 | visible = false 315 | layout_mode = 1 316 | anchors_preset = 15 317 | anchor_right = 1.0 318 | anchor_bottom = 1.0 319 | grow_horizontal = 2 320 | grow_vertical = 2 321 | theme_override_styles/panel = SubResource("StyleBoxFlat_thbu4") 322 | 323 | [node name="LoadingBarControl" type="Control" parent="LoadingWindow"] 324 | layout_mode = 1 325 | anchors_preset = 8 326 | anchor_left = 0.5 327 | anchor_top = 0.5 328 | anchor_right = 0.5 329 | anchor_bottom = 0.5 330 | grow_horizontal = 2 331 | grow_vertical = 2 332 | 333 | [node name="LoadingBarSprite" type="AnimatedSprite2D" parent="LoadingWindow/LoadingBarControl"] 334 | process_mode = 3 335 | sprite_frames = SubResource("SpriteFrames_2s7oa") 336 | autoplay = "default" 337 | frame_progress = 0.838722 338 | 339 | [node name="LoadingLabelBox" type="Label" parent="LoadingWindow/LoadingBarControl"] 340 | layout_mode = 1 341 | offset_left = -246.5 342 | offset_top = -46.0 343 | offset_right = 246.5 344 | offset_bottom = 46.0 345 | grow_horizontal = 2 346 | grow_vertical = 2 347 | focus_mode = 2 348 | theme_override_font_sizes/font_size = 64 349 | text = "Loading:" 350 | horizontal_alignment = 1 351 | vertical_alignment = 1 352 | metadata/_edit_use_anchors_ = true 353 | 354 | [node name="DownloadRequester" type="HTTPRequest" parent="."] 355 | 356 | [node name="TitleRequester" type="HTTPRequest" parent="."] 357 | 358 | [connection signal="item_selected" from="Header/GameSelection" to="." method="SelectGame"] 359 | [connection signal="item_selected" from="Header/SourceSelection" to="." method="SourceSelected"] 360 | [connection signal="pressed" from="Header/ModLocationButton" to="." method="ModLocationPressed"] 361 | [connection signal="pressed" from="SideBar/RefreshButton" to="." method="RefreshPressed"] 362 | [connection signal="pressed" from="SideBar/UpdateAll" to="." method="UpdateAll"] 363 | [connection signal="pressed" from="SideBar/UpdateSelected" to="." method="UpdateSelectedPressed"] 364 | [connection signal="pressed" from="SideBar/ClearMods" to="." method="ClearModsPressed"] 365 | [connection signal="pressed" from="SideBar/LoadMore" to="." method="LoadNextPage"] 366 | [connection signal="text_changed" from="SearchBar" to="." method="SearchUpdated"] 367 | [connection signal="item_activated" from="ModsList" to="." method="ModClicked"] 368 | [connection signal="timeout" from="DownloadUpdateTimer" to="." method="UpdateDownloadProgress"] 369 | -------------------------------------------------------------------------------- /Scenes/SettingsPage.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=3 uid="uid://deatvphh34eq0"] 2 | 3 | [ext_resource type="Script" path="res://Scripts/SettingsPage.cs" id="1_angmk"] 4 | 5 | [node name="Settings" type="Control" node_paths=PackedStringArray("_githubTokenLineEdit", "_getCompatibleVersionsButton", "_displayModeButton") groups=["Initiate"]] 6 | layout_mode = 3 7 | anchors_preset = 15 8 | anchor_right = 1.0 9 | anchor_bottom = 1.0 10 | grow_horizontal = 2 11 | grow_vertical = 2 12 | script = ExtResource("1_angmk") 13 | _githubTokenLineEdit = NodePath("SettingsContainer/GithubTokenLineEdit") 14 | _getCompatibleVersionsButton = NodePath("SettingsContainer/GetCompatibleVersions") 15 | _displayModeButton = NodePath("SettingsContainer/DisplayModeButton") 16 | metadata/_edit_use_anchors_ = true 17 | 18 | [node name="SettingsContainer" type="GridContainer" parent="."] 19 | layout_mode = 1 20 | anchors_preset = -1 21 | anchor_left = 0.253125 22 | anchor_top = 0.037963 23 | anchor_right = 0.747396 24 | anchor_bottom = 1.0 25 | grow_horizontal = 2 26 | grow_vertical = 2 27 | columns = 2 28 | metadata/_edit_use_anchors_ = true 29 | 30 | [node name="ResetSettingsLabel" type="Label" parent="SettingsContainer"] 31 | layout_mode = 2 32 | text = "Reset settings:" 33 | 34 | [node name="ResetSettings" type="Button" parent="SettingsContainer"] 35 | layout_mode = 2 36 | size_flags_horizontal = 3 37 | 38 | [node name="ResetInstalledModsLabel" type="Label" parent="SettingsContainer"] 39 | layout_mode = 2 40 | text = "Reset installed mods:" 41 | 42 | [node name="ResetInstalledMods" type="Button" parent="SettingsContainer"] 43 | layout_mode = 2 44 | 45 | [node name="GithubTokenLabel" type="Label" parent="SettingsContainer"] 46 | layout_mode = 2 47 | text = "Github API token:" 48 | 49 | [node name="GithubTokenLineEdit" type="LineEdit" parent="SettingsContainer"] 50 | layout_mode = 2 51 | placeholder_text = "Enter Github token here:" 52 | 53 | [node name="GetCompatibleVersionsLabel" type="Label" parent="SettingsContainer"] 54 | layout_mode = 2 55 | text = "Get compatible:" 56 | 57 | [node name="GetCompatibleVersions" type="CheckBox" parent="SettingsContainer"] 58 | layout_mode = 2 59 | tooltip_text = "Enabled fetching of compatible versions via the Github API WARNING:WILL LIKELY CAUSE ANONYMOUS USERS TO EXCEED API LIMIT" 60 | text = "Enabled fetching of compatible versions via the Github API 61 | WARNING:WILL LIKELY CAUSE ANANONYMOUS USERS TO EXCEED API LIMIT" 62 | flat = true 63 | text_overrun_behavior = 4 64 | 65 | [node name="DisplayModeLabel" type="Label" parent="SettingsContainer"] 66 | layout_mode = 2 67 | text = "Display mode:" 68 | 69 | [node name="DisplayModeButton" type="OptionButton" parent="SettingsContainer"] 70 | layout_mode = 2 71 | alignment = 1 72 | item_count = 2 73 | popup/item_0/text = "Windowed" 74 | popup/item_0/id = 0 75 | popup/item_1/text = "Fullscreen" 76 | popup/item_1/id = 3 77 | 78 | [connection signal="pressed" from="SettingsContainer/ResetSettings" to="." method="ResetSettingsPressed"] 79 | [connection signal="pressed" from="SettingsContainer/ResetInstalledMods" to="." method="ResetInstalledModsPressed"] 80 | [connection signal="text_submitted" from="SettingsContainer/GithubTokenLineEdit" to="." method="GithubTokenEntered"] 81 | [connection signal="toggled" from="SettingsContainer/GetCompatibleVersions" to="." method="GetCompatibleToggled"] 82 | [connection signal="item_selected" from="SettingsContainer/DisplayModeButton" to="." method="SetDisplayMode"] 83 | -------------------------------------------------------------------------------- /Scenes/ToolsPage.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=3 uid="uid://cwwmo68jd12gd"] 2 | 3 | [ext_resource type="Script" path="res://Scripts/ToolsPage.cs" id="1_1ei58"] 4 | [ext_resource type="Texture2D" uid="uid://e5vtrghoacs2" path="res://ImageAssets/WarningSign.png" id="1_pfmpv"] 5 | 6 | [node name="Tools" type="Control" node_paths=PackedStringArray("_clearInstallFolderButton", "_clearShadersToolButton", "_backupSavesButton", "_restoreSavesButton", "_fromSaveDirectoryButton", "_toSaveDirectoryButton") groups=["Initiate"]] 7 | layout_mode = 3 8 | anchors_preset = 0 9 | script = ExtResource("1_1ei58") 10 | _clearInstallFolderButton = NodePath("Tools/ClearInstallFolderButton") 11 | _clearShadersToolButton = NodePath("") 12 | _backupSavesButton = NodePath("Tools/BackupSavesButton") 13 | _restoreSavesButton = NodePath("Tools/RestoreSavesButton") 14 | _fromSaveDirectoryButton = NodePath("Tools/SaveContainer/FromButton") 15 | _toSaveDirectoryButton = NodePath("Tools/SaveContainer/ToButton") 16 | 17 | [node name="Tools" type="VBoxContainer" parent="."] 18 | layout_mode = 1 19 | anchors_preset = -1 20 | anchor_left = 0.05 21 | anchor_top = 0.05 22 | anchor_right = 0.95 23 | anchor_bottom = 0.95 24 | grow_horizontal = 2 25 | grow_vertical = 2 26 | theme_override_constants/separation = 18 27 | 28 | [node name="ClearInstallFolderButton" type="Button" parent="Tools"] 29 | custom_minimum_size = Vector2(100, 0) 30 | layout_mode = 2 31 | size_flags_horizontal = 3 32 | size_flags_vertical = 3 33 | tooltip_text = "Clears the selected installation folder of all files" 34 | focus_mode = 0 35 | text = "Clear Installation Folder" 36 | 37 | [node name="ClearInstallWarning" type="TextureRect" parent="Tools/ClearInstallFolderButton"] 38 | layout_mode = 1 39 | anchors_preset = -1 40 | anchor_left = -0.0434028 41 | anchor_top = 0.310127 42 | anchor_right = -0.0144676 43 | anchor_bottom = 0.626582 44 | grow_horizontal = 2 45 | grow_vertical = 2 46 | texture = ExtResource("1_pfmpv") 47 | expand_mode = 5 48 | stretch_mode = 4 49 | metadata/_edit_use_anchors_ = true 50 | 51 | [node name="BackupSavesButton" type="Button" parent="Tools"] 52 | custom_minimum_size = Vector2(100, 0) 53 | layout_mode = 2 54 | size_flags_horizontal = 3 55 | size_flags_vertical = 3 56 | tooltip_text = "Creates a backup of all saves from the selected \"From\" directory into the selected \"To\" directory." 57 | focus_mode = 0 58 | text = "Backup saves" 59 | 60 | [node name="RestoreSavesButton" type="Button" parent="Tools"] 61 | custom_minimum_size = Vector2(100, 0) 62 | layout_mode = 2 63 | size_flags_horizontal = 3 64 | size_flags_vertical = 3 65 | tooltip_text = "Restores saves from the \"To\" directory into the \"From\" directory." 66 | focus_mode = 0 67 | text = "Restore saves (pulls from to and places in from)" 68 | 69 | [node name="SaveContainer" type="GridContainer" parent="Tools"] 70 | layout_mode = 2 71 | size_flags_vertical = 3 72 | columns = 2 73 | 74 | [node name="FromLabel" type="Label" parent="Tools/SaveContainer"] 75 | layout_mode = 2 76 | size_flags_horizontal = 0 77 | size_flags_vertical = 3 78 | text = "From:" 79 | 80 | [node name="FromButton" type="Button" parent="Tools/SaveContainer"] 81 | custom_minimum_size = Vector2(100, 0) 82 | layout_mode = 2 83 | size_flags_horizontal = 3 84 | size_flags_vertical = 3 85 | tooltip_text = "Location to pull saves from when backing up, and put saves when restoring." 86 | focus_mode = 0 87 | text = " 88 | " 89 | 90 | [node name="ToLabel" type="Label" parent="Tools/SaveContainer"] 91 | layout_mode = 2 92 | size_flags_horizontal = 0 93 | size_flags_vertical = 3 94 | text = "To:" 95 | 96 | [node name="ToButton" type="Button" parent="Tools/SaveContainer"] 97 | custom_minimum_size = Vector2(100, 0) 98 | layout_mode = 2 99 | size_flags_horizontal = 3 100 | size_flags_vertical = 3 101 | tooltip_text = "Location to store saves when backing up, and retrieve saves from when restoring." 102 | focus_mode = 0 103 | 104 | [connection signal="pressed" from="Tools/ClearInstallFolderButton" to="." method="ClearInstallFolderButtonPressed"] 105 | [connection signal="pressed" from="Tools/BackupSavesButton" to="." method="OnBackupSavesButtonPressed"] 106 | [connection signal="pressed" from="Tools/RestoreSavesButton" to="." method="OnRestoreSavesPressed"] 107 | [connection signal="pressed" from="Tools/SaveContainer/FromButton" to="." method="OnFromSaveDirectoryButtonPressed"] 108 | [connection signal="pressed" from="Tools/SaveContainer/ToButton" to="." method="OnToSaveDirectoryButtonPressed"] 109 | -------------------------------------------------------------------------------- /Scripts/Game.cs: -------------------------------------------------------------------------------- 1 | using Godot; 2 | 3 | 4 | public partial class Game : Node 5 | { 6 | public string GameName { set; get; } 7 | 8 | } 9 | -------------------------------------------------------------------------------- /Scripts/Globals.cs: -------------------------------------------------------------------------------- 1 | using Godot; 2 | using System.IO; 3 | using System.Linq; 4 | using Octokit; 5 | using YuzuToolbox.Scripts.Modes; 6 | using Node = Godot.Node; 7 | 8 | public partial class Globals : Node 9 | { 10 | //private static Globals _instance; 11 | public static Globals Instance; 12 | 13 | public Mode AppMode = new ModeRyujinx(); 14 | public ResourceSaveManager SaveManager = new(); 15 | public SettingsResource Settings = new(); 16 | 17 | // TODO replace header with finalized project name 18 | public readonly GitHubClient LocalGithubClient = new(new ProductHeaderValue("EmulationToolbox")); 19 | //public string DllsDirectory; 20 | 21 | public override void _Ready() 22 | { 23 | Instance = this; 24 | SaveManager.Version = 2.4f; 25 | Settings = SaveManager.GetSettings(); 26 | SetDefaultPaths(); 27 | if (!string.IsNullOrEmpty(Settings.GithubApiToken)) 28 | { 29 | AuthenticateGithubClient(); 30 | } 31 | 32 | // Get launch options and update settings accordingly. 33 | var launchOptions = OS.GetCmdlineArgs(); 34 | Settings.LauncherMode = launchOptions.Contains("--launcher"); 35 | SaveManager.WriteSave(); 36 | 37 | GetTree().CallDeferred("call_group", "Initiate", "Initiate"); 38 | } 39 | 40 | public void SetDefaultPaths() 41 | { 42 | // Sets app data path default for first startup 43 | if (string.IsNullOrEmpty(Settings.AppDataPath)) 44 | { 45 | Settings.AppDataPath = OS.GetName() == "Linux" 46 | ? Path.Join(System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData), 47 | "yuzu") 48 | : Path.Join(System.Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData), 49 | "yuzu"); 50 | } 51 | 52 | if (string.IsNullOrEmpty(Settings.ModsLocation)) 53 | { 54 | Settings.ModsLocation = Path.Join(Settings.AppDataPath, "load"); 55 | } 56 | 57 | if (string.IsNullOrEmpty(Settings.FromSaveDirectory)) 58 | { 59 | Settings.FromSaveDirectory = Path.Join(Settings.AppDataPath, "nand", "user", "save"); 60 | } 61 | 62 | SaveManager.WriteSave(Settings); 63 | } 64 | 65 | 66 | public void AuthenticateGithubClient() 67 | { 68 | LocalGithubClient.Credentials = new Credentials(Settings.GithubApiToken); 69 | } 70 | 71 | } 72 | -------------------------------------------------------------------------------- /Scripts/Home.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Linq; 3 | using Godot; 4 | using Godot.Collections; 5 | using YuzuToolbox.Scripts.Modes; 6 | 7 | 8 | public partial class Home : Control 9 | { 10 | [ExportGroup("App")] 11 | [Export()] private float _appVersion = 2f; 12 | [Export()] private OptionButton _appModesButton; 13 | [Export()] private Godot.Collections.Dictionary _appModes; 14 | [Export()] private TextureRect _darkBg; 15 | [Export()] private TextureRect _lightBg; 16 | [Export()] private ColorRect _downloadWindowApp; 17 | [Export()] private AudioStreamPlayer _backgroundAudio; 18 | [Export()] private CheckButton _muteButton; 19 | [Export()] private CheckButton _enableLightTheme; 20 | [Export()] private Array _themes; 21 | [Export()] private Array _themesSeparator; 22 | [Export()] private ColorRect _header; 23 | [Export()] private Label _headerLabel; 24 | [Export()] private Label _latestVersionLabel; 25 | [Export()] private Control _errorConsole; 26 | 27 | [ExportGroup("ModManager")] 28 | [Export()] private ItemList _modList; 29 | [Export()] private AnimatedSprite2D _modMangerLoadingSprite; 30 | [Export()] private Label _modManagerLoadingLabel; 31 | 32 | 33 | // Internal variables 34 | private Theme _currentTheme; 35 | private SettingsResource Settings => Globals.Instance.Settings; 36 | 37 | 38 | // Godot functions 39 | private void Initiate() 40 | { 41 | // Sets minimum window size and display mode. 42 | DisplayServer.WindowSetMinSize(new Vector2I(1024, 576)); 43 | DisplayServer.WindowSetMode((DisplayServer.WindowMode)Settings.DisplayMode); 44 | 45 | // Set the theme 46 | SetTheme(Settings.LightModeEnabled); 47 | SetMode(0, Settings.AppMode); 48 | 49 | // Sets scaling (Called manually to hopefully fix #31 50 | WindowResized(); 51 | 52 | // Signals 53 | Resized += WindowResized; 54 | } 55 | 56 | 57 | // Custom functions 58 | private void SetTheme(bool enableLight) 59 | { 60 | _lightBg.Visible = enableLight; 61 | _darkBg.Visible = !enableLight; 62 | _currentTheme = enableLight ? _themes[1] : _themes[0]; 63 | _header.Color = enableLight ? new Godot.Color(0.74117648601532f, 0.76470589637756f, 0.78039216995239f) : new Godot.Color(0.16862745583057f, 0.1803921610117f, 0.18823529779911f); 64 | _downloadWindowApp.Color = enableLight ? new Godot.Color(0.74117648601532f, 0.76470589637756f, 0.78039216995239f) : new Godot.Color(0.16862745583057f, 0.1803921610117f, 0.18823529779911f); 65 | _enableLightTheme.ButtonPressed = enableLight; 66 | Settings.LightModeEnabled = enableLight; 67 | Globals.Instance.SaveManager.WriteSave(Settings); 68 | Theme = _currentTheme; 69 | } 70 | 71 | 72 | private void SetMode(int newMode, string forcedMode = "") 73 | { 74 | string mode; 75 | // if manually setting a mode set it to that, otherwise for the button event updates use the indexed mode given 76 | if (forcedMode != "") 77 | { 78 | mode = forcedMode; 79 | // TODO 80 | //_appModesButton.Selected = _appModes != null ? _appModes.FirstOrDefault(x => x.Value == forcedMode).Key : 0; 81 | } 82 | else 83 | { 84 | mode = _appModes[newMode]; 85 | } 86 | 87 | switch (mode) 88 | { 89 | case "Yuzu": 90 | Globals.Instance.AppMode = new ModeYuzu(); 91 | break; 92 | case "Ryujinx": 93 | Globals.Instance.AppMode = new ModeRyujinx(); 94 | break; 95 | } 96 | } 97 | 98 | 99 | private void ModeChanged(int newModeIndex) 100 | { 101 | SetMode(newModeIndex); 102 | } 103 | 104 | 105 | private void OpenConsole() 106 | { 107 | _errorConsole.Visible = !_errorConsole.Visible; 108 | } 109 | 110 | 111 | // Signal functions 112 | private void WindowResized() 113 | { 114 | float scaleRatio = (((float)GetWindow().Size.X / 1920) + ((float)GetWindow().Size.Y / 1080)) / 2; 115 | _modList.IconScale = scaleRatio; 116 | _modMangerLoadingSprite.Scale = new Vector2(scaleRatio, scaleRatio); 117 | _modManagerLoadingLabel.AddThemeFontSizeOverride("font_size", (int)(scaleRatio * 64)); 118 | _headerLabel.AddThemeFontSizeOverride("font_size", (int)(scaleRatio * 49)); 119 | _latestVersionLabel.AddThemeFontSizeOverride("font_size", (int)(scaleRatio * 32)); 120 | _currentTheme.DefaultFontSize = Mathf.Clamp((int)(scaleRatio * 35), 20, 50); 121 | } 122 | 123 | 124 | private void ExitButtonPressed() 125 | { 126 | GetTree().Quit(); 127 | } 128 | 129 | } 130 | 131 | -------------------------------------------------------------------------------- /Scripts/Installer.cs: -------------------------------------------------------------------------------- 1 | using Godot; 2 | using System; 3 | using System.Diagnostics; 4 | using System.IO; 5 | using System.Linq; 6 | using System.Net.Http; 7 | using System.Text.RegularExpressions; 8 | using System.Threading.Tasks; 9 | using Mono.Unix; 10 | using NativeFileDialogSharp; 11 | using Octokit; 12 | using WindowsShortcutFactory; 13 | using YuzuToolbox.Scripts.Modes; 14 | using Label = Godot.Label; 15 | using SharpCompress.Common; 16 | using SharpCompress.Readers; 17 | 18 | 19 | public partial class Installer : Control 20 | { 21 | // Exported variables (Primarily for the UI / Interactions) 22 | [ExportGroup("General")] 23 | [Export] private Label _latestVersionLabel; 24 | 25 | [ExportGroup("Installer")] 26 | [Export] private string _titlesKeySite; 27 | [Export] private int _versionsPerPage = 10; 28 | [Export] private Image _icon; 29 | [Export] private OptionButton _versionButton; 30 | [Export] private CheckBox _createShortcutButton; 31 | [Export] private CheckBox _autoUpdateButton; 32 | [Export] private LineEdit _executableNameLineEdit; 33 | [Export] private Button _installLocationButton; 34 | [Export] private Button _downloadButton; 35 | [Export] private Panel _downloadWindow; 36 | [Export] private Label _downloadLabel; 37 | [Export] private Timer _downloadUpdateTimer; 38 | [Export] private ProgressBar _downloadProgressBar; 39 | [Export] private CheckBox _autoUnpackButton; 40 | [Export] private CheckBox _customVersionCheckBox; 41 | [Export] private LineEdit _customVersionLineEdit; 42 | [Export] private HttpRequest _downloadRequester; 43 | [Export] private TextureRect _extractWarning; 44 | [Export] private TextureRect _downloadWarning; 45 | 46 | // Internal variables 47 | private String _osUsed = OS.GetName(); 48 | // private string _yuzuExtensionString; 49 | private string _executableName; 50 | private string _executableSaveName; 51 | private int _latestRelease; 52 | private bool _autoUpdate; 53 | private Mode AppMode => Globals.Instance.AppMode; 54 | private SettingsResource Settings => Globals.Instance.Settings; 55 | 56 | private readonly System.Net.Http.HttpClient _httpClient = new(); 57 | 58 | 59 | // Godot functions 60 | private void Initiate() 61 | { 62 | _httpClient.DefaultRequestHeaders.Add("User-Agent", "YuzuToolbox"); 63 | _createShortcutButton.Disabled = _osUsed == "Windows"; 64 | 65 | // TODO 66 | if (AppMode.Name == "Yuzu") 67 | { 68 | if (_osUsed == "Linux") 69 | { 70 | _executableSaveName = ".AppImage"; 71 | _autoUnpackButton.Disabled = true; 72 | } 73 | else if (_osUsed == "Windows") 74 | { 75 | _executableSaveName = ".zip"; 76 | _createShortcutButton.Disabled = true; 77 | } 78 | } 79 | else 80 | { 81 | _executableSaveName = ".tar.gz"; 82 | } 83 | 84 | _executableName = AppMode.Name; 85 | _executableNameLineEdit.Text = _executableName; 86 | _installLocationButton.Text = Settings.SaveDirectory; 87 | _downloadButton.Disabled = true; 88 | _downloadWindow.Visible = false; 89 | _customVersionLineEdit.Editable = false; 90 | _extractWarning.Visible = false; 91 | _downloadWarning.Visible = false; 92 | 93 | AddVersions(); 94 | } 95 | 96 | 97 | 98 | // Custom functions 99 | private async void InstallSelectedVersion() 100 | { 101 | // Launches confirmation window, and cancels if not confirmed. 102 | var confirm = await Tools.Instance.ConfirmationPopup(); 103 | if (confirm != true) 104 | { 105 | return; 106 | } 107 | 108 | int selectedVersion; 109 | 110 | if (_customVersionCheckBox.ButtonPressed) 111 | { 112 | if (Regex.IsMatch(_customVersionLineEdit.Text, @"[^0-9.]")) 113 | { 114 | Tools.Instance.AddError("Invalid version selected, please enter a valid version number."); 115 | return; 116 | } 117 | selectedVersion = Tools.ToInt(_customVersionLineEdit.Text.Trim()); 118 | } 119 | else 120 | { 121 | int versionIndex = _versionButton.Selected; 122 | var version = _versionButton.GetItemText(versionIndex); 123 | selectedVersion = Tools.ToInt(version); 124 | } 125 | InstallVersion(selectedVersion); 126 | } 127 | 128 | 129 | 130 | private void InstallVersion(int version) 131 | { 132 | DeleteOldVersion(); 133 | 134 | // Set old install (if it exists) to not be disabled anymore. 135 | if (Globals.Instance.Settings.InstalledVersion >= 0) 136 | { 137 | _versionButton.SetItemDisabled(_versionButton.GetItemIndex(Settings.InstalledVersion), false); 138 | } 139 | 140 | _executableSaveName = _executableSaveName.Insert(0, _executableName); 141 | _customVersionCheckBox.Disabled = true; 142 | _versionButton.Disabled = true; 143 | _downloadButton.Disabled = true; 144 | _installLocationButton.Disabled = true; 145 | Settings.InstalledVersion = version; 146 | _downloadLabel.Text = "Downloading..."; 147 | _downloadWindow.Visible = true; 148 | _downloadLabel.GrabFocus(); 149 | 150 | // Ensures save directory exists 151 | if (!Directory.Exists(Settings.SaveDirectory)) 152 | { 153 | Directory.CreateDirectory(Settings.SaveDirectory); 154 | } 155 | 156 | _downloadRequester.DownloadFile = $@"{Settings.SaveDirectory}/{_executableSaveName}"; 157 | _downloadRequester.Request(AppMode.GetDownloadLink(version, _osUsed)); 158 | _downloadUpdateTimer.Start(); 159 | _downloadLabel.Text = "Downloading..."; 160 | } 161 | 162 | 163 | private void VersionDownloadCompleted(long result, long responseCode, string[] headers, byte[] body) 164 | { 165 | _downloadUpdateTimer.Stop(); 166 | _customVersionCheckBox.Disabled = false; 167 | _downloadButton.Disabled = false; 168 | _installLocationButton.Disabled = false; 169 | _versionButton.Disabled = false; 170 | if (result == (int)HttpRequest.Result.Success) 171 | { 172 | // Used to save version installed after download. 173 | Globals.Instance.SaveManager.WriteSave(); 174 | _downloadProgressBar.Value = 100; 175 | _downloadLabel.Text = "Successfully Downloaded!"; 176 | 177 | AddInstalledVersion(); 178 | UnpackAndSetPermissions(); 179 | if (_createShortcutButton.ButtonPressed) 180 | { 181 | _downloadWindow.Visible = false; 182 | CreateShortcut(); 183 | } 184 | 185 | _downloadWindow.Visible = false; 186 | 187 | if (Settings.LauncherMode) 188 | { 189 | Tools.Instance.LaunchYuzu(); 190 | } 191 | 192 | Globals.Instance.SaveManager.WriteSave(); 193 | } 194 | else 195 | { 196 | Tools.Instance.AddError("Failed to download, error:" + result); 197 | _downloadProgressBar.Value = 0; 198 | } 199 | } 200 | 201 | 202 | private void UpdateDownloadBar() 203 | { 204 | _downloadProgressBar.Value = 205 | (float)_downloadRequester.GetDownloadedBytes() / _downloadRequester.GetBodySize() * 100; 206 | } 207 | 208 | 209 | private void CreateShortcut() 210 | { 211 | String linuxShortcutName = "yuzu-ea.desktop"; 212 | String windowsShortcutName = "yuzu-ea.lnk"; 213 | String iconPath = Path.Join(Settings.SaveDirectory, "Icon.png"); 214 | 215 | string executable = _autoUpdate ? OS.GetExecutablePath() : Settings.ExecutablePath; 216 | string launcherFlag = null; 217 | if (_autoUpdate) 218 | { 219 | launcherFlag = "--launcher"; 220 | } 221 | else 222 | { 223 | GetExistingVersion(); 224 | } 225 | 226 | if (!File.Exists(executable)) 227 | { 228 | Tools.Instance.AddError("No executable path found, shortcut creation failed... Please contact a developer..."); 229 | return; 230 | } 231 | 232 | if (_osUsed == "Linux") 233 | { 234 | _icon.SavePng(iconPath); 235 | string shortcutContent = $@" 236 | [Desktop Entry] 237 | Comment=Nintendo Switch video game console emulator 238 | Exec={executable} {launcherFlag} 239 | GenericName=Switch Emulator 240 | Icon={iconPath} 241 | MimeType= 242 | Name=Yuzu-EA 243 | Path= 244 | StartupNotify=true 245 | Terminal=false 246 | TerminalOptions= 247 | Type=Application 248 | Keywords=Nintendo;Switch; 249 | Categories=Game;Emulator;Qt; 250 | "; 251 | 252 | if (Directory.Exists("/usr/share/applications/")) 253 | { 254 | string shortcutPath = $@"/usr/share/applications/{linuxShortcutName}"; 255 | 256 | try 257 | { 258 | string tempShortcutPath = $@"{Settings.SaveDirectory}/{linuxShortcutName}"; 259 | File.WriteAllText(tempShortcutPath, shortcutContent); 260 | ProcessStartInfo startInfo = new ProcessStartInfo 261 | { 262 | FileName = "pkexec", 263 | Arguments = $"mv {tempShortcutPath} {shortcutPath}", 264 | UseShellExecute = false 265 | }; 266 | 267 | Process process = new Process { StartInfo = startInfo }; 268 | process.Start(); 269 | process.WaitForExit(); 270 | } 271 | catch (Exception shortcutError) 272 | { 273 | shortcutPath = $@"{Settings.SaveDirectory}/{linuxShortcutName}"; 274 | Tools.Instance.AddError( 275 | $@"Error creating shortcut, creating new at {shortcutPath}. Error:{shortcutError}"); 276 | File.WriteAllText(shortcutPath, shortcutContent); 277 | } 278 | } 279 | else 280 | { 281 | Tools.Instance.AddError("Cannot find shortcut directory, please place manually."); 282 | } 283 | } 284 | else if (_osUsed == "Windows") 285 | { 286 | string commonStartMenuPath = 287 | System.Environment.GetFolderPath(System.Environment.SpecialFolder.CommonStartMenu); 288 | string yuzuStartMenuPath = Path.Combine(commonStartMenuPath, "Programs", "yuzu-ea"); 289 | string yuzuShortcutPath = Path.Combine(yuzuStartMenuPath, windowsShortcutName); 290 | var windowsShortcut = new WindowsShortcut 291 | { 292 | Path = executable, 293 | IconLocation = Settings.ExecutablePath, 294 | Arguments = launcherFlag 295 | }; 296 | 297 | 298 | try 299 | { 300 | if (!Directory.Exists(yuzuStartMenuPath)) 301 | { 302 | Directory.CreateDirectory(yuzuStartMenuPath); 303 | } 304 | 305 | windowsShortcut.Save(yuzuShortcutPath); 306 | } 307 | catch (Exception shortcutError) 308 | { 309 | yuzuShortcutPath = $@"{Settings.SaveDirectory}/{windowsShortcutName}"; 310 | Tools.Instance.AddError( 311 | $@"cannot create shortcut, ensure app is running as admin. Placing instead at {yuzuShortcutPath}. Exception:{shortcutError}"); 312 | windowsShortcut.Save(yuzuShortcutPath); 313 | } 314 | 315 | } 316 | } 317 | 318 | 319 | private async void AddVersions() 320 | { 321 | try 322 | { 323 | await GetLatestVersion(); 324 | if (_latestRelease == -1) 325 | { 326 | Tools.Instance.AddError("Unable to fetch latest emulator release"); 327 | return; 328 | } 329 | 330 | // TODO Deprecate or fix custom versions 331 | //_customVersionSpinBox.Value = _latestRelease; 332 | 333 | _latestVersionLabel.Text = $"Latest: {(AppMode.Name == "Yuzu" ? _latestRelease : Tools.FromInt(_latestRelease))}"; 334 | 335 | HttpResponseMessage releasesResponse = await _httpClient.GetAsync(AppMode.ReleasesUrl); 336 | var releasesContent = await releasesResponse.Content.ReadAsStringAsync(); 337 | MatchCollection releasesMatches = Regex.Matches(releasesContent, @"

(.*?)<\/h2>"); 338 | foreach (Match match in releasesMatches) 339 | { 340 | string version = match.Groups[1].Value.Trim(); 341 | _versionButton.AddItem(version, Tools.ToInt(version)); 342 | } 343 | 344 | 345 | //Checks if there is already a version installed, and if so adds it. 346 | if (Settings.InstalledVersion >= 0) 347 | { 348 | AddInstalledVersion(); 349 | } 350 | 351 | _downloadButton.Disabled = false; 352 | 353 | // If running in launcher mode updates and launches yuzu 354 | if (Settings.LauncherMode) 355 | { 356 | if (_latestRelease != Settings.InstalledVersion) 357 | { 358 | // Yuzu will be launched inside of the download function when the download is completed. 359 | InstallVersion(_latestRelease); 360 | } 361 | else 362 | { 363 | Tools.Instance.LaunchYuzu(); 364 | } 365 | } 366 | } 367 | catch (Exception versionPullException) 368 | { 369 | Tools.Instance.AddError("Failed to get latest versions error code: " + versionPullException); 370 | } 371 | } 372 | 373 | 374 | private void AddInstalledVersion() 375 | { 376 | var installedVersionInt = Settings.InstalledVersion; 377 | var installedVersion = AppMode.Name == "Yuzu" ? installedVersionInt.ToString() : Tools.FromInt(installedVersionInt); 378 | var selectedIndex = _versionButton.GetItemIndex(installedVersionInt); 379 | // Set the custom version to default of the currently installed one 380 | _customVersionLineEdit.Text = installedVersion; 381 | 382 | // Checks if the item was already added, if so sets it as current, otherwise adds a new item entry for it. 383 | if (selectedIndex >= 0) 384 | { 385 | _versionButton.Selected = selectedIndex; 386 | } 387 | else 388 | { 389 | _versionButton.AddItem(installedVersion, installedVersionInt); 390 | selectedIndex = _versionButton.GetItemIndex(installedVersionInt); 391 | _versionButton.Selected = selectedIndex; 392 | } 393 | 394 | _versionButton.SetItemDisabled(selectedIndex, true); 395 | } 396 | 397 | 398 | private async Task GetLatestVersion() 399 | { 400 | // Trys to fetch version using github API if failed, tries to web-scrape it. 401 | try 402 | { 403 | var gitHubClient = Globals.Instance.LocalGithubClient; 404 | var latestRelease = 405 | await gitHubClient.Repository.Release.GetLatest(AppMode.RepoOwner, AppMode.RepoName); 406 | 407 | string release = latestRelease.TagName.Split("-").Last(); 408 | _latestRelease = Tools.ToInt(release); 409 | } 410 | // TODO update for ryujinx 411 | // Fall back version grabber 412 | catch (RateLimitExceededException) 413 | { 414 | Tools.Instance.AddError("Github API rate limit exceeded, falling back to web-scraper. Some sources may not function until requests have reset"); 415 | 416 | var rawVersionData = _httpClient.GetAsync(AppMode.LatestDownloadUrl).Result.Content.ReadAsStringAsync().Result; 417 | 418 | _latestRelease = rawVersionData.Split("EA-").Last().Split("\"").First().ToInt(); 419 | } 420 | 421 | } 422 | 423 | 424 | private void UnpackAndSetPermissions() 425 | { 426 | string executablePath = $@"{Settings.SaveDirectory}/{_executableSaveName}"; 427 | if (_osUsed == "Linux" && Settings.AppMode == "Yuzu") 428 | { 429 | var executableFile = new UnixFileInfo(executablePath) 430 | { 431 | FileAccessPermissions = FileAccessPermissions.UserReadWriteExecute 432 | }; 433 | Settings.ExecutablePath = executablePath; 434 | } 435 | else if (_autoUnpackButton.ButtonPressed || _autoUpdate) 436 | { 437 | using Stream stream = File.OpenRead(executablePath); 438 | var reader = ReaderFactory.Open(stream); 439 | while (reader.MoveToNextEntry()) 440 | { 441 | if (!reader.Entry.IsDirectory) 442 | { 443 | ExtractionOptions opt = new ExtractionOptions 444 | { 445 | ExtractFullPath = true, 446 | Overwrite = true 447 | }; 448 | reader.WriteEntryToDirectory(Settings.SaveDirectory, opt); 449 | } 450 | } 451 | 452 | // Moves the files from the publish folder Ryujinx uses to the save directory 453 | if (AppMode.Name == "Ryujinx") 454 | { 455 | Tools.MoveFilesAndDirs(@$"{Settings.SaveDirectory}/publish", Settings.SaveDirectory); 456 | } 457 | 458 | // TODO 459 | String yuzuWindowsDirectory = $@"{Settings.SaveDirectory}/{AppMode.WindowsFolderName}"; 460 | if (Directory.Exists(yuzuWindowsDirectory)) 461 | { 462 | // Moves the files from the temp folder into the save directory 463 | Tools.MoveFilesAndDirs(yuzuWindowsDirectory, Settings.SaveDirectory); 464 | // Creates the executable path to yuzu.exe (hardcoded, but due to the prevalence of .exe's in the folder no better ways to do it) 465 | var currentExecutablePath = Path.Join(Settings.SaveDirectory, "yuzu.exe"); 466 | var newExecutablePath = Path.Join(Settings.SaveDirectory, 467 | $"{_executableName}.exe"); 468 | // Essentially renames the .exe into the yuzu executable name 469 | if (currentExecutablePath != newExecutablePath) 470 | { 471 | File.Move(currentExecutablePath, newExecutablePath); 472 | } 473 | 474 | Settings.ExecutablePath = newExecutablePath; 475 | } 476 | } 477 | 478 | } 479 | 480 | 481 | private String GetExistingVersion() 482 | { 483 | if (DirAccess.DirExistsAbsolute(Settings.SaveDirectory)) 484 | { 485 | var previousSave = DirAccess.Open(Settings.SaveDirectory); 486 | 487 | foreach (var file in previousSave.GetFiles()) 488 | { 489 | if (file.GetExtension() == "AppImage" || file.GetBaseName() == _executableSaveName) 490 | { 491 | return $@"{Settings.SaveDirectory}/{file}"; 492 | } 493 | } 494 | } 495 | 496 | Tools.Instance.AddError("Unable to find existing version"); 497 | return ""; 498 | } 499 | 500 | 501 | // Signal functions 502 | private void OnInstallLocationButtonPressed() 503 | { 504 | var saveDirectoryLocationInput = Dialog.FolderPicker(Settings.SaveDirectory).Path; 505 | if (saveDirectoryLocationInput != null) 506 | { 507 | Settings.SaveDirectory = saveDirectoryLocationInput; 508 | } 509 | 510 | _installLocationButton.Text = Settings.SaveDirectory; 511 | Globals.Instance.SaveManager.WriteSave(Globals.Instance.Settings); 512 | } 513 | 514 | 515 | private void AutoUnpackToggled(bool unpackEnabled) 516 | { 517 | // If unpack is toggled off, ensures the create shortcut button is also disabled and turns off. 518 | _createShortcutButton.ButtonPressed = unpackEnabled && _createShortcutButton.ButtonPressed; 519 | _createShortcutButton.Disabled = !unpackEnabled; 520 | _downloadWarning.Visible = _extractWarning.Visible || unpackEnabled; 521 | _extractWarning.Visible = unpackEnabled; 522 | } 523 | 524 | 525 | private void CustomVersionSpinBoxEditable(bool editable) 526 | { 527 | _customVersionLineEdit.Editable = editable; 528 | _versionButton.Disabled = editable; 529 | } 530 | 531 | 532 | private void ExecutableNameChanged(string newName) 533 | { 534 | _executableName = newName; 535 | // TODO check if necessary 536 | //AppMode.Name = newName; 537 | Globals.Instance.SaveManager.WriteSave(); 538 | } 539 | 540 | 541 | private void AutoUpdateToggled(bool autoUpdate) 542 | { 543 | if (_createShortcutButton.ButtonPressed || !autoUpdate) 544 | { 545 | _autoUpdate = autoUpdate; 546 | } 547 | _autoUpdateButton.ButtonPressed = _autoUpdate; 548 | } 549 | } 550 | -------------------------------------------------------------------------------- /Scripts/Modes/Mode.cs: -------------------------------------------------------------------------------- 1 | using System.Net; 2 | 3 | namespace YuzuToolbox.Scripts.Modes; 4 | 5 | public abstract class Mode 6 | { 7 | public string Name; 8 | public string RepoName; 9 | public string RepoOwner; 10 | public string LatestDownloadUrl; 11 | public string DownloadBaseUrl; 12 | public string ReleasesUrl; 13 | public string WindowsFolderName; 14 | public string BaseString; 15 | public string InstallDirectory; 16 | public string ModsDirectory; 17 | public string SaveDirectory; 18 | 19 | public abstract string GetDownloadLink(int version, string os); 20 | } -------------------------------------------------------------------------------- /Scripts/Modes/Ryujinx.cs: -------------------------------------------------------------------------------- 1 | using Godot; 2 | 3 | namespace YuzuToolbox.Scripts.Modes; 4 | 5 | public class ModeRyujinx : Mode 6 | { 7 | public ModeRyujinx() 8 | { 9 | Name = "Ryujinx"; 10 | RepoName = "release-channel-master"; 11 | RepoOwner = "Ryujinx"; 12 | LatestDownloadUrl = "https://github.com/Ryujinx/release-channel-master/releases/latest"; 13 | DownloadBaseUrl = "https://github.com/Ryujinx/release-channel-master/releases/download"; 14 | ReleasesUrl = "https://github.com/Ryujinx/release-channel-master/releases"; 15 | WindowsFolderName = "yuzu-windows-msvc-early-access"; 16 | BaseString = "ryujinx-"; 17 | } 18 | 19 | 20 | public override string GetDownloadLink(int version, string os) 21 | { 22 | string versionString = Tools.FromInt(version); 23 | string extension; 24 | string osPrefix; 25 | if (os == "Windows") 26 | { 27 | osPrefix = "win_x64"; 28 | extension = "zip"; 29 | } 30 | else if (os == "Linux") 31 | { 32 | osPrefix = "linux_x64"; 33 | extension = "tar.gz"; 34 | } 35 | else 36 | { 37 | osPrefix = "macos_universal.app"; 38 | extension = "tar.gz"; 39 | } 40 | 41 | return $@"{DownloadBaseUrl}/{versionString}/{BaseString}{versionString}-{osPrefix}.{extension}"; 42 | } 43 | } -------------------------------------------------------------------------------- /Scripts/Modes/Yuzu.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Runtime.CompilerServices; 3 | 4 | namespace YuzuToolbox.Scripts.Modes; 5 | 6 | public class ModeYuzu : Mode 7 | { 8 | public ModeYuzu() 9 | { 10 | Name = "Yuzu"; 11 | RepoName = "pineapple-src"; 12 | RepoOwner = "pineappleEA"; 13 | LatestDownloadUrl = "https://github.com/pineappleEA/pineapple-src/releases/latest"; 14 | DownloadBaseUrl = "https://github.com/pineappleEA/pineapple-src/releases/download/EA-"; 15 | ReleasesUrl = "https://github.com/pineappleEA/pineapple-src/releases"; 16 | WindowsFolderName = "yuzu-windows-msvc-early-access"; 17 | BaseString = "Yuzu-EA-"; 18 | } 19 | 20 | 21 | public override string GetDownloadLink(int version, string os) 22 | { 23 | string extension = os == "Windows" ? "zip" : "tar.gz"; 24 | 25 | return $@"{DownloadBaseUrl}{version}/{os}-{BaseString}{version}.{extension}"; 26 | } 27 | } -------------------------------------------------------------------------------- /Scripts/ResourceSaveManager.cs: -------------------------------------------------------------------------------- 1 | using Godot; 2 | using System; 3 | 4 | public partial class ResourceSaveManager : Resource 5 | { 6 | public const String SaveGameBasePath = "user://InternalSave"; 7 | 8 | [Export()] public float Version; 9 | [Export()] public SettingsResource _settings; 10 | 11 | public void WriteSave(SettingsResource settings = null) 12 | { 13 | // If no settings are passed, use the current settings 14 | _settings = settings ?? _settings; 15 | ResourceSaver.Save(this, GetSavePath()); 16 | } 17 | 18 | 19 | private static bool SaveExists() 20 | { 21 | return ResourceLoader.Exists(GetSavePath()); 22 | } 23 | 24 | private static Resource LoadSave() 25 | { 26 | if (SaveExists()) 27 | { 28 | return ResourceLoader.Load(GetSavePath()); 29 | } 30 | return null; 31 | } 32 | 33 | 34 | public SettingsResource GetSettings() 35 | { 36 | if (SaveExists()) 37 | { 38 | var lastSave = (ResourceSaveManager)LoadSave(); 39 | 40 | // If the save is from a previous version, reset the settings 41 | if (lastSave.Version != Version) 42 | { 43 | Tools.Instance.CallDeferred("AddError", "Save version is incompatible with app, resetting user settings."); 44 | _settings = new SettingsResource(); 45 | WriteSave(); 46 | } 47 | else 48 | { 49 | _settings = lastSave._settings; 50 | } 51 | } 52 | else 53 | { 54 | _settings = new SettingsResource(); 55 | WriteSave(); 56 | } 57 | 58 | return _settings; 59 | } 60 | 61 | 62 | static String GetSavePath() 63 | { 64 | var extension = OS.IsDebugBuild() ? ".tres" : ".res"; 65 | return SaveGameBasePath + extension; 66 | } 67 | 68 | } -------------------------------------------------------------------------------- /Scripts/SettingsPage.cs: -------------------------------------------------------------------------------- 1 | using Godot; 2 | 3 | 4 | public partial class SettingsPage : Node 5 | { 6 | [Export()] private ModManager _modManager; 7 | [Export()] private LineEdit _githubTokenLineEdit; 8 | 9 | [Export()] private CheckBox _getCompatibleVersionsButton; 10 | [Export()] private OptionButton _displayModeButton; 11 | 12 | 13 | private void Initiate() 14 | { 15 | _getCompatibleVersionsButton.ButtonPressed = Globals.Instance.Settings.GetCompatibleVersions; 16 | _displayModeButton.Selected = _displayModeButton.GetItemIndex(Globals.Instance.Settings.DisplayMode); 17 | } 18 | 19 | 20 | // Signal functions 21 | private async void ResetSettingsPressed() 22 | { 23 | var confirm = await Tools.Instance.ConfirmationPopup(); 24 | if (confirm != true) 25 | { 26 | return; 27 | } 28 | Globals.Instance.Settings = new SettingsResource(); 29 | Globals.Instance.SetDefaultPaths(); 30 | } 31 | 32 | 33 | private async void ResetInstalledModsPressed() 34 | { 35 | var confirm = await Tools.Instance.ConfirmationPopup(); 36 | if (confirm != true) 37 | { 38 | return; 39 | } 40 | _modManager.ResetInstalled(); 41 | } 42 | 43 | 44 | private void GithubTokenEntered(string token) 45 | { 46 | Globals.Instance.Settings.GithubApiToken = token; 47 | Globals.Instance.SaveManager.WriteSave(); 48 | Globals.Instance.AuthenticateGithubClient(); 49 | _githubTokenLineEdit.Text = "Success!"; 50 | } 51 | 52 | 53 | private void GetCompatibleToggled(bool getCompatible) 54 | { 55 | Globals.Instance.Settings.GetCompatibleVersions = getCompatible; 56 | Globals.Instance.SaveManager.WriteSave(); 57 | } 58 | 59 | 60 | private void SetDisplayMode(int modeSelected) 61 | { 62 | var displayMode = _displayModeButton.GetItemId(modeSelected); 63 | DisplayServer.WindowSetMode((DisplayServer.WindowMode)displayMode); 64 | Globals.Instance.Settings.DisplayMode = displayMode; 65 | Globals.Instance.SaveManager.WriteSave(); 66 | } 67 | } 68 | 69 | -------------------------------------------------------------------------------- /Scripts/SettingsResource.cs: -------------------------------------------------------------------------------- 1 | using Godot; 2 | using Godot.Collections; 3 | using YuzuToolbox.Scripts.Modes; 4 | 5 | 6 | public partial class SettingsResource : Resource 7 | { 8 | [Export] public string SaveDirectory; 9 | [Export] public string ExecutablePath; 10 | [Export] public string FromSaveDirectory; 11 | [Export] public string ToSaveDirectory; 12 | [Export] public string ModsLocation; 13 | [Export] public int InstalledVersion = -1; 14 | [Export] public bool LightModeEnabled; 15 | [Export] public string AppMode = "Ryujinx"; 16 | [Export] public bool Muted = true; 17 | [Export] public string AppDataPath; 18 | [Export] public string GithubApiToken; 19 | [Export] public bool GetCompatibleVersions; 20 | [Export] public int DisplayMode; 21 | [Export] public bool LauncherMode; 22 | } 23 | -------------------------------------------------------------------------------- /Scripts/Sources/BananaManager.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Threading.Tasks; 4 | using Godot; 5 | using Newtonsoft.Json.Linq; 6 | using HttpClient = System.Net.Http.HttpClient; 7 | 8 | public class BananaManager 9 | { 10 | private readonly HttpClient _httpClient = new(); 11 | 12 | 13 | public async Task>> GetAvailableMods(Dictionary> modList, Dictionary installedGames, string gameId, int sourceId, int page = 1) 14 | { 15 | if (!modList.ContainsKey(gameId)) 16 | { 17 | modList[gameId] = new List(); 18 | } 19 | 20 | int bananaGameId = GetGameBananaGameId(installedGames[gameId].GameName); 21 | if (bananaGameId == -1) 22 | { 23 | return null; 24 | } 25 | 26 | var gameModsSource = await _httpClient 27 | .GetAsync($@"https://gamebanana.com/apiv11/Game/{bananaGameId}/Subfeed?_nPage={page}"); 28 | var jsonMods = JObject.Parse(await gameModsSource.Content.ReadAsStringAsync()); 29 | 30 | 31 | foreach (var mod in jsonMods["_aRecords"]) 32 | { 33 | string modPage = _httpClient.GetAsync($@"https://gamebanana.com/apiv11/Mod/{mod["_idRow"]}/Files").Result.Content.ReadAsStringAsync().Result; 34 | var modPageContent = JToken.Parse(modPage); 35 | string downloadUrl = modPageContent[0]["_sDownloadUrl"].ToString(); 36 | 37 | // If there is an available compatible version sets it as that, otherwises sets it as NA 38 | List compatibleVersions = mod["_sVersion"] == null 39 | ? new List() { "NA" } 40 | : new List() { mod["_sVersion"].ToString() }; 41 | 42 | modList[gameId].Add(new Mod 43 | { 44 | ModName = mod["_sName"].ToString(), 45 | ModUrl = downloadUrl, 46 | CompatibleVersions = compatibleVersions, 47 | Source = sourceId, 48 | InstalledPath = null 49 | }); 50 | } 51 | 52 | return modList; 53 | } 54 | 55 | 56 | private int GetGameBananaGameId(string gameName) 57 | { 58 | // Searches for the game ID using the name from banana mods 59 | string searchContent = _httpClient.GetAsync("https://gamebanana.com/apiv11/Util/Game/NameMatch?_sName=" + gameName).Result.Content.ReadAsStringAsync().Result; 60 | 61 | var jsonContent = JObject.Parse($@"{searchContent}"); 62 | var modId = jsonContent["_aRecords"]?[0]?["_idRow"]!.ToString(); 63 | 64 | // If the return is null replace with our version (-1) 65 | int returnValue = modId == null ? -1 : int.Parse(modId); 66 | return returnValue; 67 | } 68 | } -------------------------------------------------------------------------------- /Scripts/Sources/Mod.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | public class Mod 5 | { 6 | public string ModName { get; set; } 7 | public string ModUrl { get; set; } 8 | public List CompatibleVersions { get; set; } 9 | public int Source { get; set; } = -1; 10 | public string InstalledPath { get; set; } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /Scripts/Sources/OfficialManager.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Threading.Tasks; 4 | using Godot; 5 | using HtmlAgilityPack; 6 | using HttpClient = System.Net.Http.HttpClient; 7 | 8 | public class OfficialManager 9 | { 10 | private const string Quote = "\""; 11 | private readonly HttpClient _httpClient = new(); 12 | 13 | 14 | public async Task>> GetAvailableMods(Dictionary> modList, Dictionary installedGames, string gameId, int sourceId) 15 | { 16 | if (!modList.ContainsKey(gameId)) 17 | { 18 | modList[gameId] = new List(); 19 | } 20 | 21 | var modsSourcePageResponse = await _httpClient.GetAsync("https://github.com/yuzu-emu/yuzu/wiki/Switch-Mods"); 22 | var modsSourcePage = new HtmlDocument(); 23 | modsSourcePage.LoadHtml(await modsSourcePageResponse.Content.ReadAsStringAsync()); 24 | 25 | // List of elements, which MOSTLY contain mods (not all) 26 | var mods = modsSourcePage.DocumentNode.SelectNodes( 27 | $@"//h3[contains(., {Quote}{installedGames[gameId].GameName}{Quote})]/following::table[1]//td//a"); 28 | 29 | // Throws an exception if the mods list is null 30 | _ = mods ?? throw new ArgumentException($@"No mods available"); 31 | 32 | // Starts at an offset to account for the first example item in the site list 33 | int titleIndex = 1; 34 | // Loops through each element in the list of mostly mods 35 | foreach (var mod in mods) 36 | { 37 | string downloadUrl = mod.GetAttributeValue("href", null).Trim(); 38 | string modName = mod.InnerText; 39 | ; 40 | // Checks if the item is a mod by ensuring it ends with a usable extension 41 | if (downloadUrl.EndsWith(".rar") || downloadUrl.EndsWith(".zip") || downloadUrl.EndsWith(".7z")) 42 | { 43 | var modVersions = modsSourcePage.DocumentNode.SelectNodes( 44 | $@"//h3[contains(., {Quote}{installedGames[gameId].GameName}{Quote})]/following::table[1]//tr[{titleIndex}]/td//code"); 45 | List versions = new List(); 46 | foreach (var version in modVersions) 47 | { 48 | versions.Add(version.InnerText); 49 | } 50 | titleIndex++; 51 | modList[gameId].Add(new Mod 52 | { 53 | ModName = modName, 54 | ModUrl = downloadUrl, 55 | CompatibleVersions = versions, 56 | Source = sourceId, 57 | InstalledPath = null 58 | }); 59 | } 60 | } 61 | 62 | return modList; 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /Scripts/Sources/TotkHoloManager.cs: -------------------------------------------------------------------------------- 1 | using System.IO; 2 | using System.Linq; 3 | using System; 4 | using System.Collections.Generic; 5 | using System.Threading.Tasks; 6 | using Octokit; 7 | using HttpClient = System.Net.Http.HttpClient; 8 | 9 | namespace YuzuEAUpdateManager.Scripts.Sources; 10 | 11 | 12 | 13 | public class TotkHoloManager 14 | { 15 | private const string RepoOwner = "HolographicWings"; 16 | private const string RepoName = "TOTK-Mods-collection"; 17 | 18 | public Dictionary> InstalledMods; 19 | public Dictionary> SelectedSourceMods; 20 | 21 | private GitHubClient _gitHubClient; 22 | private readonly HttpClient _httpClient = new(); 23 | 24 | 25 | public async Task>> GetAvailableMods(Dictionary> modList, 26 | string gameId, int sourceId, bool getCompatibleVersions = false) 27 | { 28 | try 29 | { 30 | _gitHubClient = Globals.Instance.LocalGithubClient; 31 | if (!modList.ContainsKey(gameId)) 32 | { 33 | modList[gameId] = new List(); 34 | } 35 | 36 | var contentPath = "Mods"; 37 | var modContents = await _gitHubClient.Repository.Content.GetAllContents(RepoOwner, RepoName, contentPath); 38 | 39 | _ = modContents ?? throw new ArgumentException("Failed to retrieve mods for", gameId); 40 | 41 | 42 | foreach (var modType in modContents) 43 | { 44 | if (modType.Type == ContentType.Dir) 45 | { 46 | var mods = await _gitHubClient.Repository.Content.GetAllContents(RepoOwner, RepoName, modType.Path); 47 | foreach (var mod in mods) 48 | { 49 | if (mod.Type == ContentType.Dir) 50 | { 51 | // Gets the compatible versions 52 | var compatibleVersions = new List { "NA" }; 53 | if (getCompatibleVersions) 54 | { 55 | try 56 | { 57 | compatibleVersions = await GetCompatibleVersions(mod); 58 | } 59 | catch (Exception getCompatibleVersionsException) 60 | { 61 | getCompatibleVersions = false; 62 | Tools.Instance.AddError($@"failed to get compatible versions for totk holo{getCompatibleVersionsException}"); 63 | compatibleVersions = new List { "NA" }; 64 | } 65 | } 66 | 67 | var modToAdd = new Mod 68 | { 69 | ModName = mod.Name, 70 | ModUrl = mod.Path, 71 | CompatibleVersions = compatibleVersions, 72 | Source = sourceId 73 | }; 74 | modList[gameId].Add(modToAdd); 75 | } 76 | } 77 | } 78 | } 79 | } 80 | catch (RateLimitExceededException) 81 | { 82 | throw new ArgumentException("Github API limited exceeded. Please try again later or add an API key in settings"); 83 | } 84 | 85 | return modList; 86 | } 87 | 88 | 89 | public async Task InstallMod(string gameId, Mod mod) 90 | { 91 | try 92 | { 93 | await Task.Run(async() => 94 | { 95 | string installPath = Path 96 | .Join(Globals.Instance.Settings.ModsLocation, gameId, $@"Managed{mod.ModName.Replace(":", ".")}"); 97 | 98 | var exception = await Tools.Instance.DownloadFolder(RepoOwner, RepoName, mod.ModUrl, installPath); 99 | if (exception != null) 100 | { 101 | Tools.Instance.AddError($@"failed to download: {mod.ModName}. Exception: {exception}"); 102 | return; 103 | } 104 | 105 | mod.InstalledPath = installPath; 106 | InstalledMods[gameId] = !InstalledMods.ContainsKey(gameId) 107 | ? new List() 108 | : InstalledMods[gameId]; 109 | 110 | InstalledMods[gameId].Add(mod); 111 | SelectedSourceMods[gameId].Remove(mod); 112 | }); 113 | } 114 | catch (Exception installError) 115 | { 116 | Tools.Instance.AddError($@"failed to install mod:{installError}"); 117 | } 118 | } 119 | 120 | 121 | // Helper functions 122 | private async Task> GetCompatibleVersions(RepositoryContent mod) 123 | { 124 | var modFiles = await _gitHubClient.Repository.Content.GetAllContents(RepoOwner, RepoName, mod.Path); 125 | List compatibleVersions = new(); 126 | 127 | foreach (var file in modFiles) 128 | { 129 | if (file.Type == ContentType.File && file.Name == "Compatible versions.txt") 130 | { 131 | var compatibleVersionsResponse = await _httpClient.GetAsync(file.DownloadUrl); 132 | var compatibleVersionsString = await compatibleVersionsResponse.Content.ReadAsStringAsync(); 133 | var compatibleVersionsList = compatibleVersionsString.Split("\n", StringSplitOptions.RemoveEmptyEntries) 134 | .Skip(1) // Skip the first line (mod type) 135 | .ToList(); 136 | 137 | // If it supports all versions, replace the list with "All" 138 | if (compatibleVersionsList.TrueForAll(versionText => versionText.Contains("Yes"))) 139 | { 140 | compatibleVersionsList = new List() { "All" }; 141 | } 142 | else 143 | { 144 | compatibleVersionsList = compatibleVersionsList 145 | .Select(line => line.Split(":").First().Trim()) 146 | .ToList(); 147 | } 148 | 149 | compatibleVersions.AddRange(compatibleVersionsList); 150 | return compatibleVersions; 151 | } 152 | } 153 | 154 | return new List { "NA" }; 155 | } 156 | } -------------------------------------------------------------------------------- /Scripts/StandardModManagement.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Text.Json; 5 | using System.Threading.Tasks; 6 | using Godot; 7 | using SharpCompress.Archives; 8 | using SharpCompress.Common; 9 | 10 | 11 | public partial class StandardModManagement : Node 12 | { 13 | public Dictionary> InstalledMods; 14 | public Dictionary> SelectedSourceMods; 15 | 16 | public HttpRequest DownloadRequester; 17 | public Timer DownloadUpdateTimer; 18 | 19 | 20 | public async Task InstallMod(string gameId, Mod mod) 21 | { 22 | try 23 | { 24 | await Task.Run(async () => 25 | { 26 | // TODO #65 27 | GodotThread.SetThreadSafetyChecksEnabled(false); 28 | 29 | string downloadPath = Path 30 | .Join(Globals.Instance.Settings.ModsLocation, gameId, $@"{mod.ModName.Replace(":", ".")}-Download"); 31 | string installPath = Path 32 | .Join(Globals.Instance.Settings.ModsLocation, gameId, $@"Managed{mod.ModName.Replace(":", ".")}"); 33 | 34 | // Downloads the mod zip to the download path 35 | DownloadRequester.DownloadFile = downloadPath; 36 | DownloadRequester.Request(mod.ModUrl); 37 | DownloadUpdateTimer.Start(); 38 | await ToSignal(DownloadRequester, "request_completed"); 39 | DownloadUpdateTimer.Stop(); 40 | 41 | await using (var stream = File.OpenRead(downloadPath)) 42 | { 43 | var reader = ArchiveFactory.Open(stream); 44 | 45 | Directory.CreateDirectory(installPath + "-temp"); 46 | 47 | foreach (var entry in reader.Entries) 48 | { 49 | if (!entry.IsDirectory) 50 | { 51 | entry.WriteToDirectory(installPath + "-temp", new ExtractionOptions() 52 | { 53 | ExtractFullPath = true, 54 | Overwrite = true 55 | }); 56 | } 57 | } 58 | } 59 | 60 | if (Directory.Exists(installPath)) 61 | { 62 | Tools.DeleteDirectoryContents(installPath); 63 | } 64 | // Moves the files from the temp folder into the install path 65 | foreach (var folder in Directory.GetDirectories(installPath + "-temp")) 66 | { 67 | Tools.MoveFilesAndDirs(folder, installPath); 68 | } 69 | 70 | // Cleanup 71 | Directory.Delete(installPath + "-temp", true); 72 | File.Delete(downloadPath); 73 | 74 | // Sets the installed path and initializes the installed mods list for the given game if needed 75 | mod.InstalledPath = installPath; 76 | InstalledMods[gameId] = !InstalledMods.ContainsKey(gameId) 77 | ? new List() 78 | : InstalledMods[gameId]; 79 | 80 | InstalledMods[gameId].Add(mod); 81 | SelectedSourceMods[gameId].Remove(mod); 82 | }); 83 | } 84 | catch (Exception installError) 85 | { 86 | Tools.Instance.AddError($@"failed to install mod:{installError}"); 87 | throw; 88 | } 89 | 90 | return true; 91 | } 92 | 93 | 94 | public async Task DeleteMod(string gameId, Mod mod, int source, int sourcesAll, bool noConfirmation = false) 95 | { 96 | try 97 | { 98 | if (!noConfirmation) 99 | { 100 | var confirm = await Tools.Instance.ConfirmationPopup($@"Delete {mod.ModName}?"); 101 | if (confirm == false) 102 | { 103 | return false; 104 | } 105 | } 106 | 107 | InstalledMods[gameId].Remove(mod); 108 | 109 | // If the mod is available online re-adds it to the source list 110 | if (mod.ModUrl != null && source == mod.Source || source == sourcesAll) 111 | { 112 | // If there is no mod list for the game id creates one 113 | SelectedSourceMods[gameId] = 114 | !SelectedSourceMods.ContainsKey(gameId) ? new List() : SelectedSourceMods[gameId]; 115 | SelectedSourceMods[gameId].Add(mod); 116 | } 117 | 118 | // Deletes directory contents, then the directory itself. 119 | Tools.DeleteDirectoryContents(mod.InstalledPath); 120 | Directory.Delete(mod.InstalledPath, true); 121 | } 122 | catch (Exception removeError) 123 | { 124 | Tools.Instance.AddError("failed to remove mod:" + removeError); 125 | return false; 126 | } 127 | 128 | return true; 129 | } 130 | } -------------------------------------------------------------------------------- /Scripts/Tools.cs: -------------------------------------------------------------------------------- 1 | using Godot; 2 | using System; 3 | using System.IO; 4 | using System.Diagnostics; 5 | using System.Threading.Tasks; 6 | using ContentType = Octokit.ContentType; 7 | using HttpClient = System.Net.Http.HttpClient; 8 | 9 | public partial class Tools : Node 10 | { 11 | [Export()] private Control _errorConsoleContainer; 12 | [Export] private TextEdit _errorConsole; 13 | [Export] private RichTextLabel _errorNotifier; 14 | [Export] private PopupMenu _confirmationPopup; 15 | 16 | public static Tools Instance; 17 | 18 | // Internal variables 19 | private bool? _confirmationChoice; 20 | 21 | 22 | // Godot functions 23 | public override void _Ready() 24 | { 25 | Instance = this; 26 | } 27 | 28 | 29 | public override void _Input(InputEvent @event) 30 | { 31 | if (@event.IsActionPressed("OpenConsole")) 32 | { 33 | ToggleConsole(); 34 | } 35 | } 36 | 37 | 38 | // General functions 39 | public void LaunchYuzu() 40 | { 41 | string executablePath = Globals.Instance.Settings.ExecutablePath; 42 | 43 | try 44 | { 45 | ProcessStartInfo yuzuProcessInfo = new(executablePath); 46 | 47 | Process yuzuProcess = Process.Start(yuzuProcessInfo); 48 | GetTree().Quit(); 49 | } 50 | catch (Exception launchException) 51 | { 52 | AddError("Unable to launch Yuzu: " + launchException.Message); 53 | } 54 | } 55 | 56 | 57 | // Bit math I don't understand to convert to and from an int for indexing 58 | public static int ToInt(string version) 59 | { 60 | // Override of sorts so this function can be used on both ints and strings 61 | if (int.TryParse(version, out _)) 62 | { 63 | return version.ToInt(); 64 | } 65 | 66 | string[] versionParts = version.Split('.'); 67 | int major = int.Parse(versionParts[0]); 68 | int minor = int.Parse(versionParts[1]); 69 | int build = int.Parse(versionParts[2]); 70 | return (major << 22) | (minor << 12) | build; 71 | } 72 | 73 | 74 | public static string FromInt(int version) 75 | { 76 | int major = (version >> 22) & 0x3FF; 77 | int minor = (version >> 12) & 0x3FF; 78 | int build = version & 0xFFF; 79 | return @$"{major}.{minor}.{build}"; 80 | } 81 | 82 | 83 | private void ToggleConsole() 84 | { 85 | _errorConsoleContainer.Visible = !_errorConsoleContainer.Visible; 86 | } 87 | 88 | 89 | public async Task ConfirmationPopup(string titleText = "Are you sure?") 90 | { 91 | // Checks if the confirmationPopup is already connected to the ConfirmationPressed signal, if not, connect it. 92 | if (!_confirmationPopup.IsConnected("index_pressed", new Callable(this, nameof(ConfirmationPressed)))) 93 | { 94 | _confirmationPopup.Connect("index_pressed", new Callable(this, nameof(ConfirmationPressed))); 95 | } 96 | 97 | _confirmationPopup.Title = titleText; 98 | _confirmationPopup.PopupCentered(); 99 | await ToSignal(_confirmationPopup, "index_pressed"); 100 | return _confirmationChoice; 101 | } 102 | 103 | public bool ClearInstallationFolder(string saveDirectory) 104 | { 105 | bool clearedSuccessfully = DeleteDirectoryContents(saveDirectory); 106 | return clearedSuccessfully; 107 | } 108 | 109 | public static bool DeleteDirectoryContents(string directoryPath) 110 | { 111 | // Delete all files within the directory 112 | string[] files = Directory.GetFiles(directoryPath); 113 | foreach (string file in files) 114 | { 115 | File.Delete(file); 116 | } 117 | 118 | // Delete all subdirectories within the directory 119 | string[] directories = Directory.GetDirectories(directoryPath); 120 | foreach (string directory in directories) 121 | { 122 | // Recursively delete subdirectory contents 123 | DeleteDirectoryContents(directory); 124 | Directory.Delete(directory); 125 | } 126 | 127 | return true; 128 | } 129 | 130 | 131 | public static void MoveFilesAndDirs(string sourceDirectory, string targetDirectory) 132 | { 133 | // Create the target directory if it doesn't exist 134 | if (!Directory.Exists(targetDirectory) && !string.IsNullOrEmpty(targetDirectory)) 135 | { 136 | Directory.CreateDirectory(targetDirectory); 137 | } 138 | 139 | // Get all files and directories from the source directory 140 | string[] files = Directory.GetFiles(sourceDirectory); 141 | string[] directories = Directory.GetDirectories(sourceDirectory); 142 | 143 | // Move files to the target directory 144 | foreach (string file in files) 145 | { 146 | string fileName = Path.GetFileName(file); 147 | string targetPath = Path.Combine(targetDirectory, fileName); 148 | File.Move(file, targetPath, true); 149 | } 150 | 151 | // Move directories to the target directory 152 | foreach (string directory in directories) 153 | { 154 | string directoryName = Path.GetFileName(directory); 155 | string targetPath = Path.Combine(targetDirectory, directoryName); 156 | if (!Directory.Exists(targetPath)) 157 | { 158 | Directory.Move(directory, targetPath); 159 | } 160 | } 161 | 162 | // Remove the source directory if it is empty 163 | if (Directory.GetFiles(sourceDirectory).Length == 0 && Directory.GetDirectories(sourceDirectory).Length == 0) 164 | { 165 | Directory.Delete(sourceDirectory); 166 | } 167 | } 168 | 169 | 170 | public void DuplicateDirectoryContents(string sourceDir, string destinationDir, bool overwriteFiles) 171 | { 172 | // Get all directories in the source directory 173 | string[] allDirectories = Directory.GetDirectories(sourceDir, "*", SearchOption.AllDirectories); 174 | 175 | foreach (string dir in allDirectories) 176 | { 177 | string dirToCreate = dir.Replace(sourceDir, destinationDir); 178 | Directory.CreateDirectory(dirToCreate); 179 | } 180 | 181 | // Get all files in the source directory 182 | string[] allFiles = Directory.GetFiles(sourceDir, "*.*", SearchOption.AllDirectories); 183 | 184 | foreach (string filePath in allFiles) 185 | { 186 | string newFilePath = filePath.Replace(sourceDir, destinationDir); 187 | File.Copy(filePath, newFilePath, overwriteFiles); 188 | } 189 | } 190 | 191 | 192 | public async void AddError(String error) 193 | { 194 | Callable.From(() => 195 | { 196 | _errorConsole.Text += $"\n [{DateTime.Now:h:mm:ss}] {error}"; 197 | _errorNotifier.Visible = true; 198 | }).CallDeferred(); 199 | 200 | await Task.Run(async () => 201 | { 202 | await ToSignal(GetTree().CreateTimer(5), "timeout"); 203 | _errorNotifier.SetThreadSafe("visible", false); 204 | }); 205 | 206 | } 207 | 208 | 209 | // Signal functions 210 | private void ConfirmationPressed(long itemIndex) 211 | { 212 | _confirmationChoice = itemIndex == 0; 213 | } 214 | 215 | 216 | public async Task DownloadFolder(string owner, string repo, string folderPath, string destinationPath) 217 | { 218 | try 219 | { 220 | HttpClient httpClient = new(); 221 | var gitHubClient = Globals.Instance.LocalGithubClient; 222 | 223 | // Retrieve the repository content for the specified folder 224 | var contents = await gitHubClient.Repository.Content.GetAllContents(owner, repo, folderPath); 225 | 226 | // Create the destination folder 227 | Directory.CreateDirectory(destinationPath); 228 | 229 | // Download and copy each file in the folder 230 | foreach (var content in contents) 231 | { 232 | if (content.Type == ContentType.File) 233 | { 234 | var fileContent = await httpClient.GetStringAsync(content.DownloadUrl); 235 | var filePath = Path.Combine(destinationPath, content.Name); 236 | 237 | // Write the file content to disk 238 | await File.WriteAllTextAsync(filePath, fileContent); 239 | } 240 | else if (content.Type == ContentType.Dir) 241 | { 242 | var subFolderPath = Path.Combine(destinationPath, content.Name); 243 | 244 | // Recursively download and copy the contents of sub-folders 245 | await DownloadFolder(owner, repo, content.Path, subFolderPath); 246 | } 247 | } 248 | 249 | return null; 250 | } 251 | catch (Exception downloadException) 252 | { 253 | return downloadException; 254 | } 255 | } 256 | } 257 | -------------------------------------------------------------------------------- /Scripts/ToolsPage.cs: -------------------------------------------------------------------------------- 1 | using Godot; 2 | using System; 3 | using NativeFileDialogSharp; 4 | 5 | public partial class ToolsPage : Control 6 | { 7 | [ExportGroup("Tools")] 8 | [Export()] private Button _clearInstallFolderButton; 9 | [Export()] private Button _backupSavesButton; 10 | [Export()] private Button _restoreSavesButton; 11 | [Export()] private Button _fromSaveDirectoryButton; 12 | [Export()] private Button _toSaveDirectoryButton; 13 | 14 | private string _osUsed = OS.GetName(); 15 | 16 | 17 | // Godot Functions 18 | private void Initiate() 19 | { 20 | _fromSaveDirectoryButton.Text = Globals.Instance.Settings.FromSaveDirectory; 21 | _toSaveDirectoryButton.Text = Globals.Instance.Settings.ToSaveDirectory; 22 | } 23 | 24 | 25 | // Signal functions 26 | private async void ClearInstallFolderButtonPressed() 27 | { 28 | var confirm = await Tools.Instance.ConfirmationPopup(); 29 | if (confirm == false) 30 | { 31 | return; 32 | } 33 | 34 | // Clears the install folder, if failed notifies user 35 | if (!Tools.Instance.ClearInstallationFolder(Globals.Instance.Settings.SaveDirectory)) 36 | { 37 | Tools.Instance.AddError("failed to clear installation folder"); 38 | _clearInstallFolderButton.Text = "Clear failed!"; 39 | } 40 | else 41 | { 42 | _clearInstallFolderButton.Text = "Cleared successfully!"; 43 | } 44 | } 45 | 46 | 47 | private void OnBackupSavesButtonPressed() 48 | { 49 | try 50 | { 51 | Tools.Instance.DuplicateDirectoryContents(Globals.Instance.Settings.FromSaveDirectory, Globals.Instance.Settings.ToSaveDirectory, true); 52 | _backupSavesButton.Text = "Backup successful!"; 53 | } 54 | catch (Exception backupError) 55 | { 56 | Tools.Instance.AddError("failed to create save backup exception:" + backupError); 57 | throw; 58 | } 59 | 60 | } 61 | 62 | 63 | private void OnRestoreSavesPressed() 64 | { 65 | try 66 | { 67 | Tools.Instance.DuplicateDirectoryContents(Globals.Instance.Settings.ToSaveDirectory, Globals.Instance.Settings.FromSaveDirectory, true); 68 | _restoreSavesButton.Text = "Saves restored successfully!"; 69 | } 70 | catch (Exception restoreError) 71 | { 72 | Tools.Instance.AddError("failed to restore saves, exception: " + restoreError); 73 | throw; 74 | } 75 | } 76 | 77 | 78 | private void OnFromSaveDirectoryButtonPressed() 79 | { 80 | var fromSaveDirectoryInput = Dialog.FolderPicker(Globals.Instance.Settings.FromSaveDirectory).Path; 81 | if (fromSaveDirectoryInput != null) 82 | { 83 | Globals.Instance.Settings.FromSaveDirectory = fromSaveDirectoryInput; 84 | } 85 | 86 | _fromSaveDirectoryButton.Text = Globals.Instance.Settings.FromSaveDirectory; 87 | Globals.Instance.SaveManager.WriteSave(Globals.Instance.Settings); 88 | } 89 | 90 | private void OnToSaveDirectoryButtonPressed() 91 | { 92 | var toSaveDirectoryInput = Dialog.FolderPicker(Globals.Instance.Settings.ToSaveDirectory).Path; 93 | if (toSaveDirectoryInput != null) 94 | { 95 | Globals.Instance.Settings.ToSaveDirectory = toSaveDirectoryInput; 96 | } 97 | 98 | _toSaveDirectoryButton.Text = Globals.Instance.Settings.ToSaveDirectory; 99 | Globals.Instance.SaveManager.WriteSave(Globals.Instance.Settings); 100 | } 101 | 102 | 103 | } 104 | -------------------------------------------------------------------------------- /Themes/Styleboxes/DarkDisabled.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StyleBoxFlat" format=3 uid="uid://dk7lv0061nr6k"] 2 | 3 | [resource] 4 | bg_color = Color(0.211765, 0.211765, 0.211765, 0.466667) 5 | border_width_left = 3 6 | border_width_top = 3 7 | border_width_right = 3 8 | border_width_bottom = 3 9 | border_color = Color(0.211765, 0.211765, 0.211765, 0.466667) 10 | corner_radius_top_left = 5 11 | corner_radius_top_right = 5 12 | corner_radius_bottom_right = 5 13 | corner_radius_bottom_left = 5 14 | -------------------------------------------------------------------------------- /Themes/Styleboxes/DarkErrorConsole.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StyleBoxFlat" format=3 uid="uid://b8vhqk0btq5dd"] 2 | 3 | [resource] 4 | bg_color = Color(0.184314, 0.184314, 0.184314, 0.682353) 5 | border_width_left = 2 6 | border_width_right = 2 7 | border_width_bottom = 3 8 | border_color = Color(0, 0.764706, 0.890196, 1) 9 | corner_radius_bottom_right = 5 10 | corner_radius_bottom_left = 5 11 | -------------------------------------------------------------------------------- /Themes/Styleboxes/DarkFocus.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StyleBoxFlat" format=3 uid="uid://cp83rblw07yd6"] 2 | 3 | [resource] 4 | bg_color = Color(0.211765, 0.211765, 0.211765, 1) 5 | border_width_left = 3 6 | border_width_top = 3 7 | border_width_right = 3 8 | border_width_bottom = 3 9 | border_color = Color(0, 0.764706, 0.890196, 1) 10 | corner_radius_top_left = 5 11 | corner_radius_top_right = 5 12 | corner_radius_bottom_right = 5 13 | corner_radius_bottom_left = 5 14 | -------------------------------------------------------------------------------- /Themes/Styleboxes/DarkLoadingLoadbar.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StyleBoxFlat" format=3 uid="uid://e4urf7jlgsqv"] 2 | 3 | [resource] 4 | bg_color = Color(0, 0.764706, 0.890196, 1) 5 | corner_radius_top_left = 50 6 | corner_radius_top_right = 50 7 | corner_radius_bottom_right = 50 8 | corner_radius_bottom_left = 50 9 | -------------------------------------------------------------------------------- /Themes/Styleboxes/DarkNormal.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StyleBoxFlat" format=3 uid="uid://c8qvncfium48h"] 2 | 3 | [resource] 4 | bg_color = Color(0.211765, 0.211765, 0.211765, 1) 5 | border_width_left = 3 6 | border_width_top = 3 7 | border_width_right = 3 8 | border_width_bottom = 3 9 | border_color = Color(0.211765, 0.211765, 0.211765, 1) 10 | corner_radius_top_left = 5 11 | corner_radius_top_right = 5 12 | corner_radius_bottom_right = 5 13 | corner_radius_bottom_left = 5 14 | -------------------------------------------------------------------------------- /Themes/Styleboxes/DarkNormalLoadbar.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StyleBoxFlat" format=3 uid="uid://01qtaifotpjh"] 2 | 3 | [resource] 4 | bg_color = Color(0.211765, 0.211765, 0.211765, 1) 5 | corner_radius_top_left = 50 6 | corner_radius_top_right = 50 7 | corner_radius_bottom_right = 50 8 | corner_radius_bottom_left = 50 9 | -------------------------------------------------------------------------------- /Themes/Styleboxes/DarkPressed.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StyleBoxFlat" format=3 uid="uid://flpqy852m2xt"] 2 | 3 | [resource] 4 | bg_color = Color(0.211765, 0.211765, 0.211765, 1) 5 | border_width_left = 3 6 | border_width_top = 3 7 | border_width_right = 3 8 | border_width_bottom = 3 9 | border_color = Color(0, 0.764706, 0.890196, 1) 10 | corner_radius_top_left = 5 11 | corner_radius_top_right = 5 12 | corner_radius_bottom_right = 5 13 | corner_radius_bottom_left = 5 14 | -------------------------------------------------------------------------------- /Themes/Styleboxes/DarkPrimary.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StyleBoxFlat" format=3 uid="uid://pntrff8ma8r7"] 2 | 3 | [resource] 4 | bg_color = Color(0.254902, 0.270588, 0.282353, 1) 5 | border_width_left = 3 6 | border_width_top = 3 7 | border_width_right = 3 8 | border_width_bottom = 3 9 | border_color = Color(0.211765, 0.211765, 0.211765, 1) 10 | corner_radius_top_left = 5 11 | corner_radius_top_right = 5 12 | corner_radius_bottom_right = 5 13 | corner_radius_bottom_left = 5 14 | -------------------------------------------------------------------------------- /Themes/Styleboxes/DarkTransparent.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StyleBoxFlat" format=3 uid="uid://b6x6lhw2bbxix"] 2 | 3 | [resource] 4 | bg_color = Color(0.6, 0.6, 0.6, 0.054902) 5 | -------------------------------------------------------------------------------- /Themes/Styleboxes/DarkVSeparator.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StyleBoxLine" format=3 uid="uid://tcrn2c2voh4i"] 2 | 3 | [resource] 4 | color = Color(1, 1, 1, 1) 5 | thickness = 2 6 | vertical = true 7 | -------------------------------------------------------------------------------- /Themes/Styleboxes/LightDisabled.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StyleBoxFlat" format=3 uid="uid://cu00el1bpwh3q"] 2 | 3 | [resource] 4 | border_width_left = 3 5 | border_width_top = 3 6 | border_width_right = 3 7 | border_width_bottom = 3 8 | corner_radius_top_left = 5 9 | corner_radius_top_right = 5 10 | corner_radius_bottom_right = 5 11 | corner_radius_bottom_left = 5 12 | -------------------------------------------------------------------------------- /Themes/Styleboxes/LightErrorConsole.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StyleBoxFlat" format=3 uid="uid://c1jbx25ak4li5"] 2 | 3 | [resource] 4 | bg_color = Color(0.592157, 0.592157, 0.592157, 0.654902) 5 | border_width_left = 2 6 | border_width_right = 2 7 | border_width_bottom = 3 8 | border_color = Color(0, 0.764706, 0.890196, 1) 9 | corner_radius_bottom_right = 5 10 | corner_radius_bottom_left = 5 11 | -------------------------------------------------------------------------------- /Themes/Styleboxes/LightFocus.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StyleBoxFlat" format=3 uid="uid://vlr1yex4wojy"] 2 | 3 | [resource] 4 | bg_color = Color(0.866667, 0.85098, 0.847059, 1) 5 | border_width_left = 3 6 | border_width_top = 3 7 | border_width_right = 3 8 | border_width_bottom = 3 9 | border_color = Color(0, 0.764706, 0.890196, 1) 10 | corner_radius_top_left = 5 11 | corner_radius_top_right = 5 12 | corner_radius_bottom_right = 5 13 | corner_radius_bottom_left = 5 14 | -------------------------------------------------------------------------------- /Themes/Styleboxes/LightNormal.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StyleBoxFlat" format=3 uid="uid://blb2snsxt2fi"] 2 | 3 | [resource] 4 | bg_color = Color(0.866667, 0.85098, 0.847059, 1) 5 | border_width_left = 3 6 | border_width_top = 3 7 | border_width_right = 3 8 | border_width_bottom = 3 9 | border_color = Color(0.866667, 0.85098, 0.847059, 1) 10 | corner_radius_top_left = 5 11 | corner_radius_top_right = 5 12 | corner_radius_bottom_right = 5 13 | corner_radius_bottom_left = 5 14 | -------------------------------------------------------------------------------- /Themes/Styleboxes/LightNormalLoadbar.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StyleBoxFlat" format=3 uid="uid://bd534yfoxfc6x"] 2 | 3 | [resource] 4 | bg_color = Color(0.858824, 0.858824, 0.858824, 1) 5 | corner_radius_top_left = 50 6 | corner_radius_top_right = 50 7 | corner_radius_bottom_right = 50 8 | corner_radius_bottom_left = 50 9 | -------------------------------------------------------------------------------- /Themes/Styleboxes/LightPressed.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StyleBoxFlat" format=3 uid="uid://m2m3kghvkcdl"] 2 | 3 | [resource] 4 | bg_color = Color(0.878431, 0.878431, 0.878431, 1) 5 | border_width_left = 3 6 | border_width_top = 3 7 | border_width_right = 3 8 | border_width_bottom = 3 9 | border_color = Color(0, 0.764706, 0.890196, 1) 10 | corner_radius_top_left = 5 11 | corner_radius_top_right = 5 12 | corner_radius_bottom_right = 5 13 | corner_radius_bottom_left = 5 14 | -------------------------------------------------------------------------------- /Themes/Styleboxes/LightVSeparator.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StyleBoxLine" format=3 uid="uid://ct4a4b2lcwimn"] 2 | 3 | [resource] 4 | thickness = 2 5 | vertical = true 6 | -------------------------------------------------------------------------------- /YuzuEAUpdateManager.sln.DotSettings.user: -------------------------------------------------------------------------------- 1 |  2 | True 3 | True 4 | True -------------------------------------------------------------------------------- /YuzuToolbox.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | net6.0 4 | true 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /YuzuToolbox.csproj.old: -------------------------------------------------------------------------------- 1 | 2 | 3 | net6.0 4 | true 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /YuzuToolbox.sln: -------------------------------------------------------------------------------- 1 | Microsoft Visual Studio Solution File, Format Version 12.00 2 | # Visual Studio 2012 3 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "YuzuToolbox", "YuzuToolbox.csproj", "{F491ED9E-92E0-418F-819D-038386BC5137}" 4 | EndProject 5 | Global 6 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 7 | Debug|Any CPU = Debug|Any CPU 8 | ExportDebug|Any CPU = ExportDebug|Any CPU 9 | ExportRelease|Any CPU = ExportRelease|Any CPU 10 | EndGlobalSection 11 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 12 | {F491ED9E-92E0-418F-819D-038386BC5137}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 13 | {F491ED9E-92E0-418F-819D-038386BC5137}.Debug|Any CPU.Build.0 = Debug|Any CPU 14 | {F491ED9E-92E0-418F-819D-038386BC5137}.ExportDebug|Any CPU.ActiveCfg = ExportDebug|Any CPU 15 | {F491ED9E-92E0-418F-819D-038386BC5137}.ExportDebug|Any CPU.Build.0 = ExportDebug|Any CPU 16 | {F491ED9E-92E0-418F-819D-038386BC5137}.ExportRelease|Any CPU.ActiveCfg = ExportRelease|Any CPU 17 | {F491ED9E-92E0-418F-819D-038386BC5137}.ExportRelease|Any CPU.Build.0 = ExportRelease|Any CPU 18 | EndGlobalSection 19 | EndGlobal 20 | -------------------------------------------------------------------------------- /YuzuToolbox.sln.DotSettings.user: -------------------------------------------------------------------------------- 1 |  2 | True -------------------------------------------------------------------------------- /default_bus_layout.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="AudioBusLayout" format=3 uid="uid://q3rcg5wk6fja"] 2 | 3 | [resource] 4 | bus/0/mute = true 5 | -------------------------------------------------------------------------------- /export_presets.cfg: -------------------------------------------------------------------------------- 1 | [preset.0] 2 | 3 | name="Windows Desktop" 4 | platform="Windows Desktop" 5 | runnable=true 6 | dedicated_server=false 7 | custom_features="" 8 | export_filter="all_resources" 9 | include_filter="" 10 | exclude_filter="" 11 | export_path="Releases/Windows/Windows-YuzuToolbox.exe" 12 | encryption_include_filters="" 13 | encryption_exclude_filters="" 14 | encrypt_pck=false 15 | encrypt_directory=false 16 | 17 | [preset.0.options] 18 | 19 | custom_template/debug="" 20 | custom_template/release="" 21 | debug/export_console_wrapper=1 22 | binary_format/embed_pck=true 23 | texture_format/bptc=true 24 | texture_format/s3tc=true 25 | texture_format/etc=false 26 | texture_format/etc2=false 27 | binary_format/architecture="x86_64" 28 | codesign/enable=false 29 | codesign/timestamp=true 30 | codesign/timestamp_server_url="" 31 | codesign/digest_algorithm=1 32 | codesign/description="" 33 | codesign/custom_options=PackedStringArray() 34 | application/modify_resources=false 35 | application/icon="" 36 | application/console_wrapper_icon="" 37 | application/icon_interpolation=4 38 | application/file_version="" 39 | application/product_version="" 40 | application/company_name="" 41 | application/product_name="" 42 | application/file_description="" 43 | application/copyright="" 44 | application/trademarks="" 45 | ssh_remote_deploy/enabled=false 46 | ssh_remote_deploy/host="user@host_ip" 47 | ssh_remote_deploy/port="22" 48 | ssh_remote_deploy/extra_args_ssh="" 49 | ssh_remote_deploy/extra_args_scp="" 50 | ssh_remote_deploy/run_script="Expand-Archive -LiteralPath '{temp_dir}\\{archive_name}' -DestinationPath '{temp_dir}' 51 | $action = New-ScheduledTaskAction -Execute '{temp_dir}\\{exe_name}' -Argument '{cmd_args}' 52 | $trigger = New-ScheduledTaskTrigger -Once -At 00:00 53 | $settings = New-ScheduledTaskSettingsSet 54 | $task = New-ScheduledTask -Action $action -Trigger $trigger -Settings $settings 55 | Register-ScheduledTask godot_remote_debug -InputObject $task -Force:$true 56 | Start-ScheduledTask -TaskName godot_remote_debug 57 | while (Get-ScheduledTask -TaskName godot_remote_debug | ? State -eq running) { Start-Sleep -Milliseconds 100 } 58 | Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue" 59 | ssh_remote_deploy/cleanup_script="Stop-ScheduledTask -TaskName godot_remote_debug -ErrorAction:SilentlyContinue 60 | Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue 61 | Remove-Item -Recurse -Force '{temp_dir}'" 62 | dotnet/include_scripts_content=false 63 | dotnet/include_debug_symbols=true 64 | debug/export_console_script=1 65 | 66 | [preset.1] 67 | 68 | name="Linux/X11" 69 | platform="Linux/X11" 70 | runnable=true 71 | dedicated_server=false 72 | custom_features="" 73 | export_filter="all_resources" 74 | include_filter="" 75 | exclude_filter="" 76 | export_path="Releases/Linux/Linux-YuzuToolbox.x86_64" 77 | encryption_include_filters="" 78 | encryption_exclude_filters="" 79 | encrypt_pck=false 80 | encrypt_directory=false 81 | 82 | [preset.1.options] 83 | 84 | custom_template/debug="" 85 | custom_template/release="" 86 | debug/export_console_wrapper=1 87 | binary_format/embed_pck=true 88 | texture_format/bptc=true 89 | texture_format/s3tc=true 90 | texture_format/etc=false 91 | texture_format/etc2=false 92 | binary_format/architecture="x86_64" 93 | ssh_remote_deploy/enabled=false 94 | ssh_remote_deploy/host="user@host_ip" 95 | ssh_remote_deploy/port="22" 96 | ssh_remote_deploy/extra_args_ssh="" 97 | ssh_remote_deploy/extra_args_scp="" 98 | ssh_remote_deploy/run_script="#!/usr/bin/env bash 99 | export DISPLAY=:0 100 | unzip -o -q \"{temp_dir}/{archive_name}\" -d \"{temp_dir}\" 101 | \"{temp_dir}/{exe_name}\" {cmd_args}" 102 | ssh_remote_deploy/cleanup_script="#!/usr/bin/env bash 103 | kill $(pgrep -x -f \"{temp_dir}/{exe_name} {cmd_args}\") 104 | rm -rf \"{temp_dir}\"" 105 | dotnet/include_scripts_content=false 106 | dotnet/include_debug_symbols=true 107 | debug/export_console_script=1 108 | -------------------------------------------------------------------------------- /project.godot: -------------------------------------------------------------------------------- 1 | ; Engine configuration file. 2 | ; It's best edited using the editor UI and not directly, 3 | ; since the parameters that go here are not all obvious. 4 | ; 5 | ; Format: 6 | ; [section] ; section goes between [] 7 | ; param=value ; assign values to parameters 8 | 9 | config_version=5 10 | 11 | [application] 12 | 13 | config/name="YuzuToolbox" 14 | run/main_scene="res://Scenes/Home.tscn" 15 | config/features=PackedStringArray("4.2", "C#", "Forward Plus") 16 | boot_splash/bg_color=Color(0.0431373, 0.0470588, 0.0509804, 1) 17 | boot_splash/image="res://ImageAssets/SplashScreen.png" 18 | boot_splash/fullsize=false 19 | config/icon="res://ImageAssets/Icon.svg" 20 | boot_splash/minimum_display_time=3000 21 | 22 | [display] 23 | 24 | window/size/viewport_width=1920 25 | window/size/viewport_height=1080 26 | window/size/extend_to_title=true 27 | 28 | [dotnet] 29 | 30 | project/assembly_name="YuzuToolbox" 31 | 32 | [input] 33 | 34 | OpenConsole={ 35 | "deadzone": 0.5, 36 | "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194306,"key_label":0,"unicode":0,"echo":false,"script":null) 37 | ] 38 | } 39 | 40 | [rendering] 41 | 42 | driver/threads/thread_model=0 43 | -------------------------------------------------------------------------------- /test.x86_64: -------------------------------------------------------------------------------- 1 | 2 | --------------------------------------------------------------------------------