From 80d5fa72431a49613067a0fddf8476234c53c684 Mon Sep 17 00:00:00 2001 From: Huo Yaoyuan Date: Thu, 13 Oct 2016 20:53:42 +0800 Subject: [PATCH 1/5] Specify HitObjectConvertException. --- osu.Game/Beatmaps/Objects/Catch/CatchConverter.cs | 2 +- osu.Game/Beatmaps/Objects/HitObjectConverter.cs | 10 ++++++++++ osu.Game/Beatmaps/Objects/Mania/ManiaConverter.cs | 2 +- osu.Game/Beatmaps/Objects/Taiko/TaikoConverter.cs | 2 +- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/osu.Game/Beatmaps/Objects/Catch/CatchConverter.cs b/osu.Game/Beatmaps/Objects/Catch/CatchConverter.cs index dbd97e90bc..317a4e9bb1 100644 --- a/osu.Game/Beatmaps/Objects/Catch/CatchConverter.cs +++ b/osu.Game/Beatmaps/Objects/Catch/CatchConverter.cs @@ -25,7 +25,7 @@ namespace osu.Game.Beatmaps.Objects.Catch { OsuBaseHit o = i as OsuBaseHit; - if (o == null) throw new Exception(@"Can't convert!"); + if (o == null) throw new HitObjectConvertException(@"Catch", i); h = new Fruit { diff --git a/osu.Game/Beatmaps/Objects/HitObjectConverter.cs b/osu.Game/Beatmaps/Objects/HitObjectConverter.cs index a70526e85a..723199d8f1 100644 --- a/osu.Game/Beatmaps/Objects/HitObjectConverter.cs +++ b/osu.Game/Beatmaps/Objects/HitObjectConverter.cs @@ -1,6 +1,7 @@ //Copyright (c) 2007-2016 ppy Pty Ltd . //Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE +using System; using System.Collections.Generic; namespace osu.Game.Beatmaps.Objects @@ -10,4 +11,13 @@ namespace osu.Game.Beatmaps.Objects { public abstract List Convert(List input); } + public class HitObjectConvertException : Exception + { + public HitObject Input { get; } + public HitObjectConvertException(string modeName, HitObject input) + : base($@"Can't convert from {input.GetType().Name} to {modeName} HitObject!") + { + Input = input; + } + } } diff --git a/osu.Game/Beatmaps/Objects/Mania/ManiaConverter.cs b/osu.Game/Beatmaps/Objects/Mania/ManiaConverter.cs index 22d8f9ae9c..cc03244709 100644 --- a/osu.Game/Beatmaps/Objects/Mania/ManiaConverter.cs +++ b/osu.Game/Beatmaps/Objects/Mania/ManiaConverter.cs @@ -28,7 +28,7 @@ namespace osu.Game.Beatmaps.Objects.Mania { OsuBaseHit o = i as OsuBaseHit; - if (o == null) throw new Exception(@"Can't convert!"); + if (o == null) throw new HitObjectConvertException(@"Mania", i); h = new Note { diff --git a/osu.Game/Beatmaps/Objects/Taiko/TaikoConverter.cs b/osu.Game/Beatmaps/Objects/Taiko/TaikoConverter.cs index 3189a0dec7..d70e8f8406 100644 --- a/osu.Game/Beatmaps/Objects/Taiko/TaikoConverter.cs +++ b/osu.Game/Beatmaps/Objects/Taiko/TaikoConverter.cs @@ -21,7 +21,7 @@ namespace osu.Game.Beatmaps.Objects.Taiko { OsuBaseHit o = i as OsuBaseHit; - if (o == null) throw new Exception(@"Can't convert!"); + if (o == null) throw new HitObjectConvertException(@"Taiko", i); h = new TaikoBaseHit { From 45a92493065ec5ee6d6b732c76e7087062bde40a Mon Sep 17 00:00:00 2001 From: Huo Yaoyuan Date: Thu, 13 Oct 2016 21:14:18 +0800 Subject: [PATCH 2/5] Move implementation of HitRender.Converter to base class using an abstract Converter property. --- osu.Game/GameModes/Play/Catch/CatchHitRenderer.cs | 7 ++++--- osu.Game/GameModes/Play/HitRenderer.cs | 5 ++++- osu.Game/GameModes/Play/Mania/ManiaHitRenderer.cs | 10 +++------- osu.Game/GameModes/Play/Osu/OsuHitRenderer.cs | 7 ++++--- osu.Game/GameModes/Play/Taiko/TaikoHitRenderer.cs | 7 ++++--- 5 files changed, 19 insertions(+), 17 deletions(-) diff --git a/osu.Game/GameModes/Play/Catch/CatchHitRenderer.cs b/osu.Game/GameModes/Play/Catch/CatchHitRenderer.cs index d8e5aaaa35..6862759035 100644 --- a/osu.Game/GameModes/Play/Catch/CatchHitRenderer.cs +++ b/osu.Game/GameModes/Play/Catch/CatchHitRenderer.cs @@ -1,7 +1,6 @@ //Copyright (c) 2007-2016 ppy Pty Ltd . //Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE -using System.Collections.Generic; using osu.Framework.Graphics; using osu.Game.Beatmaps.Objects; using osu.Game.Beatmaps.Objects.Catch; @@ -11,9 +10,11 @@ namespace osu.Game.GameModes.Play.Catch { public class CatchHitRenderer : HitRenderer { - protected override Playfield CreatePlayfield() => new CatchPlayfield(); + private static readonly CatchConverter converter = new CatchConverter(); - protected override List Convert(List objects) => new CatchConverter().Convert(objects); + protected override HitObjectConverter Converter => converter; + + protected override Playfield CreatePlayfield() => new CatchPlayfield(); protected override Drawable GetVisualRepresentation(CatchBaseHit h) => new DrawableFruit(h); } diff --git a/osu.Game/GameModes/Play/HitRenderer.cs b/osu.Game/GameModes/Play/HitRenderer.cs index b18d9ebb6d..53cca2072c 100644 --- a/osu.Game/GameModes/Play/HitRenderer.cs +++ b/osu.Game/GameModes/Play/HitRenderer.cs @@ -10,6 +10,7 @@ using osu.Framework; namespace osu.Game.GameModes.Play { public abstract class HitRenderer : Container + where T : HitObject { private List objects; @@ -27,7 +28,9 @@ namespace osu.Game.GameModes.Play protected abstract Playfield CreatePlayfield(); - protected abstract List Convert(List objects); + protected abstract HitObjectConverter Converter { get; } + + protected virtual List Convert(List objects) => Converter.Convert(objects); public override void Load(BaseGame game) { diff --git a/osu.Game/GameModes/Play/Mania/ManiaHitRenderer.cs b/osu.Game/GameModes/Play/Mania/ManiaHitRenderer.cs index 302f40878b..ef74fd4a7a 100644 --- a/osu.Game/GameModes/Play/Mania/ManiaHitRenderer.cs +++ b/osu.Game/GameModes/Play/Mania/ManiaHitRenderer.cs @@ -1,12 +1,11 @@ //Copyright (c) 2007-2016 ppy Pty Ltd . //Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE +using OpenTK; using osu.Framework.Graphics; using osu.Game.Beatmaps.Objects; using osu.Game.Beatmaps.Objects.Mania; -using OpenTK; using osu.Game.Beatmaps.Objects.Mania.Drawable; -using System.Collections.Generic; namespace osu.Game.GameModes.Play.Mania { @@ -17,13 +16,10 @@ namespace osu.Game.GameModes.Play.Mania public ManiaHitRenderer(int columns = 5) { this.columns = columns; + Converter = new ManiaConverter(columns); } - protected override List Convert(List objects) - { - ManiaConverter converter = new ManiaConverter(columns); - return converter.Convert(objects); - } + protected override HitObjectConverter Converter { get; } protected override Playfield CreatePlayfield() => new ManiaPlayfield(columns); diff --git a/osu.Game/GameModes/Play/Osu/OsuHitRenderer.cs b/osu.Game/GameModes/Play/Osu/OsuHitRenderer.cs index 130d6d212f..78532b8f25 100644 --- a/osu.Game/GameModes/Play/Osu/OsuHitRenderer.cs +++ b/osu.Game/GameModes/Play/Osu/OsuHitRenderer.cs @@ -1,7 +1,6 @@ //Copyright (c) 2007-2016 ppy Pty Ltd . //Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE -using System.Collections.Generic; using osu.Framework.Graphics; using osu.Game.Beatmaps.Objects; using osu.Game.Beatmaps.Objects.Osu; @@ -11,9 +10,11 @@ namespace osu.Game.GameModes.Play.Osu { public class OsuHitRenderer : HitRenderer { - protected override Playfield CreatePlayfield() => new OsuPlayfield(); + private static readonly OsuConverter converter = new OsuConverter(); - protected override List Convert(List objects) => new OsuConverter().Convert(objects); + protected override HitObjectConverter Converter => converter; + + protected override Playfield CreatePlayfield() => new OsuPlayfield(); protected override Drawable GetVisualRepresentation(OsuBaseHit h) => new DrawableCircle(h); } diff --git a/osu.Game/GameModes/Play/Taiko/TaikoHitRenderer.cs b/osu.Game/GameModes/Play/Taiko/TaikoHitRenderer.cs index 9fab5998f5..54d1eefab1 100644 --- a/osu.Game/GameModes/Play/Taiko/TaikoHitRenderer.cs +++ b/osu.Game/GameModes/Play/Taiko/TaikoHitRenderer.cs @@ -1,7 +1,6 @@ //Copyright (c) 2007-2016 ppy Pty Ltd . //Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE -using System.Collections.Generic; using osu.Framework.Graphics; using osu.Game.Beatmaps.Objects; using osu.Game.Beatmaps.Objects.Taiko; @@ -11,10 +10,12 @@ namespace osu.Game.GameModes.Play.Taiko { public class TaikoHitRenderer : HitRenderer { - protected override List Convert(List objects) => new TaikoConverter().Convert(objects); + private static readonly TaikoConverter converter = new TaikoConverter(); + + protected override HitObjectConverter Converter => converter; protected override Playfield CreatePlayfield() => new TaikoPlayfield(); protected override Drawable GetVisualRepresentation(TaikoBaseHit h) => new DrawableTaikoHit(h); } -} \ No newline at end of file +} From aad5c6a44dd8f237e04ea648ded9f1dbf7790da3 Mon Sep 17 00:00:00 2001 From: Huo Yaoyuan Date: Thu, 13 Oct 2016 21:42:51 +0800 Subject: [PATCH 3/5] Use DateTimeOffset for message timestamp. --- osu.Game/Online/Chat/Display/ChatLine.cs | 2 +- osu.Game/Online/Chat/Message.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/osu.Game/Online/Chat/Display/ChatLine.cs b/osu.Game/Online/Chat/Display/ChatLine.cs index 5032ff0b9f..92146be0b2 100644 --- a/osu.Game/Online/Chat/Display/ChatLine.cs +++ b/osu.Game/Online/Chat/Display/ChatLine.cs @@ -43,7 +43,7 @@ namespace osu.Game.Online.Chat.Display { new SpriteText { - Text = Message.Timestamp.ToLocalTime().ToLongTimeString(), + Text = Message.Timestamp.LocalDateTime.ToLongTimeString(), TextSize = text_size, Colour = new Color4(128, 128, 128, 255) }, diff --git a/osu.Game/Online/Chat/Message.cs b/osu.Game/Online/Chat/Message.cs index 5b344da22c..9fb9668f64 100644 --- a/osu.Game/Online/Chat/Message.cs +++ b/osu.Game/Online/Chat/Message.cs @@ -18,7 +18,7 @@ namespace osu.Game.Online.Chat public int ChannelId; [JsonProperty(@"timestamp")] - public DateTime Timestamp; + public DateTimeOffset Timestamp; [JsonProperty(@"content")] public string Content; From ac66c0899144e7a46f30bd4d55b90e581f5b9b9b Mon Sep 17 00:00:00 2001 From: Huo Yaoyuan Date: Thu, 13 Oct 2016 21:55:49 +0800 Subject: [PATCH 4/5] Make converter per-instance. --- osu.Game/GameModes/Play/Catch/CatchHitRenderer.cs | 4 +--- osu.Game/GameModes/Play/Osu/OsuHitRenderer.cs | 4 +--- osu.Game/GameModes/Play/Taiko/TaikoHitRenderer.cs | 4 +--- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/osu.Game/GameModes/Play/Catch/CatchHitRenderer.cs b/osu.Game/GameModes/Play/Catch/CatchHitRenderer.cs index 6862759035..d086c78956 100644 --- a/osu.Game/GameModes/Play/Catch/CatchHitRenderer.cs +++ b/osu.Game/GameModes/Play/Catch/CatchHitRenderer.cs @@ -10,9 +10,7 @@ namespace osu.Game.GameModes.Play.Catch { public class CatchHitRenderer : HitRenderer { - private static readonly CatchConverter converter = new CatchConverter(); - - protected override HitObjectConverter Converter => converter; + protected override HitObjectConverter Converter { get; } = new CatchConverter(); protected override Playfield CreatePlayfield() => new CatchPlayfield(); diff --git a/osu.Game/GameModes/Play/Osu/OsuHitRenderer.cs b/osu.Game/GameModes/Play/Osu/OsuHitRenderer.cs index 78532b8f25..005bcba6c3 100644 --- a/osu.Game/GameModes/Play/Osu/OsuHitRenderer.cs +++ b/osu.Game/GameModes/Play/Osu/OsuHitRenderer.cs @@ -10,9 +10,7 @@ namespace osu.Game.GameModes.Play.Osu { public class OsuHitRenderer : HitRenderer { - private static readonly OsuConverter converter = new OsuConverter(); - - protected override HitObjectConverter Converter => converter; + protected override HitObjectConverter Converter { get; } = new OsuConverter(); protected override Playfield CreatePlayfield() => new OsuPlayfield(); diff --git a/osu.Game/GameModes/Play/Taiko/TaikoHitRenderer.cs b/osu.Game/GameModes/Play/Taiko/TaikoHitRenderer.cs index 54d1eefab1..1818cb1695 100644 --- a/osu.Game/GameModes/Play/Taiko/TaikoHitRenderer.cs +++ b/osu.Game/GameModes/Play/Taiko/TaikoHitRenderer.cs @@ -10,9 +10,7 @@ namespace osu.Game.GameModes.Play.Taiko { public class TaikoHitRenderer : HitRenderer { - private static readonly TaikoConverter converter = new TaikoConverter(); - - protected override HitObjectConverter Converter => converter; + protected override HitObjectConverter Converter { get; } = new TaikoConverter(); protected override Playfield CreatePlayfield() => new TaikoPlayfield(); From cb54d33c6e99694ca1ac36c77a6e4b6ab39c49b8 Mon Sep 17 00:00:00 2001 From: Huo Yaoyuan Date: Fri, 14 Oct 2016 17:48:07 +0800 Subject: [PATCH 5/5] Make converter instance per-convert. --- osu.Game/GameModes/Play/Catch/CatchHitRenderer.cs | 2 +- osu.Game/GameModes/Play/Mania/ManiaHitRenderer.cs | 3 +-- osu.Game/GameModes/Play/Osu/OsuHitRenderer.cs | 2 +- osu.Game/GameModes/Play/Taiko/TaikoHitRenderer.cs | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/osu.Game/GameModes/Play/Catch/CatchHitRenderer.cs b/osu.Game/GameModes/Play/Catch/CatchHitRenderer.cs index d086c78956..3de1c34915 100644 --- a/osu.Game/GameModes/Play/Catch/CatchHitRenderer.cs +++ b/osu.Game/GameModes/Play/Catch/CatchHitRenderer.cs @@ -10,7 +10,7 @@ namespace osu.Game.GameModes.Play.Catch { public class CatchHitRenderer : HitRenderer { - protected override HitObjectConverter Converter { get; } = new CatchConverter(); + protected override HitObjectConverter Converter => new CatchConverter(); protected override Playfield CreatePlayfield() => new CatchPlayfield(); diff --git a/osu.Game/GameModes/Play/Mania/ManiaHitRenderer.cs b/osu.Game/GameModes/Play/Mania/ManiaHitRenderer.cs index ef74fd4a7a..93b9a58822 100644 --- a/osu.Game/GameModes/Play/Mania/ManiaHitRenderer.cs +++ b/osu.Game/GameModes/Play/Mania/ManiaHitRenderer.cs @@ -16,10 +16,9 @@ namespace osu.Game.GameModes.Play.Mania public ManiaHitRenderer(int columns = 5) { this.columns = columns; - Converter = new ManiaConverter(columns); } - protected override HitObjectConverter Converter { get; } + protected override HitObjectConverter Converter => new ManiaConverter(columns); protected override Playfield CreatePlayfield() => new ManiaPlayfield(columns); diff --git a/osu.Game/GameModes/Play/Osu/OsuHitRenderer.cs b/osu.Game/GameModes/Play/Osu/OsuHitRenderer.cs index 005bcba6c3..331882da73 100644 --- a/osu.Game/GameModes/Play/Osu/OsuHitRenderer.cs +++ b/osu.Game/GameModes/Play/Osu/OsuHitRenderer.cs @@ -10,7 +10,7 @@ namespace osu.Game.GameModes.Play.Osu { public class OsuHitRenderer : HitRenderer { - protected override HitObjectConverter Converter { get; } = new OsuConverter(); + protected override HitObjectConverter Converter => new OsuConverter(); protected override Playfield CreatePlayfield() => new OsuPlayfield(); diff --git a/osu.Game/GameModes/Play/Taiko/TaikoHitRenderer.cs b/osu.Game/GameModes/Play/Taiko/TaikoHitRenderer.cs index 1818cb1695..bee74d5451 100644 --- a/osu.Game/GameModes/Play/Taiko/TaikoHitRenderer.cs +++ b/osu.Game/GameModes/Play/Taiko/TaikoHitRenderer.cs @@ -10,7 +10,7 @@ namespace osu.Game.GameModes.Play.Taiko { public class TaikoHitRenderer : HitRenderer { - protected override HitObjectConverter Converter { get; } = new TaikoConverter(); + protected override HitObjectConverter Converter => new TaikoConverter(); protected override Playfield CreatePlayfield() => new TaikoPlayfield();