mirror of
https://github.com/ppy/osu.git
synced 2025-01-13 16:32:54 +08:00
Merge branch 'master' of https://github.com/pavlukivan/osu
This commit is contained in:
commit
b43966a3e2
@ -295,6 +295,9 @@ namespace osu.Game.Tests.Beatmaps.Formats
|
|||||||
Assert.AreEqual("normal-hitnormal", getTestableSampleInfo(hitObjects[1]).LookupNames.First());
|
Assert.AreEqual("normal-hitnormal", getTestableSampleInfo(hitObjects[1]).LookupNames.First());
|
||||||
Assert.AreEqual("normal-hitnormal2", getTestableSampleInfo(hitObjects[2]).LookupNames.First());
|
Assert.AreEqual("normal-hitnormal2", getTestableSampleInfo(hitObjects[2]).LookupNames.First());
|
||||||
Assert.AreEqual("normal-hitnormal", getTestableSampleInfo(hitObjects[3]).LookupNames.First());
|
Assert.AreEqual("normal-hitnormal", getTestableSampleInfo(hitObjects[3]).LookupNames.First());
|
||||||
|
|
||||||
|
// The control point at the end time of the slider should be applied
|
||||||
|
Assert.AreEqual("soft-hitnormal8", getTestableSampleInfo(hitObjects[4]).LookupNames.First());
|
||||||
}
|
}
|
||||||
|
|
||||||
SampleInfo getTestableSampleInfo(HitObject hitObject) => hitObject.SampleControlPoint.ApplyTo(hitObject.Samples[0]);
|
SampleInfo getTestableSampleInfo(HitObject hitObject) => hitObject.SampleControlPoint.ApplyTo(hitObject.Samples[0]);
|
||||||
|
@ -8,9 +8,12 @@ SampleSet: Normal
|
|||||||
2638,-100,4,1,1,40,0,0
|
2638,-100,4,1,1,40,0,0
|
||||||
3107,-100,4,1,2,40,0,0
|
3107,-100,4,1,2,40,0,0
|
||||||
3576,-100,4,1,0,40,0,0
|
3576,-100,4,1,0,40,0,0
|
||||||
|
18287,-100,4,2,11,80,0,1
|
||||||
|
18595,-100,4,2,8,80,0,1
|
||||||
|
|
||||||
[HitObjects]
|
[HitObjects]
|
||||||
255,193,2170,1,0,0:0:0:0:
|
255,193,2170,1,0,0:0:0:0:
|
||||||
256,191,2638,5,0,0:0:0:0:
|
256,191,2638,5,0,0:0:0:0:
|
||||||
255,193,3107,1,0,0:0:0:0:
|
255,193,3107,1,0,0:0:0:0:
|
||||||
256,191,3576,1,0,0:0:0:0:
|
256,191,3576,1,0,0:0:0:0:
|
||||||
|
112,200,18493,6,0,L|104:248,1,35,8|0,0:0|0:0,0:0:0:0:
|
@ -38,7 +38,6 @@ namespace osu.Game.Tests.Scores.IO
|
|||||||
Rank = ScoreRank.B,
|
Rank = ScoreRank.B,
|
||||||
TotalScore = 987654,
|
TotalScore = 987654,
|
||||||
Accuracy = 0.8,
|
Accuracy = 0.8,
|
||||||
Health = 0.8,
|
|
||||||
MaxCombo = 500,
|
MaxCombo = 500,
|
||||||
Combo = 250,
|
Combo = 250,
|
||||||
User = new User { Username = "Test user" },
|
User = new User { Username = "Test user" },
|
||||||
@ -51,7 +50,6 @@ namespace osu.Game.Tests.Scores.IO
|
|||||||
Assert.AreEqual(toImport.Rank, imported.Rank);
|
Assert.AreEqual(toImport.Rank, imported.Rank);
|
||||||
Assert.AreEqual(toImport.TotalScore, imported.TotalScore);
|
Assert.AreEqual(toImport.TotalScore, imported.TotalScore);
|
||||||
Assert.AreEqual(toImport.Accuracy, imported.Accuracy);
|
Assert.AreEqual(toImport.Accuracy, imported.Accuracy);
|
||||||
Assert.AreEqual(toImport.Health, imported.Health);
|
|
||||||
Assert.AreEqual(toImport.MaxCombo, imported.MaxCombo);
|
Assert.AreEqual(toImport.MaxCombo, imported.MaxCombo);
|
||||||
Assert.AreEqual(toImport.Combo, imported.Combo);
|
Assert.AreEqual(toImport.Combo, imported.Combo);
|
||||||
Assert.AreEqual(toImport.User.Username, imported.User.Username);
|
Assert.AreEqual(toImport.User.Username, imported.User.Username);
|
||||||
|
@ -97,9 +97,12 @@ namespace osu.Game.Tests.Visual
|
|||||||
|
|
||||||
[SetUp]
|
[SetUp]
|
||||||
public virtual void SetUp()
|
public virtual void SetUp()
|
||||||
|
{
|
||||||
|
Schedule(() =>
|
||||||
{
|
{
|
||||||
manager?.Delete(manager.GetAllUsableBeatmapSets());
|
manager?.Delete(manager.GetAllUsableBeatmapSets());
|
||||||
Child = songSelect = new TestSongSelect();
|
Child = songSelect = new TestSongSelect();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
@ -9,7 +9,7 @@ using osu.Game.Database;
|
|||||||
namespace osu.Game.Migrations
|
namespace osu.Game.Migrations
|
||||||
{
|
{
|
||||||
[DbContext(typeof(OsuDbContext))]
|
[DbContext(typeof(OsuDbContext))]
|
||||||
[Migration("20181130084152_AddScoreInfoTables")]
|
[Migration("20181130113755_AddScoreInfoTables")]
|
||||||
partial class AddScoreInfoTables
|
partial class AddScoreInfoTables
|
||||||
{
|
{
|
||||||
protected override void BuildTargetModel(ModelBuilder modelBuilder)
|
protected override void BuildTargetModel(ModelBuilder modelBuilder)
|
||||||
@ -309,7 +309,8 @@ namespace osu.Game.Migrations
|
|||||||
b.Property<int>("ID")
|
b.Property<int>("ID")
|
||||||
.ValueGeneratedOnAdd();
|
.ValueGeneratedOnAdd();
|
||||||
|
|
||||||
b.Property<double>("Accuracy");
|
b.Property<double>("Accuracy")
|
||||||
|
.HasColumnType("DECIMAL(1,4)");
|
||||||
|
|
||||||
b.Property<int>("BeatmapInfoID");
|
b.Property<int>("BeatmapInfoID");
|
||||||
|
|
||||||
@ -321,8 +322,6 @@ namespace osu.Game.Migrations
|
|||||||
|
|
||||||
b.Property<string>("Hash");
|
b.Property<string>("Hash");
|
||||||
|
|
||||||
b.Property<double>("Health");
|
|
||||||
|
|
||||||
b.Property<int>("MaxCombo");
|
b.Property<int>("MaxCombo");
|
||||||
|
|
||||||
b.Property<string>("ModsJson")
|
b.Property<string>("ModsJson")
|
||||||
@ -339,7 +338,7 @@ namespace osu.Game.Migrations
|
|||||||
b.Property<string>("StatisticsJson")
|
b.Property<string>("StatisticsJson")
|
||||||
.HasColumnName("Statistics");
|
.HasColumnName("Statistics");
|
||||||
|
|
||||||
b.Property<double>("TotalScore");
|
b.Property<int>("TotalScore");
|
||||||
|
|
||||||
b.Property<string>("UserString")
|
b.Property<string>("UserString")
|
||||||
.HasColumnName("User");
|
.HasColumnName("User");
|
@ -14,9 +14,8 @@ namespace osu.Game.Migrations
|
|||||||
ID = table.Column<int>(nullable: false)
|
ID = table.Column<int>(nullable: false)
|
||||||
.Annotation("Sqlite:Autoincrement", true),
|
.Annotation("Sqlite:Autoincrement", true),
|
||||||
Rank = table.Column<int>(nullable: false),
|
Rank = table.Column<int>(nullable: false),
|
||||||
TotalScore = table.Column<double>(nullable: false),
|
TotalScore = table.Column<int>(nullable: false),
|
||||||
Accuracy = table.Column<double>(nullable: false),
|
Accuracy = table.Column<double>(type: "DECIMAL(1,4)", nullable: false),
|
||||||
Health = table.Column<double>(nullable: false),
|
|
||||||
PP = table.Column<double>(nullable: true),
|
PP = table.Column<double>(nullable: true),
|
||||||
MaxCombo = table.Column<int>(nullable: false),
|
MaxCombo = table.Column<int>(nullable: false),
|
||||||
Combo = table.Column<int>(nullable: false),
|
Combo = table.Column<int>(nullable: false),
|
@ -307,7 +307,8 @@ namespace osu.Game.Migrations
|
|||||||
b.Property<int>("ID")
|
b.Property<int>("ID")
|
||||||
.ValueGeneratedOnAdd();
|
.ValueGeneratedOnAdd();
|
||||||
|
|
||||||
b.Property<double>("Accuracy");
|
b.Property<double>("Accuracy")
|
||||||
|
.HasColumnType("DECIMAL(1,4)");
|
||||||
|
|
||||||
b.Property<int>("BeatmapInfoID");
|
b.Property<int>("BeatmapInfoID");
|
||||||
|
|
||||||
@ -319,8 +320,6 @@ namespace osu.Game.Migrations
|
|||||||
|
|
||||||
b.Property<string>("Hash");
|
b.Property<string>("Hash");
|
||||||
|
|
||||||
b.Property<double>("Health");
|
|
||||||
|
|
||||||
b.Property<int>("MaxCombo");
|
b.Property<int>("MaxCombo");
|
||||||
|
|
||||||
b.Property<string>("ModsJson")
|
b.Property<string>("ModsJson")
|
||||||
@ -337,7 +336,7 @@ namespace osu.Game.Migrations
|
|||||||
b.Property<string>("StatisticsJson")
|
b.Property<string>("StatisticsJson")
|
||||||
.HasColumnName("Statistics");
|
.HasColumnName("Statistics");
|
||||||
|
|
||||||
b.Property<double>("TotalScore");
|
b.Property<int>("TotalScore");
|
||||||
|
|
||||||
b.Property<string>("UserString")
|
b.Property<string>("UserString")
|
||||||
.HasColumnName("User");
|
.HasColumnName("User");
|
||||||
|
@ -16,7 +16,7 @@ namespace osu.Game.Online.API.Requests.Responses
|
|||||||
public class APIScoreInfo : ScoreInfo
|
public class APIScoreInfo : ScoreInfo
|
||||||
{
|
{
|
||||||
[JsonProperty(@"score")]
|
[JsonProperty(@"score")]
|
||||||
private double totalScore
|
private int totalScore
|
||||||
{
|
{
|
||||||
set => TotalScore = value;
|
set => TotalScore = value;
|
||||||
}
|
}
|
||||||
|
@ -1,348 +0,0 @@
|
|||||||
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
|
||||||
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
|
||||||
|
|
||||||
using osu.Framework.Allocation;
|
|
||||||
using osu.Framework.Extensions.Color4Extensions;
|
|
||||||
using osu.Framework.Graphics;
|
|
||||||
using osu.Framework.Graphics.Containers;
|
|
||||||
using osu.Framework.Graphics.Shapes;
|
|
||||||
using osu.Framework.Graphics.Sprites;
|
|
||||||
using osu.Framework.Graphics.UserInterface;
|
|
||||||
using osu.Game.Graphics;
|
|
||||||
using osu.Game.Graphics.Sprites;
|
|
||||||
using osu.Game.Graphics.UserInterface;
|
|
||||||
using osu.Game.Online.Chat;
|
|
||||||
using osuTK;
|
|
||||||
using osuTK.Input;
|
|
||||||
using osuTK.Graphics;
|
|
||||||
using osu.Framework.Configuration;
|
|
||||||
using System;
|
|
||||||
using osu.Framework.Input.Events;
|
|
||||||
using osu.Game.Graphics.Containers;
|
|
||||||
|
|
||||||
namespace osu.Game.Overlays.Chat
|
|
||||||
{
|
|
||||||
public class ChatTabControl : OsuTabControl<Channel>
|
|
||||||
{
|
|
||||||
private const float shear_width = 10;
|
|
||||||
|
|
||||||
public Action<Channel> OnRequestLeave;
|
|
||||||
|
|
||||||
public readonly Bindable<bool> ChannelSelectorActive = new Bindable<bool>();
|
|
||||||
|
|
||||||
private readonly ChannelTabItem.ChannelSelectorTabItem selectorTab;
|
|
||||||
|
|
||||||
public ChatTabControl()
|
|
||||||
{
|
|
||||||
TabContainer.Margin = new MarginPadding { Left = 50 };
|
|
||||||
TabContainer.Spacing = new Vector2(-shear_width, 0);
|
|
||||||
TabContainer.Masking = false;
|
|
||||||
|
|
||||||
AddInternal(new SpriteIcon
|
|
||||||
{
|
|
||||||
Icon = FontAwesome.fa_comments,
|
|
||||||
Anchor = Anchor.CentreLeft,
|
|
||||||
Origin = Anchor.CentreLeft,
|
|
||||||
Size = new Vector2(20),
|
|
||||||
Margin = new MarginPadding(10),
|
|
||||||
});
|
|
||||||
|
|
||||||
AddTabItem(selectorTab = new ChannelTabItem.ChannelSelectorTabItem(new Channel { Name = "+" }));
|
|
||||||
|
|
||||||
ChannelSelectorActive.BindTo(selectorTab.Active);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void AddTabItem(TabItem<Channel> item, bool addToDropdown = true)
|
|
||||||
{
|
|
||||||
if (item != selectorTab && TabContainer.GetLayoutPosition(selectorTab) < float.MaxValue)
|
|
||||||
// performTabSort might've made selectorTab's position wonky, fix it
|
|
||||||
TabContainer.SetLayoutPosition(selectorTab, float.MaxValue);
|
|
||||||
|
|
||||||
base.AddTabItem(item, addToDropdown);
|
|
||||||
|
|
||||||
if (SelectedTab == null)
|
|
||||||
SelectTab(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override TabItem<Channel> CreateTabItem(Channel value) => new ChannelTabItem(value) { OnRequestClose = tabCloseRequested };
|
|
||||||
|
|
||||||
protected override void SelectTab(TabItem<Channel> tab)
|
|
||||||
{
|
|
||||||
if (tab is ChannelTabItem.ChannelSelectorTabItem)
|
|
||||||
{
|
|
||||||
tab.Active.Toggle();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
selectorTab.Active.Value = false;
|
|
||||||
|
|
||||||
base.SelectTab(tab);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void tabCloseRequested(TabItem<Channel> tab)
|
|
||||||
{
|
|
||||||
int totalTabs = TabContainer.Count - 1; // account for selectorTab
|
|
||||||
int currentIndex = MathHelper.Clamp(TabContainer.IndexOf(tab), 1, totalTabs);
|
|
||||||
|
|
||||||
if (tab == SelectedTab && totalTabs > 1)
|
|
||||||
// Select the tab after tab-to-be-removed's index, or the tab before if current == last
|
|
||||||
SelectTab(TabContainer[currentIndex == totalTabs ? currentIndex - 1 : currentIndex + 1]);
|
|
||||||
else if (totalTabs == 1 && !selectorTab.Active)
|
|
||||||
// Open channel selection overlay if all channel tabs will be closed after removing this tab
|
|
||||||
SelectTab(selectorTab);
|
|
||||||
|
|
||||||
OnRequestLeave?.Invoke(tab.Value);
|
|
||||||
}
|
|
||||||
|
|
||||||
private class ChannelTabItem : TabItem<Channel>
|
|
||||||
{
|
|
||||||
private Color4 backgroundInactive;
|
|
||||||
private Color4 backgroundHover;
|
|
||||||
private Color4 backgroundActive;
|
|
||||||
|
|
||||||
public override bool IsRemovable => !Pinned;
|
|
||||||
|
|
||||||
private readonly SpriteText text;
|
|
||||||
private readonly SpriteText textBold;
|
|
||||||
private readonly ClickableContainer closeButton;
|
|
||||||
private readonly Box box;
|
|
||||||
private readonly Box highlightBox;
|
|
||||||
private readonly SpriteIcon icon;
|
|
||||||
|
|
||||||
public Action<ChannelTabItem> OnRequestClose;
|
|
||||||
|
|
||||||
private void updateState()
|
|
||||||
{
|
|
||||||
if (Active)
|
|
||||||
fadeActive();
|
|
||||||
else
|
|
||||||
fadeInactive();
|
|
||||||
}
|
|
||||||
|
|
||||||
private const float transition_length = 400;
|
|
||||||
|
|
||||||
private void fadeActive()
|
|
||||||
{
|
|
||||||
this.ResizeTo(new Vector2(Width, 1.1f), transition_length, Easing.OutQuint);
|
|
||||||
|
|
||||||
box.FadeColour(backgroundActive, transition_length, Easing.OutQuint);
|
|
||||||
highlightBox.FadeIn(transition_length, Easing.OutQuint);
|
|
||||||
|
|
||||||
text.FadeOut(transition_length, Easing.OutQuint);
|
|
||||||
textBold.FadeIn(transition_length, Easing.OutQuint);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void fadeInactive()
|
|
||||||
{
|
|
||||||
this.ResizeTo(new Vector2(Width, 1), transition_length, Easing.OutQuint);
|
|
||||||
|
|
||||||
box.FadeColour(backgroundInactive, transition_length, Easing.OutQuint);
|
|
||||||
highlightBox.FadeOut(transition_length, Easing.OutQuint);
|
|
||||||
|
|
||||||
text.FadeIn(transition_length, Easing.OutQuint);
|
|
||||||
textBold.FadeOut(transition_length, Easing.OutQuint);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override bool OnMouseUp(MouseUpEvent e)
|
|
||||||
{
|
|
||||||
if (e.Button == MouseButton.Middle)
|
|
||||||
{
|
|
||||||
closeButton.Action();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override bool OnHover(HoverEvent e)
|
|
||||||
{
|
|
||||||
if (IsRemovable)
|
|
||||||
closeButton.FadeIn(200, Easing.OutQuint);
|
|
||||||
|
|
||||||
if (!Active)
|
|
||||||
box.FadeColour(backgroundHover, transition_length, Easing.OutQuint);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void OnHoverLost(HoverLostEvent e)
|
|
||||||
{
|
|
||||||
closeButton.FadeOut(200, Easing.OutQuint);
|
|
||||||
updateState();
|
|
||||||
}
|
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
|
||||||
private void load(OsuColour colours)
|
|
||||||
{
|
|
||||||
backgroundActive = colours.ChatBlue;
|
|
||||||
backgroundInactive = colours.Gray4;
|
|
||||||
backgroundHover = colours.Gray7;
|
|
||||||
|
|
||||||
highlightBox.Colour = colours.Yellow;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void LoadComplete()
|
|
||||||
{
|
|
||||||
base.LoadComplete();
|
|
||||||
|
|
||||||
updateState();
|
|
||||||
}
|
|
||||||
|
|
||||||
public ChannelTabItem(Channel value) : base(value)
|
|
||||||
{
|
|
||||||
Width = 150;
|
|
||||||
|
|
||||||
RelativeSizeAxes = Axes.Y;
|
|
||||||
|
|
||||||
Anchor = Anchor.BottomLeft;
|
|
||||||
Origin = Anchor.BottomLeft;
|
|
||||||
|
|
||||||
Shear = new Vector2(shear_width / ChatOverlay.TAB_AREA_HEIGHT, 0);
|
|
||||||
|
|
||||||
Masking = true;
|
|
||||||
EdgeEffect = new EdgeEffectParameters
|
|
||||||
{
|
|
||||||
Type = EdgeEffectType.Shadow,
|
|
||||||
Radius = 10,
|
|
||||||
Colour = Color4.Black.Opacity(0.2f),
|
|
||||||
};
|
|
||||||
|
|
||||||
Children = new Drawable[]
|
|
||||||
{
|
|
||||||
box = new Box
|
|
||||||
{
|
|
||||||
EdgeSmoothness = new Vector2(1, 0),
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
},
|
|
||||||
highlightBox = new Box
|
|
||||||
{
|
|
||||||
Width = 5,
|
|
||||||
Alpha = 0,
|
|
||||||
Anchor = Anchor.BottomRight,
|
|
||||||
Origin = Anchor.BottomRight,
|
|
||||||
EdgeSmoothness = new Vector2(1, 0),
|
|
||||||
RelativeSizeAxes = Axes.Y,
|
|
||||||
},
|
|
||||||
new Container
|
|
||||||
{
|
|
||||||
Shear = new Vector2(-shear_width / ChatOverlay.TAB_AREA_HEIGHT, 0),
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
Children = new Drawable[]
|
|
||||||
{
|
|
||||||
icon = new SpriteIcon
|
|
||||||
{
|
|
||||||
Icon = FontAwesome.fa_hashtag,
|
|
||||||
Anchor = Anchor.CentreLeft,
|
|
||||||
Origin = Anchor.CentreLeft,
|
|
||||||
Colour = Color4.Black,
|
|
||||||
X = -10,
|
|
||||||
Alpha = 0.2f,
|
|
||||||
Size = new Vector2(ChatOverlay.TAB_AREA_HEIGHT),
|
|
||||||
},
|
|
||||||
text = new OsuSpriteText
|
|
||||||
{
|
|
||||||
Margin = new MarginPadding(5),
|
|
||||||
Origin = Anchor.CentreLeft,
|
|
||||||
Anchor = Anchor.CentreLeft,
|
|
||||||
Text = value.ToString(),
|
|
||||||
TextSize = 18,
|
|
||||||
},
|
|
||||||
textBold = new OsuSpriteText
|
|
||||||
{
|
|
||||||
Alpha = 0,
|
|
||||||
Margin = new MarginPadding(5),
|
|
||||||
Origin = Anchor.CentreLeft,
|
|
||||||
Anchor = Anchor.CentreLeft,
|
|
||||||
Text = value.ToString(),
|
|
||||||
Font = @"Exo2.0-Bold",
|
|
||||||
TextSize = 18,
|
|
||||||
},
|
|
||||||
closeButton = new CloseButton
|
|
||||||
{
|
|
||||||
Alpha = 0,
|
|
||||||
Margin = new MarginPadding { Right = 20 },
|
|
||||||
Origin = Anchor.CentreRight,
|
|
||||||
Anchor = Anchor.CentreRight,
|
|
||||||
Action = delegate
|
|
||||||
{
|
|
||||||
if (IsRemovable) OnRequestClose?.Invoke(this);
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public class CloseButton : OsuClickableContainer
|
|
||||||
{
|
|
||||||
private readonly SpriteIcon icon;
|
|
||||||
|
|
||||||
public CloseButton()
|
|
||||||
{
|
|
||||||
Size = new Vector2(20);
|
|
||||||
|
|
||||||
Child = icon = new SpriteIcon
|
|
||||||
{
|
|
||||||
Anchor = Anchor.Centre,
|
|
||||||
Origin = Anchor.Centre,
|
|
||||||
Scale = new Vector2(0.75f),
|
|
||||||
Icon = FontAwesome.fa_close,
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override bool OnMouseDown(MouseDownEvent e)
|
|
||||||
{
|
|
||||||
icon.ScaleTo(0.5f, 1000, Easing.OutQuint);
|
|
||||||
return base.OnMouseDown(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override bool OnMouseUp(MouseUpEvent e)
|
|
||||||
{
|
|
||||||
icon.ScaleTo(0.75f, 1000, Easing.OutElastic);
|
|
||||||
return base.OnMouseUp(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override bool OnHover(HoverEvent e)
|
|
||||||
{
|
|
||||||
icon.FadeColour(Color4.Red, 200, Easing.OutQuint);
|
|
||||||
return base.OnHover(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void OnHoverLost(HoverLostEvent e)
|
|
||||||
{
|
|
||||||
icon.FadeColour(Color4.White, 200, Easing.OutQuint);
|
|
||||||
base.OnHoverLost(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class ChannelSelectorTabItem : ChannelTabItem
|
|
||||||
{
|
|
||||||
public override bool IsRemovable => false;
|
|
||||||
|
|
||||||
public override bool IsSwitchable => false;
|
|
||||||
|
|
||||||
public ChannelSelectorTabItem(Channel value) : base(value)
|
|
||||||
{
|
|
||||||
Depth = float.MaxValue;
|
|
||||||
Width = 45;
|
|
||||||
|
|
||||||
icon.Alpha = 0;
|
|
||||||
|
|
||||||
text.TextSize = 45;
|
|
||||||
textBold.TextSize = 45;
|
|
||||||
}
|
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
|
||||||
private new void load(OsuColour colour)
|
|
||||||
{
|
|
||||||
backgroundInactive = colour.Gray2;
|
|
||||||
backgroundActive = colour.Gray3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void OnActivated() => updateState();
|
|
||||||
|
|
||||||
protected override void OnDeactivated() => updateState();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -48,10 +48,6 @@ namespace osu.Game.Overlays.Chat
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Channel.NewMessagesArrived += newMessagesArrived;
|
|
||||||
Channel.MessageRemoved += messageRemoved;
|
|
||||||
Channel.PendingMessageResolved += pendingMessageResolved;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void LoadComplete()
|
protected override void LoadComplete()
|
||||||
@ -59,6 +55,11 @@ namespace osu.Game.Overlays.Chat
|
|||||||
base.LoadComplete();
|
base.LoadComplete();
|
||||||
|
|
||||||
newMessagesArrived(Channel.Messages);
|
newMessagesArrived(Channel.Messages);
|
||||||
|
|
||||||
|
Channel.NewMessagesArrived += newMessagesArrived;
|
||||||
|
Channel.MessageRemoved += messageRemoved;
|
||||||
|
Channel.PendingMessageResolved += pendingMessageResolved;
|
||||||
|
|
||||||
scrollToEnd();
|
scrollToEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -78,8 +79,6 @@ namespace osu.Game.Overlays.Chat
|
|||||||
|
|
||||||
flow.AddRange(displayMessages.Select(m => new ChatLine(m)));
|
flow.AddRange(displayMessages.Select(m => new ChatLine(m)));
|
||||||
|
|
||||||
if (!IsLoaded) return;
|
|
||||||
|
|
||||||
if (scroll.IsScrolledToEnd(10) || !flow.Children.Any() || newMessages.Any(m => m is LocalMessage))
|
if (scroll.IsScrolledToEnd(10) || !flow.Children.Any() || newMessages.Any(m => m is LocalMessage))
|
||||||
scrollToEnd();
|
scrollToEnd();
|
||||||
|
|
||||||
|
@ -11,6 +11,8 @@ namespace osu.Game.Overlays.Chat.Tabs
|
|||||||
{
|
{
|
||||||
public override bool IsRemovable => false;
|
public override bool IsRemovable => false;
|
||||||
|
|
||||||
|
public override bool IsSwitchable => false;
|
||||||
|
|
||||||
public ChannelSelectorTabItem(Channel value) : base(value)
|
public ChannelSelectorTabItem(Channel value) : base(value)
|
||||||
{
|
{
|
||||||
Depth = float.MaxValue;
|
Depth = float.MaxValue;
|
||||||
|
@ -7,8 +7,8 @@ using osu.Framework.Graphics.Containers;
|
|||||||
using osu.Game.Online.API.Requests;
|
using osu.Game.Online.API.Requests;
|
||||||
using osu.Game.Users;
|
using osu.Game.Users;
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using osu.Game.Online.API.Requests.Responses;
|
|
||||||
|
|
||||||
namespace osu.Game.Overlays.Profile.Sections.Ranks
|
namespace osu.Game.Overlays.Profile.Sections.Ranks
|
||||||
{
|
{
|
||||||
@ -39,33 +39,34 @@ namespace osu.Game.Overlays.Profile.Sections.Ranks
|
|||||||
foreach (var s in scores)
|
foreach (var s in scores)
|
||||||
s.Ruleset = Rulesets.GetRuleset(s.RulesetID);
|
s.Ruleset = Rulesets.GetRuleset(s.RulesetID);
|
||||||
|
|
||||||
ShowMoreButton.FadeTo(scores.Count == ItemsPerPage ? 1 : 0);
|
|
||||||
ShowMoreLoading.Hide();
|
|
||||||
|
|
||||||
if (!scores.Any() && VisiblePages == 1)
|
if (!scores.Any() && VisiblePages == 1)
|
||||||
{
|
{
|
||||||
|
ShowMoreButton.Hide();
|
||||||
|
ShowMoreLoading.Hide();
|
||||||
MissingText.Show();
|
MissingText.Show();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
MissingText.Hide();
|
IEnumerable<DrawableProfileScore> drawableScores;
|
||||||
|
|
||||||
foreach (APIScoreInfo score in scores)
|
|
||||||
{
|
|
||||||
DrawableProfileScore drawableScore;
|
|
||||||
|
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
drawableScore = new DrawablePerformanceScore(score, includeWeight ? Math.Pow(0.95, ItemsContainer.Count) : (double?)null);
|
drawableScores = scores.Select(score => new DrawablePerformanceScore(score, includeWeight ? Math.Pow(0.95, ItemsContainer.Count) : (double?)null));
|
||||||
break;
|
break;
|
||||||
case ScoreType.Recent:
|
case ScoreType.Recent:
|
||||||
drawableScore = new DrawableTotalScore(score);
|
drawableScores = scores.Select(score => new DrawableTotalScore(score));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ItemsContainer.Add(drawableScore);
|
LoadComponentsAsync(drawableScores, s =>
|
||||||
}
|
{
|
||||||
|
MissingText.Hide();
|
||||||
|
ShowMoreButton.FadeTo(scores.Count == ItemsPerPage ? 1 : 0);
|
||||||
|
ShowMoreLoading.Hide();
|
||||||
|
|
||||||
|
ItemsContainer.AddRange(s);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
Api.Queue(request);
|
Api.Queue(request);
|
||||||
|
@ -147,6 +147,7 @@ namespace osu.Game.Rulesets.Objects.Drawables
|
|||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Plays all the hit sounds for this <see cref="DrawableHitObject"/>.
|
/// Plays all the hit sounds for this <see cref="DrawableHitObject"/>.
|
||||||
|
/// This is invoked automatically when this <see cref="DrawableHitObject"/> is hit.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void PlaySamples() => Samples?.Play();
|
public void PlaySamples() => Samples?.Play();
|
||||||
|
|
||||||
|
@ -19,6 +19,11 @@ namespace osu.Game.Rulesets.Objects
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class HitObject
|
public class HitObject
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// A small adjustment to the start time of control points to account for rounding/precision errors.
|
||||||
|
/// </summary>
|
||||||
|
private const double control_point_leniency = 1;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The time at which the HitObject starts.
|
/// The time at which the HitObject starts.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -69,6 +74,9 @@ namespace osu.Game.Rulesets.Objects
|
|||||||
{
|
{
|
||||||
ApplyDefaultsToSelf(controlPointInfo, difficulty);
|
ApplyDefaultsToSelf(controlPointInfo, difficulty);
|
||||||
|
|
||||||
|
// This is done here since ApplyDefaultsToSelf may be used to determine the end time
|
||||||
|
SampleControlPoint = controlPointInfo.SamplePointAt(((this as IHasEndTime)?.EndTime ?? StartTime) + control_point_leniency);
|
||||||
|
|
||||||
nestedHitObjects.Clear();
|
nestedHitObjects.Clear();
|
||||||
|
|
||||||
CreateNestedHitObjects();
|
CreateNestedHitObjects();
|
||||||
@ -84,11 +92,7 @@ namespace osu.Game.Rulesets.Objects
|
|||||||
|
|
||||||
protected virtual void ApplyDefaultsToSelf(ControlPointInfo controlPointInfo, BeatmapDifficulty difficulty)
|
protected virtual void ApplyDefaultsToSelf(ControlPointInfo controlPointInfo, BeatmapDifficulty difficulty)
|
||||||
{
|
{
|
||||||
SampleControlPoint samplePoint = controlPointInfo.SamplePointAt(StartTime);
|
Kiai = controlPointInfo.EffectPointAt(StartTime + control_point_leniency).KiaiMode;
|
||||||
EffectControlPoint effectPoint = controlPointInfo.EffectPointAt(StartTime);
|
|
||||||
|
|
||||||
Kiai = effectPoint.KiaiMode;
|
|
||||||
SampleControlPoint = samplePoint;
|
|
||||||
|
|
||||||
if (HitWindows == null)
|
if (HitWindows == null)
|
||||||
HitWindows = CreateHitWindows();
|
HitWindows = CreateHitWindows();
|
||||||
|
@ -160,13 +160,12 @@ namespace osu.Game.Rulesets.Scoring
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public virtual void PopulateScore(ScoreInfo score)
|
public virtual void PopulateScore(ScoreInfo score)
|
||||||
{
|
{
|
||||||
score.TotalScore = TotalScore;
|
score.TotalScore = (int)Math.Round(TotalScore);
|
||||||
score.Combo = Combo;
|
score.Combo = Combo;
|
||||||
score.MaxCombo = HighestCombo;
|
score.MaxCombo = HighestCombo;
|
||||||
score.Accuracy = Accuracy;
|
score.Accuracy = Math.Round(Accuracy, 4);
|
||||||
score.Rank = Rank;
|
score.Rank = Rank;
|
||||||
score.Date = DateTimeOffset.Now;
|
score.Date = DateTimeOffset.Now;
|
||||||
score.Health = Health;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,12 +21,11 @@ namespace osu.Game.Scoring
|
|||||||
|
|
||||||
public ScoreRank Rank { get; set; }
|
public ScoreRank Rank { get; set; }
|
||||||
|
|
||||||
public double TotalScore { get; set; }
|
public int TotalScore { get; set; }
|
||||||
|
|
||||||
|
[Column(TypeName="DECIMAL(1,4)")]
|
||||||
public double Accuracy { get; set; }
|
public double Accuracy { get; set; }
|
||||||
|
|
||||||
public double Health { get; set; } = 1;
|
|
||||||
|
|
||||||
public double? PP { get; set; }
|
public double? PP { get; set; }
|
||||||
|
|
||||||
public int MaxCombo { get; set; }
|
public int MaxCombo { get; set; }
|
||||||
|
@ -48,7 +48,7 @@ namespace osu.Game.Screens.Play
|
|||||||
Add(content = new Container
|
Add(content = new Container
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
AlwaysPresent = true, // The hud may be hidden but certain elements may need to still be updated
|
||||||
Children = new Drawable[]
|
Children = new Drawable[]
|
||||||
{
|
{
|
||||||
ComboCounter = CreateComboCounter(),
|
ComboCounter = CreateComboCounter(),
|
||||||
|
@ -85,6 +85,17 @@ namespace osu.Game.Screens.Select
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override void ExitFromBack()
|
||||||
|
{
|
||||||
|
if (modSelect.State == Visibility.Visible)
|
||||||
|
{
|
||||||
|
modSelect.Hide();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
base.ExitFromBack();
|
||||||
|
}
|
||||||
|
|
||||||
protected override void UpdateBeatmap(WorkingBeatmap beatmap)
|
protected override void UpdateBeatmap(WorkingBeatmap beatmap)
|
||||||
{
|
{
|
||||||
beatmap.Mods.BindTo(selectedMods);
|
beatmap.Mods.BindTo(selectedMods);
|
||||||
@ -124,12 +135,6 @@ namespace osu.Game.Screens.Select
|
|||||||
|
|
||||||
protected override bool OnExiting(Screen next)
|
protected override bool OnExiting(Screen next)
|
||||||
{
|
{
|
||||||
if (modSelect.State == Visibility.Visible)
|
|
||||||
{
|
|
||||||
modSelect.Hide();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (base.OnExiting(next))
|
if (base.OnExiting(next))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
@ -191,13 +191,15 @@ namespace osu.Game.Screens.Select
|
|||||||
});
|
});
|
||||||
Add(Footer = new Footer
|
Add(Footer = new Footer
|
||||||
{
|
{
|
||||||
OnBack = Exit,
|
OnBack = ExitFromBack,
|
||||||
});
|
});
|
||||||
|
|
||||||
FooterPanels.Add(BeatmapOptions = new BeatmapOptionsOverlay());
|
FooterPanels.Add(BeatmapOptions = new BeatmapOptionsOverlay());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected virtual void ExitFromBack() => Exit();
|
||||||
|
|
||||||
[BackgroundDependencyLoader(true)]
|
[BackgroundDependencyLoader(true)]
|
||||||
private void load(BeatmapManager beatmaps, AudioManager audio, DialogOverlay dialog, OsuColour colours)
|
private void load(BeatmapManager beatmaps, AudioManager audio, DialogOverlay dialog, OsuColour colours)
|
||||||
{
|
{
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="2.1.4" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="2.1.4" />
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Version="2.1.4" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Version="2.1.4" />
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="11.0.2" />
|
<PackageReference Include="Newtonsoft.Json" Version="11.0.2" />
|
||||||
<PackageReference Include="ppy.osu.Framework" Version="2018.1120.0" />
|
<PackageReference Include="ppy.osu.Framework" Version="2018.1203.0" />
|
||||||
<PackageReference Include="SharpCompress" Version="0.22.0" />
|
<PackageReference Include="SharpCompress" Version="0.22.0" />
|
||||||
<PackageReference Include="NUnit" Version="3.11.0" />
|
<PackageReference Include="NUnit" Version="3.11.0" />
|
||||||
<PackageReference Include="SharpRaven" Version="2.4.0" />
|
<PackageReference Include="SharpRaven" Version="2.4.0" />
|
||||||
|
Loading…
Reference in New Issue
Block a user