diff --git a/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs b/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs index bd7f6b7b9d..26e4f5115f 100644 --- a/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs +++ b/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs @@ -39,11 +39,11 @@ namespace osu.Game.Rulesets.Mania.UI public ManiaPlayfield(List stageDefinition) : base(ScrollingDirection.Up) { - if (stageDefinition ==null) - throw new ArgumentNullException(); + if (stageDefinition == null) + throw new ArgumentNullException(nameof(stageDefinition)); if (stageDefinition.Count <= 0) - throw new ArgumentException("Can't have zero or fewer columns."); + throw new ArgumentException("Can't have zero or fewer stages."); Inverted.Value = true; @@ -62,32 +62,18 @@ namespace osu.Game.Rulesets.Mania.UI } }; - var currentAction = ManiaAction.Key1; - - int stageIndex = 0; - foreach (var stage in stageDefinition) + int firstColumnIndex = 0; + for (int i = 0; i < stageDefinition.Count; i++) { - var drawableStage = new ManiaStage(); - drawableStage.SpecialColumn.BindTo(SpecialColumnPosition); - drawableStage.VisibleTimeRange.BindTo(VisibleTimeRange); - drawableStage.Inverted.BindTo(Inverted); - drawableStage.ColumnStartIndex = stageIndex; + var newStage = new ManiaStage(i, firstColumnIndex, stageDefinition[i]); + newStage.SpecialColumn.BindTo(SpecialColumnPosition); + newStage.VisibleTimeRange.BindTo(VisibleTimeRange); + newStage.Inverted.BindTo(Inverted); - stages.Add(drawableStage); - AddNested(drawableStage); + stages.Add(newStage); + AddNested(newStage); - for (int i = 0; i < stage.Columns; i++) - { - var c = new Column - { - //c.Action = c.IsSpecial ? ManiaAction.Special : currentAction++; - Action = currentAction++ - }; - - drawableStage.AddColumn(c); - } - - stageIndex = stageIndex + stage.Columns; + firstColumnIndex += newStage.Columns.Count; } } @@ -95,7 +81,7 @@ namespace osu.Game.Rulesets.Mania.UI { var maniaObject = (ManiaHitObject)judgedObject.HitObject; int column = maniaObject.Column; - getStageByColumn(column).AddJudgement(judgedObject,judgement); + getStageByColumn(column).AddJudgement(judgedObject, judgement); } public override void Add(DrawableHitObject h) @@ -118,7 +104,7 @@ namespace osu.Game.Rulesets.Mania.UI int sum = 0; foreach (var stage in stages) { - sum = sum + stage.Columns.Count(); + sum = sum + stage.Columns.Count; if (sum > column) { return stage; diff --git a/osu.Game.Rulesets.Mania/UI/ManiaStage.cs b/osu.Game.Rulesets.Mania/UI/ManiaStage.cs index 78d8376b6c..f0a9f92215 100644 --- a/osu.Game.Rulesets.Mania/UI/ManiaStage.cs +++ b/osu.Game.Rulesets.Mania/UI/ManiaStage.cs @@ -11,6 +11,7 @@ using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Shapes; using osu.Game.Graphics; using osu.Game.Rulesets.Judgements; +using osu.Game.Rulesets.Mania.Beatmaps; using osu.Game.Rulesets.Mania.Objects; using osu.Game.Rulesets.Objects.Drawables; using osu.Game.Rulesets.UI.Scrolling; @@ -33,8 +34,8 @@ namespace osu.Game.Rulesets.Mania.UI public readonly Bindable SpecialColumn = new Bindable(); - public IEnumerable Columns => columns.Children; - private readonly FillFlowContainer columns; + public IReadOnlyList Columns => columnFlow.Children; + private readonly FillFlowContainer columnFlow; protected override Container Content => content; private readonly Container content; @@ -47,11 +48,17 @@ namespace osu.Game.Rulesets.Mania.UI private List normalColumnColours = new List(); private Color4 specialColumnColour; - public int ColumnStartIndex; + private readonly int stageIndex; + private readonly int firstColumnIndex; + private readonly StageDefinition definition; - public ManiaStage() + public ManiaStage(int stageIndex, int firstColumnIndex, StageDefinition definition) : base(ScrollingDirection.Up) { + this.stageIndex = stageIndex; + this.firstColumnIndex = firstColumnIndex; + this.definition = definition; + Name = "Playfield elements"; Anchor = Anchor.Centre; Origin = Anchor.Centre; @@ -79,7 +86,7 @@ namespace osu.Game.Rulesets.Mania.UI RelativeSizeAxes = Axes.Both, Colour = new Color4(0, 0, 0, 0.8f) }, - columns = new FillFlowContainer + columnFlow = new FillFlowContainer { Name = "Columns", RelativeSizeAxes = Axes.Y, @@ -121,6 +128,9 @@ namespace osu.Game.Rulesets.Mania.UI } }; + for (int i = 0; i < definition.Columns; i++) + AddColumn(new Column()); + Inverted.ValueChanged += invertedChanged; Inverted.TriggerChange(); } @@ -134,15 +144,17 @@ namespace osu.Game.Rulesets.Mania.UI public void AddColumn(Column c) { c.VisibleTimeRange.BindTo(VisibleTimeRange); + topLevelContainer.Add(c.TopLevelContainer.CreateProxy()); - columns.Add(c); + columnFlow.Add(c); AddNested(c); - Margin = new MarginPadding - { - Left = columns.Count * HIT_TARGET_POSITION / 2, - Right = columns.Count * HIT_TARGET_POSITION / 2, - }; + c.IsSpecial = isSpecialColumn(Columns.Count - 1); + + if (c.IsSpecial) + c.Action = ManiaAction.Special1 + stageIndex; + else + c.Action = ManiaAction.Key1 + firstColumnIndex + Columns.Count - 1; } /// @@ -156,25 +168,25 @@ namespace osu.Game.Rulesets.Mania.UI { default: case SpecialColumnPosition.Normal: - return columns.Count % 2 == 1 && column == columns.Count / 2; + return definition.Columns % 2 == 1 && column == definition.Columns / 2; case SpecialColumnPosition.Left: return column == 0; case SpecialColumnPosition.Right: - return column == columns.Count - 1; + return column == definition.Columns - 1; } } public override void Add(DrawableHitObject h) { - int columnIndex = ((ManiaHitObject)h.HitObject).Column - ColumnStartIndex; + int columnIndex = ((ManiaHitObject)h.HitObject).Column - firstColumnIndex; Columns.ElementAt(columnIndex).Add(h); } public void AddJudgement(DrawableHitObject judgedObject, Judgement judgement) { var maniaObject = (ManiaHitObject)judgedObject.HitObject; - int columnIndex = maniaObject.Column - ColumnStartIndex; - columns[columnIndex].OnJudgement(judgedObject, judgement); + int columnIndex = maniaObject.Column - firstColumnIndex; + Columns[columnIndex].OnJudgement(judgedObject, judgement); judgements.Clear(); judgements.Add(new DrawableManiaJudgement(judgement) @@ -187,11 +199,6 @@ namespace osu.Game.Rulesets.Mania.UI [BackgroundDependencyLoader] private void load(OsuColour colours) { - for (int i = 0; i < columns.Count; i++) - { - columns[i].IsSpecial = isSpecialColumn(i); - } - normalColumnColours = new List { colours.RedDark, @@ -221,12 +228,11 @@ namespace osu.Game.Rulesets.Mania.UI } } - protected override void Update() { // Due to masking differences, it is not possible to get the width of the columns container automatically // While masking on effectively only the Y-axis, so we need to set the width of the bar line container manually - content.Width = columns.Width; + content.Width = columnFlow.Width; } } }