diff --git a/osu b/osu index 3eb5267..aa5afc3 160000 --- a/osu +++ b/osu @@ -1 +1 @@ -Subproject commit 3eb5267651e634f36d28a8ba67b14dcfb24c0bb4 +Subproject commit aa5afc30ef2e39d5af3171d72fd44cc8da2c5c03 diff --git a/osu.Game.Rulesets.Pippidon/Beatmaps/PippidonBeatmapConverter.cs b/osu.Game.Rulesets.Pippidon/Beatmaps/PippidonBeatmapConverter.cs new file mode 100644 index 0000000..6aee753 --- /dev/null +++ b/osu.Game.Rulesets.Pippidon/Beatmaps/PippidonBeatmapConverter.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using osu.Game.Beatmaps; +using osu.Game.Rulesets.Beatmaps; +using osu.Game.Rulesets.Objects; +using osu.Game.Rulesets.Pippidon.Objects; +using osu.Game.Rulesets.Objects.Types; + +namespace osu.Game.Rulesets.Pippidon.Beatmaps +{ + public class PippidonBeatmapConverter : BeatmapConverter + { + protected override IEnumerable ValidConversionTypes => new[] { typeof(IHasXPosition) , typeof(IHasYPosition) }; + + private Dictionary floatRanges = new Dictionary(); + + protected override IEnumerable ConvertHitObject(HitObject original, Beatmap beatmap) + { + float pos = (original as IHasYPosition)?.Y ?? (original as IHasXPosition).X; + + if (!floatRanges.ContainsKey(beatmap)) + calcRange(beatmap); + + yield return new PippidonObject + { + Samples = original.Samples, + StartTime = original.StartTime, + Lane = (int)((pos - floatRanges[beatmap].Min) / floatRanges[beatmap].Range * 3) - 1 + }; + } + + private void calcRange(Beatmap beatmap) + { + List positions = beatmap.HitObjects.OfType().Select(hitObject => hitObject.Y).ToList(); + if(!positions.Any()) + positions = beatmap.HitObjects.OfType().Select(hitObject => hitObject.X).ToList(); + + floatRanges[beatmap] = new FloatRange + { + Min = positions.Min(), + Max = positions.Max() + 1, //So we exclude ones later + }; + } + + private class FloatRange + { + public float Max, Min; + public float Range => Max - Min; + } + } +} diff --git a/osu.Game.Rulesets.Pippidon/Judgements/PippidonJudgement.cs b/osu.Game.Rulesets.Pippidon/Judgements/PippidonJudgement.cs new file mode 100644 index 0000000..ce19fd4 --- /dev/null +++ b/osu.Game.Rulesets.Pippidon/Judgements/PippidonJudgement.cs @@ -0,0 +1,12 @@ +using osu.Game.Rulesets.Judgements; +using osu.Game.Rulesets.Objects.Drawables; + +namespace osu.Game.Rulesets.Pippidon.Judgements +{ + public class PippidonJudgement : Judgement + { + public override string ResultString => ""; + + public override string MaxResultString => ""; + } +} diff --git a/osu.Game.Rulesets.Pippidon/Mods/PippidonMods.cs b/osu.Game.Rulesets.Pippidon/Mods/PippidonMods.cs new file mode 100644 index 0000000..4e6c65b --- /dev/null +++ b/osu.Game.Rulesets.Pippidon/Mods/PippidonMods.cs @@ -0,0 +1,18 @@ +using osu.Game.Beatmaps; +using osu.Game.Rulesets.Mods; +using osu.Game.Rulesets.Pippidon.Objects; +using osu.Game.Rulesets.Scoring; +using osu.Game.Users; +using osu.Game.Rulesets.Pippidon.Replays; + +namespace osu.Game.Rulesets.Pippidon.Mods +{ + public class PippidonModAutoplay : ModAutoplay + { + protected override Score CreateReplayScore(Beatmap beatmap) => new Score + { + User = new User { Username = "pippidon" }, + Replay = new PippidonAutoGenerator(beatmap).Generate(), + }; + } +} diff --git a/osu.Game.Rulesets.Pippidon/Objects/Drawables/Coin.cs b/osu.Game.Rulesets.Pippidon/Objects/Drawables/Coin.cs new file mode 100644 index 0000000..4296bc7 --- /dev/null +++ b/osu.Game.Rulesets.Pippidon/Objects/Drawables/Coin.cs @@ -0,0 +1,54 @@ +using osu.Framework.Graphics.Sprites; +using osu.Framework.Graphics.Textures; +using osu.Framework.Graphics; +using osu.Game.Rulesets.Objects.Drawables; +using osu.Game.Rulesets.Pippidon.Judgements; +using OpenTK; +using System; + +namespace osu.Game.Rulesets.Pippidon.Objects.Drawables +{ + public class Coin : DrawableScrollingHitObject + { + private readonly Func touchingPippi; + + public Coin(PippidonObject hitObject, TextureStore textures, Func touchingPippi) : base(hitObject) + { + Size = new Vector2(40); + Y = hitObject.Lane * 79; + + this.touchingPippi = touchingPippi; + + Add(new Sprite + { + RelativeSizeAxes = Axes.Both, + Texture = textures.Get("coin"), + }); + } + + protected override void Update() + { + base.Update(); + + if (HitObject.StartTime < Time.Current) + UpdateJudgement(true); + } + + protected override void CheckJudgement(bool userTriggered) + { + if (HitObject.StartTime < Time.Current) + { + Judgement.Result = touchingPippi(HitObject.Lane) ? HitResult.Hit : HitResult.Miss; + Judgement.TimeOffset = Time.Current - HitObject.StartTime; + } + } + + protected override PippidonJudgement CreateJudgement() => new PippidonJudgement(); + + protected override void UpdateState(ArmedState state) + { + if (state == ArmedState.Hit) + this.ScaleTo(5, 1500, Easing.OutQuint).FadeOut(1500, Easing.OutQuint).Expire(); + } + } +} diff --git a/osu.Game.Rulesets.Pippidon/Objects/PippidonObject.cs b/osu.Game.Rulesets.Pippidon/Objects/PippidonObject.cs new file mode 100644 index 0000000..54c905d --- /dev/null +++ b/osu.Game.Rulesets.Pippidon/Objects/PippidonObject.cs @@ -0,0 +1,12 @@ +using osu.Game.Rulesets.Objects; + +namespace osu.Game.Rulesets.Pippidon.Objects +{ + public class PippidonObject : HitObject + { + /// + /// Range = [-1,1] + /// + public int Lane; + } +} diff --git a/osu.Game.Rulesets.Pippidon/PippidonDifficultyCalculator.cs b/osu.Game.Rulesets.Pippidon/PippidonDifficultyCalculator.cs new file mode 100644 index 0000000..397bf8e --- /dev/null +++ b/osu.Game.Rulesets.Pippidon/PippidonDifficultyCalculator.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; +using osu.Game.Beatmaps; + +namespace osu.Game.Rulesets.Pippidon +{ + public class PippidonDifficultyCalculator : DifficultyCalculator + { + protected override double CalculateInternal(Dictionary categoryDifficulty) + { + return 0; + } + } +} diff --git a/osu.Game.Rulesets.Pippidon/PippidonInputManager.cs b/osu.Game.Rulesets.Pippidon/PippidonInputManager.cs new file mode 100644 index 0000000..5581eb4 --- /dev/null +++ b/osu.Game.Rulesets.Pippidon/PippidonInputManager.cs @@ -0,0 +1,24 @@ +using osu.Framework.Input.Bindings; +using osu.Game.Input.Bindings; +using System.ComponentModel; + +namespace osu.Game.Rulesets.Pippidon +{ + public class PippidonInputManager : DatabasedKeyBindingInputManager + { + public PippidonInputManager(RulesetInfo ruleset) : base(ruleset, 0, SimultaneousBindingMode.Unique) + { + } + } + + + public enum PippidonAction + { + [Description("Move up")] + MoveUp, + [Description("Move down")] + MoveDown, + [Description("Boost")] + Boost + } +} diff --git a/osu.Game.Rulesets.Pippidon/PippidonRuleset.cs b/osu.Game.Rulesets.Pippidon/PippidonRuleset.cs new file mode 100644 index 0000000..e25057a --- /dev/null +++ b/osu.Game.Rulesets.Pippidon/PippidonRuleset.cs @@ -0,0 +1,71 @@ +using System.Collections.Generic; +using osu.Game.Beatmaps; +using osu.Game.Rulesets.Mods; +using osu.Game.Rulesets.Scoring; +using osu.Game.Rulesets.UI; +using osu.Game.Screens.Play; +using osu.Game.Rulesets.Pippidon.UI; +using OpenTK.Input; +using osu.Framework.Input.Bindings; +using osu.Game.Rulesets.Pippidon.Scoring; +using osu.Framework.IO.Stores; +using osu.Framework.Graphics.Textures; +using osu.Framework.Graphics; +using osu.Framework.Graphics.Sprites; +using osu.Game.Rulesets.Pippidon.Mods; + +namespace osu.Game.Rulesets.Pippidon +{ + public class PippidonRuleset : Ruleset + { + public ResourceStore ResourceStore; + public TextureStore TextureStore; + + public PippidonRuleset(RulesetInfo rulesetInfo) : base(rulesetInfo) + { + ResourceStore = new NamespacedResourceStore(new DllResourceStore("osu.Game.Rulesets.Pippidon.dll"), "Resources"); + TextureStore = new TextureStore(new RawTextureLoaderStore(new NamespacedResourceStore(ResourceStore, @"Textures"))); + } + + public override string Description => "pippipidoooooon"; + + public override DifficultyCalculator CreateDifficultyCalculator(Beatmap beatmap) => new PippidonDifficultyCalculator(); + + public override IEnumerable CreateGameplayKeys() => new[] + { + new KeyCounterKeyboard(Key.W), + new KeyCounterKeyboard(Key.S), + new KeyCounterKeyboard(Key.D), + }; + + public override RulesetContainer CreateRulesetContainerWith(WorkingBeatmap beatmap, bool isForCurrentRuleset) => new PippidonRulesetContainer(this, beatmap, isForCurrentRuleset); + + public override ScoreProcessor CreateScoreProcessor() => new PippidonScoreProcessor(); + + public override Mod GetAutoplayMod() => new ModAutoplay(); + + public override IEnumerable GetModsFor(ModType type) + { + switch (type) + { + case ModType.Special: + return new[] { new PippidonModAutoplay() }; + default: + return new Mod[] { null }; + } + } + + public override IEnumerable GetDefaultKeyBindings(int variant = 0) => new[] + { + new KeyBinding(InputKey.W, PippidonAction.MoveUp), + new KeyBinding(InputKey.S, PippidonAction.MoveDown), + new KeyBinding(InputKey.D, PippidonAction.Boost), + }; + + public override Drawable CreateIcon() => new Sprite + { + Margin = new MarginPadding { Top = 3 }, + Texture = TextureStore.Get("coin"), + }; + } +} diff --git a/osu.Game.Rulesets.Pippidon/Properties/AssemblyInfo.cs b/osu.Game.Rulesets.Pippidon/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..6311b8a --- /dev/null +++ b/osu.Game.Rulesets.Pippidon/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("osu.Game.Rulesets.Pippidon")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("osu.Game.Rulesets.Pippidon")] +[assembly: AssemblyCopyright("Copyright © 2017")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("5ae1f0f1-dafa-46e7-959c-da233b7c87e9")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/osu.Game.Rulesets.Pippidon/Replays/PippidonAutoGenerator.cs b/osu.Game.Rulesets.Pippidon/Replays/PippidonAutoGenerator.cs new file mode 100644 index 0000000..b8d7a9a --- /dev/null +++ b/osu.Game.Rulesets.Pippidon/Replays/PippidonAutoGenerator.cs @@ -0,0 +1,65 @@ +using osu.Game.Beatmaps; +using osu.Game.Rulesets.Pippidon.Objects; +using osu.Game.Rulesets.Replays; +using osu.Game.Users; +using System.Collections.Generic; +using System; + +namespace osu.Game.Rulesets.Pippidon.Replays +{ + public class PippidonAutoGenerator : AutoGenerator + { + protected Replay Replay; + protected List Frames => Replay.Frames; + + public PippidonAutoGenerator(Beatmap beatmap) : base(beatmap) + { + Replay = new Replay + { + User = new User + { + Username = @"Autoplay", + } + }; + } + + public override Replay Generate() + { + Frames.Add(new ReplayFrame(-100000, null, null, ReplayButtonState.None)); + Frames.Add(new ReplayFrame(Beatmap.HitObjects[0].StartTime - 1000, null, null, ReplayButtonState.None)); + + double lastTime = Beatmap.HitObjects[0].StartTime - 1000; + int lastLane = 0; + foreach(PippidonObject hitObject in Beatmap.HitObjects) + { + double time = (lastTime + hitObject.StartTime) / 2; + lastTime = hitObject.StartTime; + + if (lastLane == hitObject.Lane) + continue; + + ReplayButtonState button; //Left = Up, Right = Down + switch (lastLane) + { + case -1: + button = hitObject.Lane == 0 ? ReplayButtonState.Right1 : ReplayButtonState.Left1; + break; + case 0: + button = hitObject.Lane == 1 ? ReplayButtonState.Right1 : ReplayButtonState.Left1; + break; + case 1: + button = hitObject.Lane == -1 ? ReplayButtonState.Right1 : ReplayButtonState.Left1; + break; + default: + throw new Exception("Unknown lane"); + } + + Frames.Add(new ReplayFrame(time, null, null, button)); + Frames.Add(new ReplayFrame(time + KEY_UP_DELAY, null, null, ReplayButtonState.None)); + lastLane = hitObject.Lane; + } + + return Replay; + } + } +} \ No newline at end of file diff --git a/osu.Game.Rulesets.Pippidon/Replays/PippidonFramedReplayInputHandler.cs b/osu.Game.Rulesets.Pippidon/Replays/PippidonFramedReplayInputHandler.cs new file mode 100644 index 0000000..3765e53 --- /dev/null +++ b/osu.Game.Rulesets.Pippidon/Replays/PippidonFramedReplayInputHandler.cs @@ -0,0 +1,29 @@ +using osu.Game.Rulesets.Replays; +using System.Collections.Generic; +using osu.Framework.Input; +using OpenTK.Input; + +namespace osu.Game.Rulesets.Pippidon.Replays +{ + public class PippidonFramedReplayInputHandler : FramedReplayInputHandler + { + public PippidonFramedReplayInputHandler(Replay replay) : base(replay) + { + } + + public override List GetPendingStates() + { + var keys = new List(); + + if (CurrentFrame?.MouseRight1 == true) + keys.Add(Key.S); + if (CurrentFrame?.MouseLeft1 == true) + keys.Add(Key.W); + + return new List + { + new InputState { Keyboard = new ReplayKeyboardState(keys) } + }; + } + } +} diff --git a/osu.Game.Rulesets.Pippidon/Resources/Samples/coins-earn.mp3 b/osu.Game.Rulesets.Pippidon/Resources/Samples/coins-earn.mp3 new file mode 100644 index 0000000..90b13d1 Binary files /dev/null and b/osu.Game.Rulesets.Pippidon/Resources/Samples/coins-earn.mp3 differ diff --git a/osu.Game.Rulesets.Pippidon/Resources/Textures/coin.png b/osu.Game.Rulesets.Pippidon/Resources/Textures/coin.png new file mode 100644 index 0000000..3cd89c6 Binary files /dev/null and b/osu.Game.Rulesets.Pippidon/Resources/Textures/coin.png differ diff --git a/osu.Game.Rulesets.Pippidon/Resources/Textures/pippidon.png b/osu.Game.Rulesets.Pippidon/Resources/Textures/pippidon.png new file mode 100644 index 0000000..e79d252 Binary files /dev/null and b/osu.Game.Rulesets.Pippidon/Resources/Textures/pippidon.png differ diff --git a/osu.Game.Rulesets.Pippidon/Scoring/PippidonScoreProcessor.cs b/osu.Game.Rulesets.Pippidon/Scoring/PippidonScoreProcessor.cs new file mode 100644 index 0000000..770a244 --- /dev/null +++ b/osu.Game.Rulesets.Pippidon/Scoring/PippidonScoreProcessor.cs @@ -0,0 +1,35 @@ +using osu.Game.Rulesets.Objects.Drawables; +using osu.Game.Rulesets.Pippidon.Judgements; +using osu.Game.Rulesets.Pippidon.Objects; +using osu.Game.Rulesets.Scoring; +using osu.Game.Rulesets.UI; +using System.Linq; + +namespace osu.Game.Rulesets.Pippidon.Scoring +{ + public class PippidonScoreProcessor : ScoreProcessor + { + public PippidonScoreProcessor() + { + } + + public PippidonScoreProcessor(RulesetContainer ruleset) : base(ruleset) + { + } + + protected override void OnNewJudgement(PippidonJudgement judgement) + { + Accuracy.Value = Judgements.Where(judgement_ => judgement_.Result == HitResult.Hit).Count() / (float)Judgements.Count; + if (judgement.Result == HitResult.Hit) + TotalScore.Value++; + } + + protected override void Reset() + { + base.Reset(); + + Health.Value = 1; + Accuracy.Value = 1; + } + } +} diff --git a/osu.Game.Rulesets.Pippidon/UI/PippidonPlayfield.cs b/osu.Game.Rulesets.Pippidon/UI/PippidonPlayfield.cs new file mode 100644 index 0000000..389e365 --- /dev/null +++ b/osu.Game.Rulesets.Pippidon/UI/PippidonPlayfield.cs @@ -0,0 +1,178 @@ +using osu.Game.Rulesets.UI; +using osu.Game.Rulesets.Pippidon.Judgements; +using osu.Game.Rulesets.Pippidon.Objects; +using osu.Framework.Graphics; +using osu.Framework.Graphics.Shapes; +using osu.Game.Graphics; +using osu.Framework.Allocation; +using osu.Framework.Audio; +using osu.Framework.Graphics.Sprites; +using OpenTK; +using osu.Framework.Input.Bindings; +using osu.Game.Graphics.Containers; +using osu.Framework.Audio.Track; +using osu.Game.Beatmaps.ControlPoints; +using osu.Framework.Graphics.Containers; +using osu.Framework.Graphics.Textures; + +namespace osu.Game.Rulesets.Pippidon.UI +{ + public class PippidonPlayfield : ScrollingPlayfield + { + private readonly PippidonRuleset ruleset; + + private readonly Container content; + + protected override Container Content => content; + + private PippidonContainer pippidon; + public int PippidonLane => pippidon.LanePosition - 1; + + public PippidonPlayfield(PippidonRuleset ruleset) : base(Axes.X) + { + this.ruleset = ruleset; + + VisibleTimeRange.Value = 6000; + + AddRangeInternal(new Drawable[] + { + content = new Container + { + RelativeSizeAxes = Axes.Both, + Padding = new MarginPadding { Left = 200 }, + Anchor = Anchor.CentreRight, + Origin = Anchor.CentreRight, + }, + new LaneContainer + { + RelativeSizeAxes = Axes.X, + Height = 70, + Anchor = Anchor.CentreLeft, + Origin = Anchor.CentreLeft, + Depth = 1, + }, + pippidon = new PippidonContainer + { + Size = new Vector2(70), + Texture = ruleset.TextureStore.Get("pippidon"), + Anchor = Anchor.CentreLeft, + Origin = Anchor.CentreRight, + X = 200, + }, + }); + } + + private class LaneContainer : BeatSyncedContainer + { + private OsuColour osuColour; + + [BackgroundDependencyLoader] + private void load(OsuColour colour) + { + Colour = colour.BlueLight; + osuColour = colour; + + Children = new[] + { + new Box + { + RelativeSizeAxes = Axes.Both, + }, + new Box + { + RelativeSizeAxes = Axes.Both, + Anchor = Anchor.BottomLeft, + Origin = Anchor.TopLeft, + Y = 2, + }, + new Box + { + RelativeSizeAxes = Axes.Both, + Anchor = Anchor.TopLeft, + Origin = Anchor.BottomLeft, + Y = -2, + }, + }; + } + + protected override void OnNewBeat(int beatIndex, TimingControlPoint timingPoint, EffectControlPoint effectPoint, TrackAmplitudes amplitudes) + { + + if (effectPoint.KiaiMode) + this.FadeColour(osuColour.PinkLight, 1000); + else + this.FadeColour(osuColour.BlueLight, 1000); + } + } + + private class PippidonContainer : BeatSyncedContainer, IKeyBindingHandler + { + public override bool HandleInput => true; + + public int LanePosition + { + get + { + return (int)(Y / Height) + 1; + } + set + { + Y = ((value + 3) % 3 - 1) * Height; + } + } + + public Texture Texture + { + set + { + (Child as Sprite).Texture = value; + } + } + + public PippidonContainer() + { + Child = new Sprite + { + RelativeSizeAxes = Axes.Both, + }; + } + + protected override void OnNewBeat(int beatIndex, TimingControlPoint timingPoint, EffectControlPoint effectPoint, TrackAmplitudes amplitudes) + { + if (effectPoint.KiaiMode) + { + bool rightward = beatIndex % 2 == 1; + double duration = timingPoint.BeatLength / 2; + + Child.RotateTo(rightward ? 10 : -10, duration * 2, Easing.InOutSine); + + Child.Animate(i => i.MoveToY(-10, duration, Easing.Out)) + .Then(i => i.MoveToY(0, duration, Easing.In)); + } + else + { + Child.ClearTransforms(); + Child.RotateTo(0, 500, Easing.Out); + Child.MoveTo(Vector2.Zero, 500, Easing.Out); + } + } + + public bool OnPressed(PippidonAction action) + { + switch (action) + { + case PippidonAction.MoveUp: + LanePosition--; + return true; + case PippidonAction.MoveDown: + LanePosition++; + return true; + default: + return false; + } + } + + public bool OnReleased(PippidonAction action) => false; + } + } +} \ No newline at end of file diff --git a/osu.Game.Rulesets.Pippidon/UI/PippidonRulesetContainer.cs b/osu.Game.Rulesets.Pippidon/UI/PippidonRulesetContainer.cs new file mode 100644 index 0000000..298d2cf --- /dev/null +++ b/osu.Game.Rulesets.Pippidon/UI/PippidonRulesetContainer.cs @@ -0,0 +1,47 @@ +using osu.Game.Beatmaps; +using osu.Game.Rulesets.Beatmaps; +using osu.Game.Rulesets.Objects.Drawables; +using osu.Game.Rulesets.Pippidon.Judgements; +using osu.Game.Rulesets.Pippidon.Objects; +using osu.Game.Rulesets.Scoring; +using osu.Game.Rulesets.UI; +using osu.Game.Rulesets.Pippidon.Scoring; +using osu.Game.Rulesets.Pippidon.Beatmaps; +using osu.Framework.Input; +using osu.Framework.Graphics; +using osu.Game.Rulesets.Pippidon.Objects.Drawables; +using osu.Game.Rulesets.Replays; +using osu.Game.Rulesets.Pippidon.Replays; + +namespace osu.Game.Rulesets.Pippidon.UI +{ + public class PippidonRulesetContainer : ScrollingRulesetContainer + { + private PippidonRuleset pippidonRuleset; + + public PippidonRulesetContainer(PippidonRuleset ruleset, WorkingBeatmap beatmap, bool isForCurrentRuleset) : base(ruleset, beatmap, isForCurrentRuleset) + { + pippidonRuleset = ruleset; + AspectAdjust = false; + } + + public override ScoreProcessor CreateScoreProcessor() => new PippidonScoreProcessor(this); + + protected override BeatmapConverter CreateBeatmapConverter() => new PippidonBeatmapConverter(); + + protected override Playfield CreatePlayfield() => new PippidonPlayfield(pippidonRuleset); + + protected override DrawableHitObject GetVisualRepresentation(PippidonObject h) + { + return new Coin(h, pippidonRuleset.TextureStore, lane => Playfield.PippidonLane == lane) + { + Anchor = Anchor.CentreLeft, + Origin = Anchor.Centre, + }; + } + + public override PassThroughInputManager CreateKeyBindingInputManager() => new PippidonInputManager(Ruleset?.RulesetInfo); + + protected override FramedReplayInputHandler CreateReplayInputHandler(Replay replay) => new PippidonFramedReplayInputHandler(replay); + } +} diff --git a/osu.Game.Rulesets.Pippidon/osu.Game.Rulesets.Pippidon.csproj b/osu.Game.Rulesets.Pippidon/osu.Game.Rulesets.Pippidon.csproj new file mode 100644 index 0000000..672851b --- /dev/null +++ b/osu.Game.Rulesets.Pippidon/osu.Game.Rulesets.Pippidon.csproj @@ -0,0 +1,77 @@ + + + + + Debug + AnyCPU + {5AE1F0F1-DAFA-46E7-959C-DA233B7C87E9} + Library + Properties + osu.Game.Rulesets.Pippidon + osu.Game.Rulesets.Pippidon + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {c76bf5b3-985e-4d39-95fe-97c9c879b83a} + osu.Framework + + + {0d3fbf8a-7464-4cf7-8c90-3e7886df2d4d} + osu.Game + + + + + + + + + + + \ No newline at end of file diff --git a/pippidon.Desktop/OpenTK.dll.config b/pippidon.Desktop/OpenTK.dll.config new file mode 100644 index 0000000..5c9924f --- /dev/null +++ b/pippidon.Desktop/OpenTK.dll.config @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pippidon.Desktop/Program.cs b/pippidon.Desktop/Program.cs new file mode 100644 index 0000000..0055809 --- /dev/null +++ b/pippidon.Desktop/Program.cs @@ -0,0 +1,13 @@ +// Copyright (c) 2007-2017 ppy Pty Ltd . +// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE + +namespace pippidon.Desktop +{ + public static class Program + { + public static int Main(string[] args) + { + return osu.Desktop.Program.Main(args); + } + } +} diff --git a/pippidon.Desktop/Properties/AssemblyInfo.cs b/pippidon.Desktop/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..5fcde97 --- /dev/null +++ b/pippidon.Desktop/Properties/AssemblyInfo.cs @@ -0,0 +1,28 @@ +// Copyright (c) 2007-2017 ppy Pty Ltd . +// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE + +using System.Reflection; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("osu!lazer")] +[assembly: AssemblyDescription("click the circles. to the beat.")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("ppy Pty Ltd")] +[assembly: AssemblyProduct("osu!lazer")] +[assembly: AssemblyCopyright("ppy Pty Ltd 2007-2017")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("55e28cb2-7b6c-4595-8dcc-9871d8aad7e9")] + +[assembly: AssemblyVersion("0.0.0")] +[assembly: AssemblyFileVersion("0.0.0")] diff --git a/pippidon.Desktop/Properties/app.manifest b/pippidon.Desktop/Properties/app.manifest new file mode 100644 index 0000000..517f065 --- /dev/null +++ b/pippidon.Desktop/Properties/app.manifest @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + + + diff --git a/pippidon.Desktop/lazer.ico b/pippidon.Desktop/lazer.ico new file mode 100644 index 0000000..0c894dc Binary files /dev/null and b/pippidon.Desktop/lazer.ico differ diff --git a/pippidon.Desktop/osu!.res b/pippidon.Desktop/osu!.res new file mode 100644 index 0000000..7c70e30 Binary files /dev/null and b/pippidon.Desktop/osu!.res differ diff --git a/pippidon.Desktop/osu.nuspec b/pippidon.Desktop/osu.nuspec new file mode 100644 index 0000000..aa06797 --- /dev/null +++ b/pippidon.Desktop/osu.nuspec @@ -0,0 +1,26 @@ + + + + osulazer + 0.0.0 + osulazer + ppy Pty Ltd + Dean Herbert + https://osu.ppy.sh/ + https://puu.sh/tYyXZ/9a01a5d1b0.ico + false + click the circles. to the beat. + click the circles. + testing + Copyright ppy Pty Ltd 2007-2017 + en-AU + + + + + + + + + + diff --git a/pippidon.Desktop/packages.config b/pippidon.Desktop/packages.config new file mode 100644 index 0000000..0cba4d5 --- /dev/null +++ b/pippidon.Desktop/packages.config @@ -0,0 +1,14 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/pippidon.Desktop/pippidon.Desktop.csproj b/pippidon.Desktop/pippidon.Desktop.csproj new file mode 100644 index 0000000..0cf8e03 --- /dev/null +++ b/pippidon.Desktop/pippidon.Desktop.csproj @@ -0,0 +1,285 @@ + + + + {BDA2ECA5-043A-44DD-82EA-D14852FAE5F5} + Debug + AnyCPU + WinExe + Properties + pippidon.Desktop + pippidon + 3CF060CD28877D0E3112948951A64B2A7CEEC909 + codesigning.pfx + false + false + false + + + 3.5 + + + pippidon.Desktop.Program + OnOutputUpdated + false + LocalIntranet + v4.5 + true + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 2 + 1.0.0.%2a + false + true + 12.0.0 + 2.0 + + + + + + + true + full + false + bin\Debug\ + DEBUG + prompt + 0 + true + false + AnyCPU + true + AllRules.ruleset + false + false + false + + + 6 + + + none + true + bin\Release\ + CuttingEdge NoUpdate + prompt + 4 + true + false + AnyCPU + true + AllRules.ruleset + false + false + + + + + + + lazer.ico + + + Properties\app.manifest + + + true + bin\Debug\ + DEBUG + true + 0 + true + full + AnyCPU + false + 6 + prompt + AllRules.ruleset + --tests + + + + $(SolutionDir)\packages\DeltaCompressionDotNet.1.1.0\lib\net20\DeltaCompressionDotNet.dll + True + + + $(SolutionDir)\packages\DeltaCompressionDotNet.1.1.0\lib\net20\DeltaCompressionDotNet.MsDelta.dll + True + + + $(SolutionDir)\packages\DeltaCompressionDotNet.1.1.0\lib\net20\DeltaCompressionDotNet.PatchApi.dll + True + + + $(SolutionDir)\packages\Mono.Cecil.0.9.6.4\lib\net45\Mono.Cecil.dll + True + + + $(SolutionDir)\packages\Mono.Cecil.0.9.6.4\lib\net45\Mono.Cecil.Mdb.dll + True + + + $(SolutionDir)\packages\Mono.Cecil.0.9.6.4\lib\net45\Mono.Cecil.Pdb.dll + True + + + $(SolutionDir)\packages\Mono.Cecil.0.9.6.4\lib\net45\Mono.Cecil.Rocks.dll + True + + + + $(SolutionDir)\packages\squirrel.windows.1.7.5\lib\Net45\NuGet.Squirrel.dll + True + + + $(SolutionDir)\packages\ppy.OpenTK.3.0\lib\net45\OpenTK.dll + True + + + $(SolutionDir)\packages\SharpCompress.0.17.1\lib\net45\SharpCompress.dll + True + + + $(SolutionDir)\packages\Splat.2.0.0\lib\Net45\Splat.dll + True + + + $(SolutionDir)\packages\squirrel.windows.1.7.5\lib\Net45\Squirrel.dll + True + + + + + + $(SolutionDir)\packages\Microsoft.Net.Http.2.2.29\lib\net45\System.Net.Http.Extensions.dll + True + + + $(SolutionDir)\packages\Microsoft.Net.Http.2.2.29\lib\net45\System.Net.Http.Primitives.dll + True + + + + + + + osu.licenseheader + + + + + + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 2.0 %28x86%29 + true + + + False + .NET Framework 3.0 %28x86%29 + false + + + False + .NET Framework 3.5 + false + + + False + .NET Framework 3.5 SP1 + false + + + + + {5ae1f0f1-dafa-46e7-959c-da233b7c87e9} + osu.Game.Rulesets.Pippidon + + + {65dc628f-a640-4111-ab35-3a5652bc1e17} + osu.Framework.Desktop + + + {007B2356-AB6F-4BD9-96D5-116FC2DCE69A} + osu.Framework.Testing + + + {c76bf5b3-985e-4d39-95fe-97c9c879b83a} + osu.Framework + + + {d9a367c9-4c1a-489f-9b05-a0cea2b53b58} + osu.Game.Resources + + + {230ac4f3-7783-49fb-9aec-b83cda3b9f3d} + osu.Desktop.Tests + + + {2a66dd92-adb1-4994-89e2-c94e04acda0d} + osu.Desktop + + + {c92a607b-1fdd-4954-9f92-03ff547d9080} + osu.Game.Rulesets.Osu + + + {58f6c80c-1253-4a0e-a465-b8c85ebeadf3} + osu.Game.Rulesets.Catch + + + {48f4582b-7687-4621-9cbe-5c24197cb536} + osu.Game.Rulesets.Mania + + + {f167e17a-7de6-4af5-b920-a5112296c695} + osu.Game.Rulesets.Taiko + + + {0d3fbf8a-7464-4cf7-8c90-3e7886df2d4d} + osu.Game + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pippidon.sln b/pippidon.sln new file mode 100644 index 0000000..3492538 --- /dev/null +++ b/pippidon.sln @@ -0,0 +1,200 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.26430.16 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu.Desktop", "osu\osu.Desktop\osu.Desktop.csproj", "{2A66DD92-ADB1-4994-89E2-C94E04ACDA0D}" + ProjectSection(ProjectDependencies) = postProject + {5AE1F0F1-DAFA-46E7-959C-DA233B7C87E9} = {5AE1F0F1-DAFA-46E7-959C-DA233B7C87E9} + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Client", "Client", "{0D37A2AD-80A4-464F-A1DE-1560B70F1CE3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu.Framework", "osu\osu-framework\osu.Framework\osu.Framework.csproj", "{C76BF5B3-985E-4D39-95FE-97C9C879B83A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu.Game", "osu\osu.Game\osu.Game.csproj", "{0D3FBF8A-7464-4CF7-8C90-3E7886DF2D4D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu.Game.Resources", "osu\osu-resources\osu.Game.Resources\osu.Game.Resources.csproj", "{D9A367C9-4C1A-489F-9B05-A0CEA2B53B58}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Framework", "Framework", "{7A75DFA2-DE65-4458-98AF-26AF96FFD6DC}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu.Framework.Desktop", "osu\osu-framework\osu.Framework.Desktop\osu.Framework.Desktop.csproj", "{65DC628F-A640-4111-AB35-3A5652BC1E17}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu.Game.Tests", "osu\osu.Game.Tests\osu.Game.Tests.csproj", "{54377672-20B1-40AF-8087-5CF73BF3953A}" + ProjectSection(ProjectDependencies) = postProject + {5AE1F0F1-DAFA-46E7-959C-DA233B7C87E9} = {5AE1F0F1-DAFA-46E7-959C-DA233B7C87E9} + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu.Game.Rulesets.Osu", "osu\osu.Game.Rulesets.Osu\osu.Game.Rulesets.Osu.csproj", "{C92A607B-1FDD-4954-9F92-03FF547D9080}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu.Game.Rulesets.Catch", "osu\osu.Game.Rulesets.Catch\osu.Game.Rulesets.Catch.csproj", "{58F6C80C-1253-4A0E-A465-B8C85EBEADF3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu.Game.Rulesets.Taiko", "osu\osu.Game.Rulesets.Taiko\osu.Game.Rulesets.Taiko.csproj", "{F167E17A-7DE6-4AF5-B920-A5112296C695}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu.Game.Rulesets.Mania", "osu\osu.Game.Rulesets.Mania\osu.Game.Rulesets.Mania.csproj", "{48F4582B-7687-4621-9CBE-5C24197CB536}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu.Desktop.Tests", "osu\osu.Desktop.Tests\osu.Desktop.Tests.csproj", "{230AC4F3-7783-49FB-9AEC-B83CDA3B9F3D}" + ProjectSection(ProjectDependencies) = postProject + {5AE1F0F1-DAFA-46E7-959C-DA233B7C87E9} = {5AE1F0F1-DAFA-46E7-959C-DA233B7C87E9} + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu.Desktop.Deploy", "osu\osu.Desktop.Deploy\osu.Desktop.Deploy.csproj", "{BAEA2F74-0315-4667-84E0-ACAC0B4BF785}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{6EAD7610-89D8-48A2-8BE0-E348297E4D8B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{80683232-505E-41EA-A37C-2CFCF1C88C57}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu.Framework.Testing", "osu\osu-framework\osu.Framework.Testing\osu.Framework.Testing.csproj", "{007B2356-AB6F-4BD9-96D5-116FC2DCE69A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu.Game.Rulesets.Pippidon", "osu.Game.Rulesets.Pippidon\osu.Game.Rulesets.Pippidon.csproj", "{5AE1F0F1-DAFA-46E7-959C-DA233B7C87E9}" + ProjectSection(ProjectDependencies) = postProject + {0D3FBF8A-7464-4CF7-8C90-3E7886DF2D4D} = {0D3FBF8A-7464-4CF7-8C90-3E7886DF2D4D} + {C76BF5B3-985E-4D39-95FE-97C9C879B83A} = {C76BF5B3-985E-4D39-95FE-97C9C879B83A} + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "pippidon.Desktop", "pippidon.Desktop\pippidon.Desktop.csproj", "{BDA2ECA5-043A-44DD-82EA-D14852FAE5F5}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + VisualTests|Any CPU = VisualTests|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2A66DD92-ADB1-4994-89E2-C94E04ACDA0D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2A66DD92-ADB1-4994-89E2-C94E04ACDA0D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2A66DD92-ADB1-4994-89E2-C94E04ACDA0D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2A66DD92-ADB1-4994-89E2-C94E04ACDA0D}.Release|Any CPU.Build.0 = Release|Any CPU + {2A66DD92-ADB1-4994-89E2-C94E04ACDA0D}.VisualTests|Any CPU.ActiveCfg = VisualTests|Any CPU + {2A66DD92-ADB1-4994-89E2-C94E04ACDA0D}.VisualTests|Any CPU.Build.0 = VisualTests|Any CPU + {C76BF5B3-985E-4D39-95FE-97C9C879B83A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C76BF5B3-985E-4D39-95FE-97C9C879B83A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C76BF5B3-985E-4D39-95FE-97C9C879B83A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C76BF5B3-985E-4D39-95FE-97C9C879B83A}.Release|Any CPU.Build.0 = Release|Any CPU + {C76BF5B3-985E-4D39-95FE-97C9C879B83A}.VisualTests|Any CPU.ActiveCfg = Debug|Any CPU + {C76BF5B3-985E-4D39-95FE-97C9C879B83A}.VisualTests|Any CPU.Build.0 = Debug|Any CPU + {0D3FBF8A-7464-4CF7-8C90-3E7886DF2D4D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0D3FBF8A-7464-4CF7-8C90-3E7886DF2D4D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0D3FBF8A-7464-4CF7-8C90-3E7886DF2D4D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0D3FBF8A-7464-4CF7-8C90-3E7886DF2D4D}.Release|Any CPU.Build.0 = Release|Any CPU + {0D3FBF8A-7464-4CF7-8C90-3E7886DF2D4D}.VisualTests|Any CPU.ActiveCfg = Debug|Any CPU + {0D3FBF8A-7464-4CF7-8C90-3E7886DF2D4D}.VisualTests|Any CPU.Build.0 = Debug|Any CPU + {D9A367C9-4C1A-489F-9B05-A0CEA2B53B58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D9A367C9-4C1A-489F-9B05-A0CEA2B53B58}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D9A367C9-4C1A-489F-9B05-A0CEA2B53B58}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D9A367C9-4C1A-489F-9B05-A0CEA2B53B58}.Release|Any CPU.Build.0 = Release|Any CPU + {D9A367C9-4C1A-489F-9B05-A0CEA2B53B58}.VisualTests|Any CPU.ActiveCfg = Debug|Any CPU + {D9A367C9-4C1A-489F-9B05-A0CEA2B53B58}.VisualTests|Any CPU.Build.0 = Debug|Any CPU + {65DC628F-A640-4111-AB35-3A5652BC1E17}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {65DC628F-A640-4111-AB35-3A5652BC1E17}.Debug|Any CPU.Build.0 = Debug|Any CPU + {65DC628F-A640-4111-AB35-3A5652BC1E17}.Release|Any CPU.ActiveCfg = Release|Any CPU + {65DC628F-A640-4111-AB35-3A5652BC1E17}.Release|Any CPU.Build.0 = Release|Any CPU + {65DC628F-A640-4111-AB35-3A5652BC1E17}.VisualTests|Any CPU.ActiveCfg = Debug|Any CPU + {65DC628F-A640-4111-AB35-3A5652BC1E17}.VisualTests|Any CPU.Build.0 = Debug|Any CPU + {54377672-20B1-40AF-8087-5CF73BF3953A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {54377672-20B1-40AF-8087-5CF73BF3953A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {54377672-20B1-40AF-8087-5CF73BF3953A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {54377672-20B1-40AF-8087-5CF73BF3953A}.Release|Any CPU.Build.0 = Release|Any CPU + {54377672-20B1-40AF-8087-5CF73BF3953A}.VisualTests|Any CPU.ActiveCfg = Debug|Any CPU + {54377672-20B1-40AF-8087-5CF73BF3953A}.VisualTests|Any CPU.Build.0 = Debug|Any CPU + {C92A607B-1FDD-4954-9F92-03FF547D9080}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C92A607B-1FDD-4954-9F92-03FF547D9080}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C92A607B-1FDD-4954-9F92-03FF547D9080}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C92A607B-1FDD-4954-9F92-03FF547D9080}.Release|Any CPU.Build.0 = Release|Any CPU + {C92A607B-1FDD-4954-9F92-03FF547D9080}.VisualTests|Any CPU.ActiveCfg = Debug|Any CPU + {C92A607B-1FDD-4954-9F92-03FF547D9080}.VisualTests|Any CPU.Build.0 = Debug|Any CPU + {58F6C80C-1253-4A0E-A465-B8C85EBEADF3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {58F6C80C-1253-4A0E-A465-B8C85EBEADF3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {58F6C80C-1253-4A0E-A465-B8C85EBEADF3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {58F6C80C-1253-4A0E-A465-B8C85EBEADF3}.Release|Any CPU.Build.0 = Release|Any CPU + {58F6C80C-1253-4A0E-A465-B8C85EBEADF3}.VisualTests|Any CPU.ActiveCfg = Debug|Any CPU + {58F6C80C-1253-4A0E-A465-B8C85EBEADF3}.VisualTests|Any CPU.Build.0 = Debug|Any CPU + {F167E17A-7DE6-4AF5-B920-A5112296C695}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F167E17A-7DE6-4AF5-B920-A5112296C695}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F167E17A-7DE6-4AF5-B920-A5112296C695}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F167E17A-7DE6-4AF5-B920-A5112296C695}.Release|Any CPU.Build.0 = Release|Any CPU + {F167E17A-7DE6-4AF5-B920-A5112296C695}.VisualTests|Any CPU.ActiveCfg = Debug|Any CPU + {F167E17A-7DE6-4AF5-B920-A5112296C695}.VisualTests|Any CPU.Build.0 = Debug|Any CPU + {48F4582B-7687-4621-9CBE-5C24197CB536}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {48F4582B-7687-4621-9CBE-5C24197CB536}.Debug|Any CPU.Build.0 = Debug|Any CPU + {48F4582B-7687-4621-9CBE-5C24197CB536}.Release|Any CPU.ActiveCfg = Release|Any CPU + {48F4582B-7687-4621-9CBE-5C24197CB536}.Release|Any CPU.Build.0 = Release|Any CPU + {48F4582B-7687-4621-9CBE-5C24197CB536}.VisualTests|Any CPU.ActiveCfg = Debug|Any CPU + {48F4582B-7687-4621-9CBE-5C24197CB536}.VisualTests|Any CPU.Build.0 = Debug|Any CPU + {230AC4F3-7783-49FB-9AEC-B83CDA3B9F3D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {230AC4F3-7783-49FB-9AEC-B83CDA3B9F3D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {230AC4F3-7783-49FB-9AEC-B83CDA3B9F3D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {230AC4F3-7783-49FB-9AEC-B83CDA3B9F3D}.Release|Any CPU.Build.0 = Release|Any CPU + {230AC4F3-7783-49FB-9AEC-B83CDA3B9F3D}.VisualTests|Any CPU.ActiveCfg = Debug|Any CPU + {230AC4F3-7783-49FB-9AEC-B83CDA3B9F3D}.VisualTests|Any CPU.Build.0 = Debug|Any CPU + {BAEA2F74-0315-4667-84E0-ACAC0B4BF785}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BAEA2F74-0315-4667-84E0-ACAC0B4BF785}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BAEA2F74-0315-4667-84E0-ACAC0B4BF785}.VisualTests|Any CPU.ActiveCfg = Debug|Any CPU + {007B2356-AB6F-4BD9-96D5-116FC2DCE69A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {007B2356-AB6F-4BD9-96D5-116FC2DCE69A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {007B2356-AB6F-4BD9-96D5-116FC2DCE69A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {007B2356-AB6F-4BD9-96D5-116FC2DCE69A}.Release|Any CPU.Build.0 = Release|Any CPU + {007B2356-AB6F-4BD9-96D5-116FC2DCE69A}.VisualTests|Any CPU.ActiveCfg = Debug|Any CPU + {007B2356-AB6F-4BD9-96D5-116FC2DCE69A}.VisualTests|Any CPU.Build.0 = Debug|Any CPU + {5AE1F0F1-DAFA-46E7-959C-DA233B7C87E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5AE1F0F1-DAFA-46E7-959C-DA233B7C87E9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5AE1F0F1-DAFA-46E7-959C-DA233B7C87E9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5AE1F0F1-DAFA-46E7-959C-DA233B7C87E9}.Release|Any CPU.Build.0 = Release|Any CPU + {5AE1F0F1-DAFA-46E7-959C-DA233B7C87E9}.VisualTests|Any CPU.ActiveCfg = Release|Any CPU + {5AE1F0F1-DAFA-46E7-959C-DA233B7C87E9}.VisualTests|Any CPU.Build.0 = Release|Any CPU + {BDA2ECA5-043A-44DD-82EA-D14852FAE5F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BDA2ECA5-043A-44DD-82EA-D14852FAE5F5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BDA2ECA5-043A-44DD-82EA-D14852FAE5F5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BDA2ECA5-043A-44DD-82EA-D14852FAE5F5}.Release|Any CPU.Build.0 = Release|Any CPU + {BDA2ECA5-043A-44DD-82EA-D14852FAE5F5}.VisualTests|Any CPU.ActiveCfg = VisualTests|Any CPU + {BDA2ECA5-043A-44DD-82EA-D14852FAE5F5}.VisualTests|Any CPU.Build.0 = VisualTests|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {2A66DD92-ADB1-4994-89E2-C94E04ACDA0D} = {0D37A2AD-80A4-464F-A1DE-1560B70F1CE3} + {C76BF5B3-985E-4D39-95FE-97C9C879B83A} = {7A75DFA2-DE65-4458-98AF-26AF96FFD6DC} + {0D3FBF8A-7464-4CF7-8C90-3E7886DF2D4D} = {0D37A2AD-80A4-464F-A1DE-1560B70F1CE3} + {D9A367C9-4C1A-489F-9B05-A0CEA2B53B58} = {0D37A2AD-80A4-464F-A1DE-1560B70F1CE3} + {65DC628F-A640-4111-AB35-3A5652BC1E17} = {7A75DFA2-DE65-4458-98AF-26AF96FFD6DC} + {54377672-20B1-40AF-8087-5CF73BF3953A} = {80683232-505E-41EA-A37C-2CFCF1C88C57} + {C92A607B-1FDD-4954-9F92-03FF547D9080} = {0D37A2AD-80A4-464F-A1DE-1560B70F1CE3} + {58F6C80C-1253-4A0E-A465-B8C85EBEADF3} = {0D37A2AD-80A4-464F-A1DE-1560B70F1CE3} + {F167E17A-7DE6-4AF5-B920-A5112296C695} = {0D37A2AD-80A4-464F-A1DE-1560B70F1CE3} + {48F4582B-7687-4621-9CBE-5C24197CB536} = {0D37A2AD-80A4-464F-A1DE-1560B70F1CE3} + {230AC4F3-7783-49FB-9AEC-B83CDA3B9F3D} = {80683232-505E-41EA-A37C-2CFCF1C88C57} + {BAEA2F74-0315-4667-84E0-ACAC0B4BF785} = {6EAD7610-89D8-48A2-8BE0-E348297E4D8B} + {007B2356-AB6F-4BD9-96D5-116FC2DCE69A} = {7A75DFA2-DE65-4458-98AF-26AF96FFD6DC} + {5AE1F0F1-DAFA-46E7-959C-DA233B7C87E9} = {0D37A2AD-80A4-464F-A1DE-1560B70F1CE3} + EndGlobalSection + GlobalSection(MonoDevelopProperties) = preSolution + Policies = $0 + $0.TextStylePolicy = $1 + $1.EolMarker = Windows + $1.inheritsSet = VisualStudio + $1.inheritsScope = text/plain + $1.scope = text/x-csharp + $0.CSharpFormattingPolicy = $2 + $2.IndentSwitchSection = True + $2.NewLinesForBracesInProperties = True + $2.NewLinesForBracesInAccessors = True + $2.NewLinesForBracesInAnonymousMethods = True + $2.NewLinesForBracesInControlBlocks = True + $2.NewLinesForBracesInAnonymousTypes = True + $2.NewLinesForBracesInObjectCollectionArrayInitializers = True + $2.NewLinesForBracesInLambdaExpressionBody = True + $2.NewLineForElse = True + $2.NewLineForCatch = True + $2.NewLineForFinally = True + $2.NewLineForMembersInObjectInit = True + $2.NewLineForMembersInAnonymousTypes = True + $2.NewLineForClausesInQuery = True + $2.SpacingAfterMethodDeclarationName = False + $2.SpaceAfterMethodCallName = False + $2.SpaceBeforeOpenSquareBracket = False + $2.inheritsSet = Mono + $2.inheritsScope = text/x-csharp + $2.scope = text/x-csharp + EndGlobalSection +EndGlobal