mirror of
https://git.ryujinx.app/ryubing/ryujinx.git
synced 2025-09-14 05:55:43 +00:00
Compare commits
5 Commits
experiment
...
Canary-1.3
Author | SHA1 | Date | |
---|---|---|---|
|
47aa2c1513 | ||
|
f3a2f59683 | ||
|
51bcb9e128 | ||
|
dce5f0eb55 | ||
|
f2eb3749f9 |
@@ -55,7 +55,6 @@
|
|||||||
<PackageVersion Include="SkiaSharp" Version="2.88.9" />
|
<PackageVersion Include="SkiaSharp" Version="2.88.9" />
|
||||||
<PackageVersion Include="SkiaSharp.NativeAssets.Linux" Version="2.88.9" />
|
<PackageVersion Include="SkiaSharp.NativeAssets.Linux" Version="2.88.9" />
|
||||||
<PackageVersion Include="SPB" Version="0.0.4-build32" />
|
<PackageVersion Include="SPB" Version="0.0.4-build32" />
|
||||||
<PackageVersion Include="Starscript.Net" Version="1.0.36" />
|
|
||||||
<PackageVersion Include="System.IO.Hashing" Version="9.0.2" />
|
<PackageVersion Include="System.IO.Hashing" Version="9.0.2" />
|
||||||
<PackageVersion Include="System.Management" Version="9.0.2" />
|
<PackageVersion Include="System.Management" Version="9.0.2" />
|
||||||
<PackageVersion Include="UnicornEngine.Unicorn" Version="2.0.2-rc1-fb78016" />
|
<PackageVersion Include="UnicornEngine.Unicorn" Version="2.0.2-rc1-fb78016" />
|
||||||
|
@@ -73,7 +73,6 @@
|
|||||||
<PackageReference Include="Silk.NET.Vulkan.Extensions.EXT" />
|
<PackageReference Include="Silk.NET.Vulkan.Extensions.EXT" />
|
||||||
<PackageReference Include="Silk.NET.Vulkan.Extensions.KHR" />
|
<PackageReference Include="Silk.NET.Vulkan.Extensions.KHR" />
|
||||||
<PackageReference Include="SPB" />
|
<PackageReference Include="SPB" />
|
||||||
<PackageReference Include="Starscript.Net"/>
|
|
||||||
<PackageReference Include="SharpZipLib" />
|
<PackageReference Include="SharpZipLib" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
@@ -14,7 +14,6 @@ using LibHac.Tools.FsSystem.NcaUtils;
|
|||||||
using Ryujinx.Ava.Common.Models;
|
using Ryujinx.Ava.Common.Models;
|
||||||
using Ryujinx.Ava.Systems.Configuration;
|
using Ryujinx.Ava.Systems.Configuration;
|
||||||
using Ryujinx.Ava.Systems.Configuration.System;
|
using Ryujinx.Ava.Systems.Configuration.System;
|
||||||
using Ryujinx.Ava.Systems.Starscript;
|
|
||||||
using Ryujinx.Ava.Utilities;
|
using Ryujinx.Ava.Utilities;
|
||||||
using Ryujinx.Common;
|
using Ryujinx.Common;
|
||||||
using Ryujinx.Common.Configuration;
|
using Ryujinx.Common.Configuration;
|
||||||
@@ -26,7 +25,6 @@ using Ryujinx.HLE.HOS.SystemState;
|
|||||||
using Ryujinx.HLE.Loaders.Npdm;
|
using Ryujinx.HLE.Loaders.Npdm;
|
||||||
using Ryujinx.HLE.Loaders.Processes.Extensions;
|
using Ryujinx.HLE.Loaders.Processes.Extensions;
|
||||||
using Ryujinx.HLE.Utilities;
|
using Ryujinx.HLE.Utilities;
|
||||||
using Starscript;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
@@ -43,7 +41,7 @@ using TimeSpan = System.TimeSpan;
|
|||||||
|
|
||||||
namespace Ryujinx.Ava.Systems.AppLibrary
|
namespace Ryujinx.Ava.Systems.AppLibrary
|
||||||
{
|
{
|
||||||
public class ApplicationLibrary : IStarscriptObject
|
public class ApplicationLibrary
|
||||||
{
|
{
|
||||||
public Language DesiredLanguage { get; set; }
|
public Language DesiredLanguage { get; set; }
|
||||||
public event EventHandler<ApplicationCountUpdatedEventArgs> ApplicationCountUpdated;
|
public event EventHandler<ApplicationCountUpdatedEventArgs> ApplicationCountUpdated;
|
||||||
@@ -1613,14 +1611,5 @@ namespace Ryujinx.Ava.Systems.AppLibrary
|
|||||||
ApplicationData newApplication = newApplications.First(it => it.IdBase == appIdBase);
|
ApplicationData newApplication = newApplications.First(it => it.IdBase == appIdBase);
|
||||||
_applications.AddOrUpdate(newApplication);
|
_applications.AddOrUpdate(newApplication);
|
||||||
}
|
}
|
||||||
|
|
||||||
private ValueMap _starscriptMap;
|
|
||||||
|
|
||||||
public ValueMap ToStarscript()
|
|
||||||
{
|
|
||||||
_starscriptMap ??= StarscriptHelper.Wrap(this);
|
|
||||||
|
|
||||||
return _starscriptMap;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,29 +0,0 @@
|
|||||||
using Ryujinx.Ava.Systems.AppLibrary;
|
|
||||||
using Ryujinx.Common;
|
|
||||||
using Starscript;
|
|
||||||
|
|
||||||
namespace Ryujinx.Ava.Systems.Starscript
|
|
||||||
{
|
|
||||||
public static class RyujinxStarscript
|
|
||||||
{
|
|
||||||
public static readonly StarscriptHypervisor Hypervisor = StarscriptHypervisor.Create().WithStandardLibrary(true);
|
|
||||||
|
|
||||||
static RyujinxStarscript()
|
|
||||||
{
|
|
||||||
Hypervisor.Set("ryujinx.releaseChannel",
|
|
||||||
ReleaseInformation.IsCanaryBuild
|
|
||||||
? "Canary"
|
|
||||||
: ReleaseInformation.IsReleaseBuild
|
|
||||||
? "Stable"
|
|
||||||
: "Custom");
|
|
||||||
Hypervisor.Set("ryujinx.version", Program.Version);
|
|
||||||
Hypervisor.Set("appLibrary", RyujinxApp.MainWindow.ApplicationLibrary);
|
|
||||||
Hypervisor.Set("currentApplication", () =>
|
|
||||||
RyujinxApp.MainWindow.ApplicationLibrary.FindApplication(
|
|
||||||
RyujinxApp.MainWindow.ViewModel.AppHost?.ApplicationId ?? 0,
|
|
||||||
out ApplicationData appData)
|
|
||||||
? StarscriptHelper.Wrap(appData)
|
|
||||||
: Value.Null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,68 +0,0 @@
|
|||||||
using Gommon;
|
|
||||||
using Ryujinx.Ava.Systems.AppLibrary;
|
|
||||||
using Starscript;
|
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace Ryujinx.Ava.Systems.Starscript
|
|
||||||
{
|
|
||||||
public static class StarscriptHelper
|
|
||||||
{
|
|
||||||
public static ValueMap Wrap(ApplicationLibrary appLib)
|
|
||||||
{
|
|
||||||
ValueMap lMap = new();
|
|
||||||
lMap.Set("appCount", () => appLib.Applications.Count);
|
|
||||||
lMap.Set("dlcCount", () => appLib.DownloadableContents.Count);
|
|
||||||
lMap.Set("updateCount", () => appLib.TitleUpdates.Count);
|
|
||||||
lMap.Set("has", ctx =>
|
|
||||||
{
|
|
||||||
ulong titleId;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
titleId = ctx.Constrain(Constraint.ExactlyOneArgument).NextString(1).ToULong();
|
|
||||||
}
|
|
||||||
catch (FormatException)
|
|
||||||
{
|
|
||||||
throw ctx.Error(
|
|
||||||
$"Invalid input to {ctx.FormattedName}; input must be a hexadecimal number in a string.");
|
|
||||||
}
|
|
||||||
|
|
||||||
return appLib.FindApplication(titleId, out _);
|
|
||||||
});
|
|
||||||
lMap.Set("get", ctx =>
|
|
||||||
{
|
|
||||||
ulong titleId;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
titleId = ctx.Constrain(Constraint.ExactlyOneArgument).NextString(1).ToULong();
|
|
||||||
}
|
|
||||||
catch (FormatException)
|
|
||||||
{
|
|
||||||
throw ctx.Error(
|
|
||||||
$"Invalid input to {ctx.FormattedName}; input must be a hexadecimal number in a string.");
|
|
||||||
}
|
|
||||||
|
|
||||||
return appLib.FindApplication(titleId,
|
|
||||||
out ApplicationData applicationData)
|
|
||||||
? Wrap(applicationData)
|
|
||||||
: null;
|
|
||||||
});
|
|
||||||
return lMap;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static ValueMap Wrap(ApplicationData appData)
|
|
||||||
{
|
|
||||||
ValueMap aMap = new();
|
|
||||||
aMap.Set("name", appData.Name);
|
|
||||||
aMap.Set("version", appData.Version);
|
|
||||||
aMap.Set("developer", appData.Developer);
|
|
||||||
aMap.Set("fileExtension", appData.FileExtension);
|
|
||||||
aMap.Set("fileSize", appData.FileSizeString);
|
|
||||||
aMap.Set("hasLdnGames", appData.HasLdnGames);
|
|
||||||
aMap.Set("timePlayed", appData.TimePlayedString);
|
|
||||||
aMap.Set("isFavorite", appData.Favorite);
|
|
||||||
return aMap;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,21 +0,0 @@
|
|||||||
<UserControl xmlns="https://github.com/avaloniaui"
|
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
|
||||||
xmlns:local="using:Ryujinx.Ava.Systems.Starscript"
|
|
||||||
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
|
||||||
x:Class="Ryujinx.Ava.Systems.Starscript.StarscriptTextBox"
|
|
||||||
x:DataType="local:StarscriptTextBoxViewModel">
|
|
||||||
<StackPanel Spacing="10">
|
|
||||||
<TextBlock Text="{Binding ErrorMessage}" IsVisible="{Binding HasError}"/>
|
|
||||||
<TextBlock Text="{Binding CurrentScriptResult}" IsVisible="{Binding !HasError}"/>
|
|
||||||
<AutoCompleteBox Name="InputBox"
|
|
||||||
HorizontalAlignment="Stretch"
|
|
||||||
VerticalAlignment="Stretch"
|
|
||||||
FilterMode="Custom"
|
|
||||||
MinimumPrefixLength="0"
|
|
||||||
MaxDropDownHeight="400">
|
|
||||||
</AutoCompleteBox>
|
|
||||||
</StackPanel>
|
|
||||||
</UserControl>
|
|
||||||
|
|
@@ -1,87 +0,0 @@
|
|||||||
using Avalonia;
|
|
||||||
using Avalonia.Controls;
|
|
||||||
using Avalonia.Styling;
|
|
||||||
using FluentAvalonia.UI.Controls;
|
|
||||||
using Humanizer;
|
|
||||||
using Ryujinx.Ava.Common.Locale;
|
|
||||||
using Ryujinx.Ava.UI.Controls;
|
|
||||||
using Ryujinx.Ava.UI.Helpers;
|
|
||||||
using Starscript;
|
|
||||||
using Starscript.Internal;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Ryujinx.Ava.Systems.Starscript
|
|
||||||
{
|
|
||||||
public partial class StarscriptTextBox : RyujinxControl<StarscriptTextBoxViewModel>
|
|
||||||
{
|
|
||||||
public IReadOnlyList<string> CurrentSuggestions => ViewModel.CurrentSuggestions;
|
|
||||||
|
|
||||||
public ParserResult CurrentScriptSource => ViewModel.CurrentScriptSource;
|
|
||||||
public Exception Exception => ViewModel.Exception;
|
|
||||||
public Script CurrentScript => ViewModel.CurrentScript;
|
|
||||||
public StringSegment CurrentScriptResult => ViewModel.CurrentScriptResult;
|
|
||||||
|
|
||||||
public StarscriptTextBox()
|
|
||||||
{
|
|
||||||
InitializeComponent();
|
|
||||||
|
|
||||||
InputBox.AsyncPopulator = GetSuggestionsAsync;
|
|
||||||
InputBox.MinimumPopulateDelay = 0.Seconds();
|
|
||||||
InputBox.TextFilter = (_, _) => true;
|
|
||||||
InputBox.TextSelector = (text, suggestion) =>
|
|
||||||
{
|
|
||||||
if (text is not null && suggestion is null)
|
|
||||||
return text;
|
|
||||||
if (text is null && suggestion is not null)
|
|
||||||
return suggestion;
|
|
||||||
// ReSharper disable once ConditionIsAlwaysTrueOrFalse
|
|
||||||
if (text is null && suggestion is null)
|
|
||||||
return string.Empty;
|
|
||||||
|
|
||||||
var sb = new StringBuilder(text.Length + suggestion.Length + 1);
|
|
||||||
sb.Append(text);
|
|
||||||
|
|
||||||
for (int i = 0; i < suggestion.Length - 1; i++)
|
|
||||||
{
|
|
||||||
if (text.EndsWith(suggestion[..(suggestion.Length - i - 1)]))
|
|
||||||
{
|
|
||||||
suggestion = suggestion[(suggestion.Length - i - 1)..];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sb.Append(suggestion);
|
|
||||||
|
|
||||||
return sb.ToString();
|
|
||||||
};
|
|
||||||
|
|
||||||
Style textStyle = new(x => x.OfType<AutoCompleteBox>().Descendant().OfType<TextBlock>());
|
|
||||||
textStyle.Setters.Add(new Setter(MarginProperty, new Thickness(0, 0)));
|
|
||||||
|
|
||||||
Styles.Add(textStyle);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Task<IEnumerable<object>> GetSuggestionsAsync(string input, CancellationToken token)
|
|
||||||
=> Task.FromResult(ViewModel.GetSuggestions(input, token));
|
|
||||||
|
|
||||||
public static StarscriptTextBox Create(StarscriptHypervisor hv)
|
|
||||||
=> new() { ViewModel = new StarscriptTextBoxViewModel(hv) };
|
|
||||||
|
|
||||||
public static async Task Show()
|
|
||||||
{
|
|
||||||
ContentDialog contentDialog = new()
|
|
||||||
{
|
|
||||||
PrimaryButtonText = string.Empty,
|
|
||||||
SecondaryButtonText = string.Empty,
|
|
||||||
CloseButtonText = LocaleManager.Instance[LocaleKeys.UserProfilesClose],
|
|
||||||
Content = new StarscriptTextBox { ViewModel = new() }
|
|
||||||
};
|
|
||||||
|
|
||||||
await ContentDialogHelper.ShowAsync(contentDialog.ApplyStyles());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,126 +0,0 @@
|
|||||||
using CommunityToolkit.Mvvm.ComponentModel;
|
|
||||||
using Ryujinx.Ava.UI.ViewModels;
|
|
||||||
using Starscript;
|
|
||||||
using Starscript.Internal;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Collections.ObjectModel;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading;
|
|
||||||
|
|
||||||
namespace Ryujinx.Ava.Systems.Starscript
|
|
||||||
{
|
|
||||||
public partial class StarscriptTextBoxViewModel : BaseModel
|
|
||||||
{
|
|
||||||
private readonly StarscriptHypervisor _hv;
|
|
||||||
|
|
||||||
public StarscriptTextBoxViewModel(StarscriptHypervisor hv = null)
|
|
||||||
{
|
|
||||||
_hv = hv ?? RyujinxStarscript.Hypervisor;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ObservableCollection<string> CurrentSuggestions { get; } = [];
|
|
||||||
|
|
||||||
[ObservableProperty] private bool _hasError;
|
|
||||||
[ObservableProperty] private StringSegment _currentScriptResult;
|
|
||||||
[ObservableProperty] private string _errorMessage;
|
|
||||||
private Exception _exception;
|
|
||||||
private ParserResult _currentScriptSource;
|
|
||||||
private Script _currentScript;
|
|
||||||
|
|
||||||
public Exception Exception
|
|
||||||
{
|
|
||||||
get => _exception;
|
|
||||||
set
|
|
||||||
{
|
|
||||||
ErrorMessage = (_exception = value) switch
|
|
||||||
{
|
|
||||||
ParseException pe => pe.Error.ToString(),
|
|
||||||
StarscriptException se => se.Message,
|
|
||||||
_ => string.Empty
|
|
||||||
};
|
|
||||||
|
|
||||||
HasError = value is not null;
|
|
||||||
|
|
||||||
OnPropertyChanged();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public ParserResult CurrentScriptSource
|
|
||||||
{
|
|
||||||
get => _currentScriptSource;
|
|
||||||
set
|
|
||||||
{
|
|
||||||
_currentScriptSource = value;
|
|
||||||
|
|
||||||
if (value is null)
|
|
||||||
{
|
|
||||||
CurrentScript = null;
|
|
||||||
CurrentScriptResult = null;
|
|
||||||
Exception = null;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
CurrentScript = Compiler.SingleCompile(value);
|
|
||||||
Exception = null;
|
|
||||||
|
|
||||||
OnPropertyChanged();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Script CurrentScript
|
|
||||||
{
|
|
||||||
get => _currentScript;
|
|
||||||
private set
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
CurrentScriptResult = value?.Execute(_hv)!;
|
|
||||||
_currentScript = value;
|
|
||||||
Exception = null;
|
|
||||||
}
|
|
||||||
catch (StarscriptException se)
|
|
||||||
{
|
|
||||||
_currentScript = null;
|
|
||||||
CurrentScriptResult = null;
|
|
||||||
Exception = se;
|
|
||||||
}
|
|
||||||
|
|
||||||
OnPropertyChanged();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void ReExecuteScript()
|
|
||||||
{
|
|
||||||
if (_currentScript is null) return;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
CurrentScriptResult = _currentScript.Execute(_hv)!;
|
|
||||||
}
|
|
||||||
catch (StarscriptException se)
|
|
||||||
{
|
|
||||||
CurrentScriptResult = null;
|
|
||||||
Exception = se;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public IEnumerable<object> GetSuggestions(string input, CancellationToken token)
|
|
||||||
{
|
|
||||||
CurrentSuggestions.Clear();
|
|
||||||
|
|
||||||
CurrentScriptSource = _hv.ParseAndGetCompletions(input, input.Length, CompletionCallback, token);
|
|
||||||
|
|
||||||
if (CurrentScriptSource.HasErrors)
|
|
||||||
{
|
|
||||||
Exception = new ParseException(CurrentScriptSource.Errors.First());
|
|
||||||
}
|
|
||||||
|
|
||||||
OnPropertyChanged(nameof(CurrentSuggestions));
|
|
||||||
|
|
||||||
return CurrentSuggestions;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void CompletionCallback(string result, bool isFunction) => CurrentSuggestions.Add(isFunction ? $"{result}(" : result);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -253,10 +253,6 @@
|
|||||||
Header="{ext:Locale MenuBarHelpAbout}"
|
Header="{ext:Locale MenuBarHelpAbout}"
|
||||||
Icon="{ext:Icon fa-solid fa-circle-info}"
|
Icon="{ext:Icon fa-solid fa-circle-info}"
|
||||||
ToolTip.Tip="{ext:Locale OpenAboutTooltip}" />
|
ToolTip.Tip="{ext:Locale OpenAboutTooltip}" />
|
||||||
<MenuItem
|
|
||||||
Name="StarscriptDebugMenuItem"
|
|
||||||
Header="Debug Starscript"
|
|
||||||
Icon="{ext:Icon fa-solid fa-star}" />
|
|
||||||
<MenuItem
|
<MenuItem
|
||||||
Name="UpdateMenuItem"
|
Name="UpdateMenuItem"
|
||||||
IsEnabled="{Binding CanUpdate}"
|
IsEnabled="{Binding CanUpdate}"
|
||||||
|
@@ -8,7 +8,6 @@ using LibHac.Ns;
|
|||||||
using Ryujinx.Ava.Common.Locale;
|
using Ryujinx.Ava.Common.Locale;
|
||||||
using Ryujinx.Ava.Systems.AppLibrary;
|
using Ryujinx.Ava.Systems.AppLibrary;
|
||||||
using Ryujinx.Ava.Systems.Configuration;
|
using Ryujinx.Ava.Systems.Configuration;
|
||||||
using Ryujinx.Ava.Systems.Starscript;
|
|
||||||
using Ryujinx.Ava.UI.Controls;
|
using Ryujinx.Ava.UI.Controls;
|
||||||
using Ryujinx.Ava.UI.Helpers;
|
using Ryujinx.Ava.UI.Helpers;
|
||||||
using Ryujinx.Ava.UI.ViewModels;
|
using Ryujinx.Ava.UI.ViewModels;
|
||||||
@@ -52,8 +51,6 @@ namespace Ryujinx.Ava.UI.Views.Main
|
|||||||
CompatibilityListMenuItem.Command = Commands.Create(() => CompatibilityListWindow.Show());
|
CompatibilityListMenuItem.Command = Commands.Create(() => CompatibilityListWindow.Show());
|
||||||
|
|
||||||
UpdateMenuItem.Command = MainWindowViewModel.UpdateCommand;
|
UpdateMenuItem.Command = MainWindowViewModel.UpdateCommand;
|
||||||
|
|
||||||
StarscriptDebugMenuItem.Command = Commands.Create(StarscriptTextBox.Show);
|
|
||||||
|
|
||||||
FaqMenuItem.Command =
|
FaqMenuItem.Command =
|
||||||
SetupGuideMenuItem.Command =
|
SetupGuideMenuItem.Command =
|
||||||
|
Reference in New Issue
Block a user