├── .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 |
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 |
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 | [](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 | 
27 | 
28 | 
29 | 
30 | 
31 | 
32 | 
33 | 
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 |
--------------------------------------------------------------------------------