diff --git a/osu.Android.props b/osu.Android.props
index af699af1ba..a406cdf08a 100644
--- a/osu.Android.props
+++ b/osu.Android.props
@@ -52,6 +52,6 @@
-
+
diff --git a/osu.Android/OsuGameAndroid.cs b/osu.Android/OsuGameAndroid.cs
index 84f215f930..19ed7ffcf5 100644
--- a/osu.Android/OsuGameAndroid.cs
+++ b/osu.Android/OsuGameAndroid.cs
@@ -18,7 +18,8 @@ namespace osu.Android
try
{
- string versionName = packageInfo.VersionCode.ToString();
+ // todo: needs checking before play store redeploy.
+ string versionName = packageInfo.VersionName;
// undo play store version garbling
return new Version(int.Parse(versionName.Substring(0, 4)), int.Parse(versionName.Substring(4, 4)), int.Parse(versionName.Substring(8, 1)));
}
diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs
index fdc8d94352..3caffb6db5 100644
--- a/osu.Game/OsuGame.cs
+++ b/osu.Game/OsuGame.cs
@@ -18,6 +18,7 @@ using osu.Game.Screens.Menu;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
+using JetBrains.Annotations;
using osu.Framework.Audio;
using osu.Framework.Bindables;
using osu.Framework.Development;
@@ -97,6 +98,7 @@ namespace osu.Game
private MainMenu menuScreen;
+ [CanBeNull]
private IntroScreen introScreen;
private Bindable configRuleset;
@@ -914,7 +916,7 @@ namespace osu.Game
if (ScreenStack.CurrentScreen is Loader)
return false;
- if (introScreen.DidLoadMenu && !(ScreenStack.CurrentScreen is IntroScreen))
+ if (introScreen?.DidLoadMenu == true && !(ScreenStack.CurrentScreen is IntroScreen))
{
Scheduler.Add(introScreen.MakeCurrent);
return true;
diff --git a/osu.Game/Overlays/BeatmapListing/Panels/BeatmapPanelDownloadButton.cs b/osu.Game/Overlays/BeatmapListing/Panels/BeatmapPanelDownloadButton.cs
index 589f2d5072..67782dfe3f 100644
--- a/osu.Game/Overlays/BeatmapListing/Panels/BeatmapPanelDownloadButton.cs
+++ b/osu.Game/Overlays/BeatmapListing/Panels/BeatmapPanelDownloadButton.cs
@@ -50,13 +50,6 @@ namespace osu.Game.Overlays.BeatmapListing.Panels
[BackgroundDependencyLoader(true)]
private void load(OsuGame game, BeatmapManager beatmaps, OsuConfigManager osuConfig)
{
- if (BeatmapSet.Value?.OnlineInfo?.Availability?.DownloadDisabled ?? false)
- {
- button.Enabled.Value = false;
- button.TooltipText = "this beatmap is currently not available for download.";
- return;
- }
-
noVideoSetting = osuConfig.GetBindable(OsuSetting.PreferNoVideo);
button.Action = () =>
@@ -81,6 +74,26 @@ namespace osu.Game.Overlays.BeatmapListing.Panels
break;
}
};
+
+ State.BindValueChanged(state =>
+ {
+ switch (state.NewValue)
+ {
+ case DownloadState.LocallyAvailable:
+ button.Enabled.Value = true;
+ button.TooltipText = string.Empty;
+ break;
+
+ default:
+ if (BeatmapSet.Value?.OnlineInfo?.Availability?.DownloadDisabled ?? false)
+ {
+ button.Enabled.Value = false;
+ button.TooltipText = "this beatmap is currently not available for download.";
+ }
+
+ break;
+ }
+ }, true);
}
}
}
diff --git a/osu.Game/Overlays/BeatmapSet/Header.cs b/osu.Game/Overlays/BeatmapSet/Header.cs
index 1ff08aab2c..06e31277dd 100644
--- a/osu.Game/Overlays/BeatmapSet/Header.cs
+++ b/osu.Game/Overlays/BeatmapSet/Header.cs
@@ -264,7 +264,7 @@ namespace osu.Game.Overlays.BeatmapSet
{
if (BeatmapSet.Value == null) return;
- if (BeatmapSet.Value.OnlineInfo.Availability?.DownloadDisabled ?? false)
+ if ((BeatmapSet.Value.OnlineInfo.Availability?.DownloadDisabled ?? false) && State.Value != DownloadState.LocallyAvailable)
{
downloadButtonsContainer.Clear();
return;
diff --git a/osu.Game/Rulesets/RulesetInfo.cs b/osu.Game/Rulesets/RulesetInfo.cs
index afd499cb9e..2e32b96084 100644
--- a/osu.Game/Rulesets/RulesetInfo.cs
+++ b/osu.Game/Rulesets/RulesetInfo.cs
@@ -3,6 +3,7 @@
using System;
using System.Diagnostics.CodeAnalysis;
+using System.Linq;
using Newtonsoft.Json;
namespace osu.Game.Rulesets
@@ -15,7 +16,20 @@ namespace osu.Game.Rulesets
public string ShortName { get; set; }
- public string InstantiationInfo { get; set; }
+ private string instantiationInfo;
+
+ public string InstantiationInfo
+ {
+ get => instantiationInfo;
+ set => instantiationInfo = abbreviateInstantiationInfo(value);
+ }
+
+ private string abbreviateInstantiationInfo(string value)
+ {
+ // exclude version onwards, matching only on namespace and type.
+ // this is mainly to allow for new versions of already loaded rulesets to "upgrade" from old.
+ return string.Join(',', value.Split(',').Take(2));
+ }
[JsonIgnore]
public bool Available { get; set; }
diff --git a/osu.Game/Rulesets/RulesetStore.cs b/osu.Game/Rulesets/RulesetStore.cs
index f302f8700f..b3026bf2b7 100644
--- a/osu.Game/Rulesets/RulesetStore.cs
+++ b/osu.Game/Rulesets/RulesetStore.cs
@@ -93,7 +93,9 @@ namespace osu.Game.Rulesets
// add any other modes
foreach (var r in instances.Where(r => !(r is ILegacyRuleset)))
{
- if (context.RulesetInfo.FirstOrDefault(ri => ri.InstantiationInfo == r.RulesetInfo.InstantiationInfo) == null)
+ // todo: StartsWith can be changed to Equals on 2020-11-08
+ // This is to give users enough time to have their database use new abbreviated info).
+ if (context.RulesetInfo.FirstOrDefault(ri => ri.InstantiationInfo.StartsWith(r.RulesetInfo.InstantiationInfo)) == null)
context.RulesetInfo.Add(r.RulesetInfo);
}
@@ -104,13 +106,7 @@ namespace osu.Game.Rulesets
{
try
{
- var instanceInfo = ((Ruleset)Activator.CreateInstance(Type.GetType(r.InstantiationInfo, asm =>
- {
- // for the time being, let's ignore the version being loaded.
- // this allows for debug builds to successfully load rulesets (even though debug rulesets have a 0.0.0 version).
- asm.Version = null;
- return Assembly.Load(asm);
- }, null))).RulesetInfo;
+ var instanceInfo = ((Ruleset)Activator.CreateInstance(Type.GetType(r.InstantiationInfo))).RulesetInfo;
r.Name = instanceInfo.Name;
r.ShortName = instanceInfo.ShortName;
diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj
index 47804ed06e..5ccfaaac9e 100644
--- a/osu.Game/osu.Game.csproj
+++ b/osu.Game/osu.Game.csproj
@@ -24,7 +24,7 @@
-
+
diff --git a/osu.iOS.props b/osu.iOS.props
index 86cffa9fba..dc83d937f7 100644
--- a/osu.iOS.props
+++ b/osu.iOS.props
@@ -70,7 +70,7 @@
-
+
@@ -80,7 +80,7 @@
-
+