Initial commit.

This commit is contained in:
Dean Herbert 2016-08-26 12:28:23 +09:00
commit 6cbbeaaac0
31 changed files with 2167 additions and 0 deletions

9
.editorconfig Normal file
View File

@ -0,0 +1,9 @@
# EditorConfig is awesome: http://editorconfig.org
root = true
[*.cs]
end_of_line = crlf
insert_final_newline = true
indent_style = space
indent_size = 4
trim_trailing_whitespace = true

19
.gitattributes vendored Normal file
View File

@ -0,0 +1,19 @@
# This won't normalise line endings, but it will ensure that merge drivers use CRLF
* -text eol=crlf
# Currently in-use binary file extensions
*.blend binary
*.bmp binary
*.dll binary
*.exe binary
*.icns binary
*.ico binary
*.jpg binary
*.osz2 binary
*.pdn binary
*.psd binary
*.PSD binary
*.tga binary
*.ttf binary
*.wav binary
*.xnb binary

26
.gitignore vendored Normal file
View File

@ -0,0 +1,26 @@
*.pfx
*.user
*DS_Store*
*/bin/
*/obj/
*/Build/
*.suo
*.idea
*.dmg
*.docstates
Staging/
.dropbox
*desktop.ini
*Icon
*.dpkg-dist
*.ucf-dist
packages/*
!packages/repositories.config
.vs/*
*.userprefs

6
.gitmodules vendored Normal file
View File

@ -0,0 +1,6 @@
[submodule "osu-framework"]
path = osu-framework
url = https://github.com/ppy/osu-framework
[submodule "osu-resources"]
path = osu-resources
url = https://github.com/ppy/osu-resources

2
.travis.yml Normal file
View File

@ -0,0 +1,2 @@
language: csharp
solution: osu.sln

21
LICENCE Normal file
View File

@ -0,0 +1,21 @@
The MIT License
Copyright (c) 2007-2016 ppy Pty Ltd <contact@ppy.sh>.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

25
README.md Normal file
View File

@ -0,0 +1,25 @@
# osu!
[osu! on the web](https://osu.ppy.sh) | [dev chat](https://discord.gg/ppy)
Rhythm is just a *click* away. The future of osu! and the beginning of an open era!
# Requirements
- A desktop platform which can compile .NET 4.5.
- Visual Studio or MonoDevelop is recommended.
# Contributing
We welcome all contributions, but keep in mind that we already have a lot of the UI designed. If you wish to work on something with the intention on having it included in the official distribution, please open an issue for discussion and we will give you what you need from a design perspective to proceed. If you want to make *changes* to the design, we recommend you open an issue with your intentions before spending too much time, to ensure no effort is wasted.
Contributions can be made via pull requests to this repository. We hope to credit and reward larger contributions via a [bounty system](https://goo.gl/nFdoyI). If you're unsure of what you can help with, check out the [list](https://github.com/ppy/osu/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen+label%3Abounty) of available issues with bounty.
Note that while we already have certain standards in place, nothing is set in stone. If you have an issue with the way code is structured; with any libraries we are using; with any processes involved with contributing, *please* bring it up. I welcome all feedback so we can make contributing to this project as pain-free as possible.
# Licence
The osu! client code and framework are licensed under the [MIT licence](https://opensource.org/licenses/MIT). Please see [the licence file](LICENCE) for more information. [tl;dr](https://tldrlegal.com/license/mit-license) you can do whatever you want as long as you include the original copyright and license notice in any copy of the software/source.
Please note that this *does not cover* the usage of the "osu!" or "ppy" branding in any software, resources, advertising or promotion, as this is protected by trademark law.
Please also note that game resources are covered by a separate licence. Please see the [ppy/osu-resources](https://github.com/ppy/osu-resources) repository for clarifications.

1
osu-framework Submodule

@ -0,0 +1 @@
Subproject commit f3d00712fd6eceb0c999ccc5e1aecf69e91525b3

1
osu-resources Submodule

@ -0,0 +1 @@
Subproject commit 8c3cc166e61d0636fb2824fbb56c6059e38a6827

21
osu.Desktop/Program.cs Normal file
View File

@ -0,0 +1,21 @@
//Copyright (c) 2007-2016 ppy Pty Ltd <contact@ppy.sh>.
//Licensed under the MIT License - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using System;
using osu.Framework.Desktop;
using osu.Framework.Framework;
using osu.Game;
namespace osu.Desktop
{
public static class Program
{
[STAThread]
public static void Main()
{
BasicGameHost host = Host.GetSuitableHost();
host.Load(new OsuGame());
host.Run();
}
}
}

View File

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<assemblyIdentity version="1.0.0.0" name="osu!" />
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<!-- UAC Manifest Options
If you want to change the Windows User Account Control level replace the
requestedExecutionLevel node with one of the following.
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
If you want to utilize File and Registry Virtualization for backward
compatibility then delete the requestedExecutionLevel node.
-->
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
</requestedPrivileges>
<applicationRequestMinimum>
<defaultAssemblyRequest permissionSetReference="Custom" />
<PermissionSet class="System.Security.PermissionSet" version="1" Unrestricted="true" ID="Custom" SameSite="site" />
</applicationRequestMinimum>
</security>
</trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
* <!-- Windows 8.1 -->
* <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<!-- Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!-- Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!-- Windows 8 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
</application>
</compatibility>
<asmv3:application>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
</asmv1:assembly>

BIN
osu.Desktop/lazer.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

BIN
osu.Desktop/osu!.res Normal file

Binary file not shown.

View File

@ -0,0 +1,172 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<PropertyGroup>
<ProjectGuid>{2A66DD92-ADB1-4994-89E2-C94E04ACDA0D}</ProjectGuid>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>osu.Desktop</RootNamespace>
<AssemblyName>osu!</AssemblyName>
<ManifestCertificateThumbprint>3CF060CD28877D0E3112948951A64B2A7CEEC909</ManifestCertificateThumbprint>
<ManifestKeyFile>codesigning.pfx</ManifestKeyFile>
<GenerateManifests>false</GenerateManifests>
<SignManifests>false</SignManifests>
<IsWebBootstrapper>false</IsWebBootstrapper>
<FileUpgradeFlags>
</FileUpgradeFlags>
<OldToolsVersion>3.5</OldToolsVersion>
<UpgradeBackupLocation>
</UpgradeBackupLocation>
<StartupObject>osu.Desktop.Program</StartupObject>
<RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
<SignAssembly>false</SignAssembly>
<TargetZone>LocalIntranet</TargetZone>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<PublishUrl>publish\</PublishUrl>
<Install>true</Install>
<InstallFrom>Disk</InstallFrom>
<UpdateEnabled>false</UpdateEnabled>
<UpdateMode>Foreground</UpdateMode>
<UpdateInterval>7</UpdateInterval>
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>2</ApplicationRevision>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
<ProductVersion>12.0.0</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<TargetFrameworkProfile>
</TargetFrameworkProfile>
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>0</WarningLevel>
<NoStdLib>true</NoStdLib>
<UseVSHostingProcess>false</UseVSHostingProcess>
<PlatformTarget>AnyCPU</PlatformTarget>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
<RunCodeAnalysis>false</RunCodeAnalysis>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>none</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>CuttingEdge NoUpdate</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<NoStdLib>true</NoStdLib>
<UseVSHostingProcess>false</UseVSHostingProcess>
<PlatformTarget>AnyCPU</PlatformTarget>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup>
<Win32Resource>osu!.res</Win32Resource>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Deploy|AnyCPU'">
<OutputPath>bin\Deploy\</OutputPath>
<DefineConstants>CuttingEdge</DefineConstants>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<Optimize>true</Optimize>
<NoStdLib>true</NoStdLib>
<PlatformTarget>AnyCPU</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
<Reference Include="mscorlib" />
<Reference Include="System" />
</ItemGroup>
<ItemGroup>
<None Include="..\osu.licenseheader">
<Link>osu.licenseheader</Link>
</None>
<None Include="osu!.res" />
<None Include="Properties\app.manifest" />
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include="Microsoft.Net.Client.3.5">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
<Install>false</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
<Visible>False</Visible>
<ProductName>.NET Framework 2.0 %28x86%29</ProductName>
<Install>true</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
<Visible>False</Visible>
<ProductName>.NET Framework 3.0 %28x86%29</ProductName>
<Install>false</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5</ProductName>
<Install>false</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1</ProductName>
<Install>false</Install>
</BootstrapperPackage>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\osu-framework\osu.Framework.Desktop\osu.Framework.Desktop.csproj">
<Project>{65dc628f-a640-4111-ab35-3a5652bc1e17}</Project>
<Name>osu.Framework.Desktop</Name>
</ProjectReference>
<ProjectReference Include="..\osu-framework\osu.Framework\osu.Framework.csproj">
<Project>{c76bf5b3-985e-4d39-95fe-97c9c879b83a}</Project>
<Name>osu.Framework</Name>
</ProjectReference>
<ProjectReference Include="..\osu-resources\osu.Game.Resources\osu.Game.Resources.csproj">
<Project>{d9a367c9-4c1a-489f-9b05-a0cea2b53b58}</Project>
<Name>osu.Game.Resources</Name>
</ProjectReference>
<ProjectReference Include="..\osu.Game\osu.Game.csproj">
<Project>{0d3fbf8a-7464-4cf7-8c90-3e7886df2d4d}</Project>
<Name>osu.Game</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Compile Include="Program.cs" />
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
<ProjectExtensions>
<VisualStudio>
</VisualStudio>
</ProjectExtensions>
<PropertyGroup>
<PreBuildEvent>
</PreBuildEvent>
</PropertyGroup>
<PropertyGroup>
<PostBuildEvent>
</PostBuildEvent>
</PropertyGroup>
</Project>

View File

@ -0,0 +1,24 @@
//Copyright (c) 2007-2016 ppy Pty Ltd <contact@ppy.sh>.
//Licensed under the MIT License - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using osu.Framework.Configuration;
namespace osu.Game.Configuration
{
class OsuConfigManager : ConfigManager<OsuConfig>
{
protected override void InitialiseDefaults()
{
Set(OsuConfig.Width, 1366);
Set(OsuConfig.Height, 768);
Set(OsuConfig.MouseSensitivity, 1.0);
}
}
enum OsuConfig
{
Width,
Height,
MouseSensitivity,
}
}

View File

@ -0,0 +1,134 @@
//Copyright (c) 2007-2016 ppy Pty Ltd <contact@ppy.sh>.
//Licensed under the MIT License - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using OpenTK;
using OpenTK.Graphics;
using osu.Framework;
using osu.Framework.GameModes;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Drawables;
using osu.Framework.Graphics.Sprites;
using osu.Framework.Graphics.Transformations;
using osu.Framework.Input;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using osu.Framework.Threading;
namespace osu.Game.GameModes
{
internal class FieldTest : GameMode
{
private AutoSizeContainer container;
public override void Load()
{
base.Load();
OsuGame game = Game as OsuGame;
Add(new Box()
{
SizeMode = InheritMode.XY,
Size = new Vector2(1, 1),
Colour = Color4.DarkRed
});
ClickableBox button;
Add(button = new ClickableBox(Color4.Pink)
{
Size = new Vector2(50, 50)
});
button.Activated += () => ExitMode();
Add(container = new AutoSizeContainer()
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre
});
container.Add(new ClickableBox(Color4.SkyBlue)
{
SizeMode = InheritMode.XY,
Size = Vector2.One
});
container.Add(new ClickableBox(Color4.Orange)
{
Size = new Vector2(50, 50),
Anchor = Anchor.TopLeft,
Origin = Anchor.TopLeft
});
container.Add(new ClickableBox(Color4.Orange)
{
Size = new Vector2(50, 50),
Anchor = Anchor.TopRight,
Origin = Anchor.TopRight
});
container.Add(new ClickableBox(Color4.Orange)
{
Size = new Vector2(50, 50),
Anchor = Anchor.BottomLeft,
Origin = Anchor.BottomLeft
});
container.Add(new ClickableBox(Color4.Blue)
{
Size = new Vector2(10, 10),
Anchor = Anchor.Centre,
Origin = Anchor.Centre
});
container.Add(new ClickableBox(Color4.Orange)
{
Size = new Vector2(50, 50),
Anchor = Anchor.BottomRight,
Origin = Anchor.BottomRight
});
container.Add(new SpriteCircular(game.Textures.Get("coin"))
{
Position = new Vector2(100),
Origin = Anchor.Centre,
Anchor = Anchor.Centre
});
Add(new SpriteText(game.Textures)
{
Origin = Anchor.CentreLeft,
Anchor = Anchor.CentreLeft,
Text = "12345"
});
}
class ClickableBox : Box
{
public ClickableBox(Color4? colour = default(Color4?))
{
Colour = colour ?? Color4.White;
}
internal event VoidDelegate Activated;
protected override bool OnClick(InputState state)
{
Scale = 1.5f;
ScaleTo(1, 500, EasingTypes.In);
Activated?.Invoke();
return true;
}
}
}
}

View File

@ -0,0 +1,51 @@
//Copyright (c) 2007-2016 ppy Pty Ltd <contact@ppy.sh>.
//Licensed under the MIT License - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using osu.Framework;
using osu.Framework.GameModes;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Drawables;
using osu.Framework.Graphics.Sprites;
using osu.Game.Graphics.Containers;
namespace osu.Game.GameModes
{
class FontTest : OsuGameMode
{
private FlowContainer flow;
public override void Load()
{
base.Load();
flow = new FlowContainer()
{
Anchor = Anchor.TopLeft,
Direction = FlowDirection.VerticalOnly
};
Add(flow);
for (int i = 1; i < 50; i++)
{
SpriteText text = new SpriteText()
{
Text = $@"Font testy at size {i}",
Scale = i
};
flow.Add(text);
}
}
protected override void Update()
{
base.Update();
}
}
}

View File

@ -0,0 +1,627 @@
//Copyright (c) 2007-2016 ppy Pty Ltd <contact@ppy.sh>.
//Licensed under the MIT License - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using System;
using System.Collections.Generic;
using System.Linq;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Drawables;
using osu.Framework.Graphics.Primitives;
using osu.Framework.Graphics.Sprites;
using osu.Framework.Graphics.Transformations;
using osu.Framework.Input;
using osu.Framework.Threading;
using osu.Game.Graphics;
using osu.Game.Graphics.Containers;
using OpenTK;
using OpenTK.Graphics;
using OpenTK.Input;
namespace osu.Game.GameModes.Menu
{
internal class ButtonSystem : OsuLargeComponent
{
private FlowContainerWithOrigin buttonFlow;
const float button_area_height = 128;
const float button_width = 180f;
const float wedge_width = 25.6f;
private OsuLogo osuLogo;
private Drawable iconFacade;
private Container buttonArea;
private Button backButton;
private Button settingsButton;
List<Button> buttonsTopLevel = new List<Button>();
List<Button> buttonsPlay = new List<Button>();
public enum MenuState
{
Initial,
Exit,
TopLevel,
Play,
}
public override void Load()
{
base.Load();
osuLogo = new OsuLogo(onOsuLogo)
{
Origin = Anchor.Centre,
Anchor = Anchor.Centre,
};
Add(buttonArea = new Container()
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
SizeMode = InheritMode.X,
Size = new Vector2(1, button_area_height),
Alpha = 0
});
Add(osuLogo);
buttonArea.Add(new Box()
{
SizeMode = InheritMode.XY,
Colour = new Color4(50, 50, 50, 255)
});
buttonArea.Add(buttonFlow = new FlowContainerWithOrigin()
{
Anchor = Anchor.Centre,
Position = new Vector2(wedge_width * 2 - (button_width + osuLogo.SizeForFlow / 4), 0),
Padding = new Vector2(-wedge_width, 0)
});
buttonFlow.Add(settingsButton = new Button(@"settings", @"options", FontAwesome.gear, new Color4(85, 85, 85, 255), onSettings, -wedge_width, Key.O));
buttonFlow.Add(backButton = new Button(@"back", @"back", FontAwesome.fa_osu_left_o, new Color4(51, 58, 94, 255), onBack, -wedge_width, Key.Escape));
//need a container to make the osu! icon flow properly.
buttonFlow.Add(iconFacade = new Drawable() { Size = new Vector2(0, button_area_height) });
buttonsPlay.Add((Button)buttonFlow.Add(new Button(@"solo", @"freeplay", FontAwesome.user, new Color4(102, 68, 204, 255), onSolo, wedge_width, Key.P)));
buttonsPlay.Add((Button)buttonFlow.Add(new Button(@"multi", @"multiplayer", FontAwesome.users, new Color4(94, 63, 186, 255), onMulti, 0, Key.M)));
buttonsPlay.Add((Button)buttonFlow.Add(new Button(@"chart", @"charts", FontAwesome.fa_osu_charts, new Color4(80, 53, 160, 255), onChart)));
buttonsPlay.Add((Button)buttonFlow.Add(new Button(@"tests", @"tests", FontAwesome.terminal, new Color4(80, 53, 160, 255), onTest, 0, Key.T)));
buttonsTopLevel.Add((Button)buttonFlow.Add(new Button(@"play", @"play", FontAwesome.fa_osu_logo, new Color4(102, 68, 204, 255), onPlay, wedge_width, Key.P)));
buttonsTopLevel.Add((Button)buttonFlow.Add(new Button(@"osu!editor", @"edit", FontAwesome.fa_osu_edit_o, new Color4(238, 170, 0, 255), onEdit, 0, Key.E)));
buttonsTopLevel.Add((Button)buttonFlow.Add(new Button(@"osu!direct", @"direct", FontAwesome.fa_osu_chevron_down_o, new Color4(165, 204, 0, 255), onDirect, 0, Key.D)));
buttonsTopLevel.Add((Button)buttonFlow.Add(new Button(@"exit", @"exit", FontAwesome.fa_osu_cross_o, new Color4(238, 51, 153, 255), onExit, 0, Key.Q)));
buttonFlow.CentreTarget = iconFacade;
}
protected override bool OnKeyDown(InputState state, KeyDownEventArgs args)
{
osuLogo.TriggerClick(state);
return true;
}
private void onSettings()
{
//OsuGame.Options.LoginOnly = false;
//OsuGame.Options.Expanded = true;
}
private void onPlay()
{
State = MenuState.Play;
}
private void onEdit()
{
//OsuGame.ChangeMode(OsuModes.SelectEdit);
}
private void onDirect()
{
//OsuGame.ChangeMode(OsuModes.OnlineSelection);
}
private void onExit()
{
//OsuGame.ChangeMode(OsuModes.Exit);
State = MenuState.Exit;
}
private void onBack()
{
State = MenuState.TopLevel;
}
private void onSolo()
{
//OsuGame.ChangeMode(OsuModes.SelectPlay);
}
private void onMulti()
{
//OsuGame.ChangeMode(OsuModes.Lobby);
}
private void onChart()
{
//OsuGame.ChangeMode(OsuModes.Charts);
}
private void onTest()
{
//OsuGame.ChangeMode(OsuModes.FieldTest);
}
private void onOsuLogo()
{
switch (state)
{
case MenuState.Initial:
//Game.Audio.PlaySamplePositional(@"menuhit");
State = MenuState.TopLevel;
return;
case MenuState.TopLevel:
buttonsTopLevel.First().TriggerMouseDown();
return;
case MenuState.Play:
buttonsPlay.First().TriggerMouseDown();
return;
}
}
MenuState state;
public MenuState State
{
get
{
return state;
}
set
{
if (state == value) return;
MenuState lastState = state;
state = value;
switch (state)
{
case MenuState.Initial:
backButton.State = Button.ButtonState.Contracted;
buttonArea.FadeOut(500);
osuLogo.Delay(150);
osuLogo.MoveTo(Vector2.Zero, 800, EasingTypes.OutExpo);
osuLogo.ScaleTo(1, 800, EasingTypes.OutExpo);
foreach (Button b in buttonsTopLevel)
b.State = Button.ButtonState.Contracted;
foreach (Button b in buttonsPlay)
b.State = Button.ButtonState.Contracted;
break;
case MenuState.TopLevel:
backButton.State = Button.ButtonState.Contracted;
osuLogo.MoveTo(buttonFlow.Position, 200, EasingTypes.In);
osuLogo.ScaleTo(0.5f, 200, EasingTypes.In);
buttonArea.FadeIn(300);
if (lastState == MenuState.Initial)
//todo: this propagates to invisible children and causes delays later down the track (on first MenuState.Play)
buttonArea.Delay(150, true);
foreach (Button b in buttonsTopLevel)
b.State = Button.ButtonState.Expanded;
foreach (Button b in buttonsPlay)
b.State = Button.ButtonState.Contracted;
break;
case MenuState.Play:
backButton.State = Button.ButtonState.Expanded;
foreach (Button b in buttonsTopLevel)
b.State = Button.ButtonState.Exploded;
foreach (Button b in buttonsPlay)
b.State = Button.ButtonState.Expanded;
break;
case MenuState.Exit:
HandleInput = false;
buttonArea.FadeOut(200);
foreach (Button b in buttonsTopLevel)
b.State = Button.ButtonState.Contracted;
foreach (Button b in buttonsPlay)
b.State = Button.ButtonState.Contracted;
osuLogo.Delay(150);
osuLogo.ScaleTo(1f, 4000);
osuLogo.RotateTo(20, 4000);
osuLogo.FadeOut(4000);
break;
}
backButton.State = state >= MenuState.Play ? Button.ButtonState.Expanded : Button.ButtonState.Contracted;
settingsButton.State = state == MenuState.TopLevel ? Button.ButtonState.Expanded : Button.ButtonState.Contracted;
if (lastState == MenuState.Initial)
buttonArea.DelayReset();
}
}
protected override void Update()
{
//if (OsuGame.IdleTime > 6000 && State != MenuState.Exit)
// State = MenuState.Initial;
iconFacade.Width = osuLogo.SizeForFlow * 0.5f;
base.Update();
}
/// <summary>
/// osu! logo and its attachments (pulsing, visualiser etc.)
/// </summary>
class OsuLogo : OsuComponent
{
private Sprite logo;
private Container logoBounceContainer;
private MenuVisualisation vis;
private VoidDelegate clickAction;
public float SizeForFlow => logo == null ? 0 : logo.ActualSize.X * logo.Scale * logoBounceContainer.Scale * 0.8f;
public override void Load()
{
base.Load();
logoBounceContainer = new AutoSizeContainer();
logo = new Sprite(Game.Textures.Get(@"menu-osu"))
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
};
Sprite ripple = new Sprite(Game.Textures.Get(@"menu-osu"))
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
Alpha = 0.4f
};
ripple.ScaleTo(1.1f, 500);
ripple.FadeOut(500);
ripple.Transformations.ForEach(t =>
{
t.Loop = true;
t.LoopDelay = 300;
});
logoBounceContainer.Add(logo);
logoBounceContainer.Add(ripple);
logoBounceContainer.Add(vis = new MenuVisualisation()
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
Size = logo.Size,
Additive = true,
//Radius = logo.Size.X / 2 * 0.96f,
Alpha = 0.2f,
});
Add(logoBounceContainer);
}
public OsuLogo(VoidDelegate action)
{
clickAction = action;
}
protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
{
logoBounceContainer.ScaleTo(1.1f, 1000, EasingTypes.Out);
return true;
}
protected override bool OnMouseUp(InputState state, MouseUpEventArgs args)
{
logoBounceContainer.ScaleTo(1.2f, 500, EasingTypes.OutElastic);
return true;
}
protected override bool OnClick(InputState state)
{
clickAction?.Invoke();
return true;
}
protected override bool OnHover(InputState state)
{
logoBounceContainer.ScaleTo(1.2f, 500, EasingTypes.OutElastic);
return true;
}
protected override void OnHoverLost(InputState state)
{
logoBounceContainer.ScaleTo(1, 500, EasingTypes.OutElastic);
}
}
/// <summary>
/// A flow container with an origin based on one of its contained drawables.
/// </summary>
private class FlowContainerWithOrigin : FlowContainer
{
/// <summary>
/// A target drawable which this flowcontainer should be centered around.
/// This target MUST be in this FlowContainer's *direct* children.
/// </summary>
internal Drawable CentreTarget;
public override Anchor Origin => Anchor.Custom;
public override Vector2 OriginPosition
{
get
{
if (CentreTarget == null)
return base.OriginPosition;
return CentreTarget.Position + CentreTarget.Size / 2;
}
}
public FlowContainerWithOrigin()
{
Direction = FlowDirection.HorizontalOnly;
}
}
/// <summary>
/// Button designed specifically for the osu!next main menu.
/// In order to correctly flow, we have to use a negative margin on the parent container (due to the parallelogram shape).
/// </summary>
private class Button : OsuComponent
{
private Container iconText;
private WedgedBox box;
private Color4 colour;
private TextAwesome icon;
private string internalName;
private readonly FontAwesome symbol;
private VoidDelegate clickAction;
private readonly float extraWidth;
private Key triggerKey;
private string text;
public override Quad ScreenSpaceInputQuad => box.ScreenSpaceInputQuad;
public Button(string text, string internalName, FontAwesome symbol, Color4 colour, VoidDelegate clickAction = null, float extraWidth = 0, Key triggerKey = Key.Unknown)
{
this.internalName = internalName;
this.symbol = symbol;
this.colour = colour;
this.clickAction = clickAction;
this.extraWidth = extraWidth;
this.triggerKey = triggerKey;
this.text = text;
}
public override void Load()
{
base.Load();
Alpha = 0;
Add(box = new WedgedBox(new Vector2(button_width + Math.Abs(extraWidth), button_area_height), wedge_width)
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
Colour = colour,
VectorScale = new Vector2(0, 1)
});
iconText = new AutoSizeContainer
{
Position = new Vector2(extraWidth / 2, 0),
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
};
Add(iconText);
icon = new TextAwesome(symbol, 40, Vector2.Zero)
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
Scale = 0.7f,
};
iconText.Add(icon);
SpriteText ft = new SpriteText()
{
Direction = FlowDirection.HorizontalOnly,
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
Position = new Vector2(0, 25),
Text = text
};
iconText.Add(ft);
}
protected override bool OnHover(InputState state)
{
if (State != ButtonState.Expanded) return true;
//if (OsuGame.Instance.IsActive)
// Game.Audio.PlaySamplePositional($@"menu-{internalName}-hover", @"menuclick");
box.ScaleTo(new Vector2(1.5f, 1), 500, EasingTypes.OutElastic);
int duration = 0; //(int)(Game.Audio.BeatLength / 2);
if (duration == 0) duration = 250;
icon.ClearTransformations();
icon.ScaleTo(1, 500, EasingTypes.OutElasticHalf);
double offset = 0; //(1 - Game.Audio.SyncBeatProgress) * duration;
double startTime = Time + offset;
icon.RotateTo(10, offset, EasingTypes.InOutSine);
icon.ScaleTo(new Vector2(1, 0.9f), offset, EasingTypes.Out);
icon.Transformations.Add(new Transformation(TransformationType.Rotation, -10, 10, startTime, startTime + duration * 2, EasingTypes.InOutSine) { Loop = true, LoopDelay = duration * 2 });
icon.Transformations.Add(new Transformation(Vector2.Zero, new Vector2(0, -10), startTime, startTime + duration, EasingTypes.Out) { Loop = true, LoopDelay = duration });
icon.Transformations.Add(new Transformation(TransformationType.VectorScale, new Vector2(1, 0.9f), Vector2.One, startTime, startTime + duration, EasingTypes.Out) { Loop = true, LoopDelay = duration });
icon.Transformations.Add(new Transformation(new Vector2(0, -10), Vector2.Zero, startTime + duration, startTime + duration * 2, EasingTypes.In) { Loop = true, LoopDelay = duration });
icon.Transformations.Add(new Transformation(TransformationType.VectorScale, Vector2.One, new Vector2(1, 0.9f), startTime + duration, startTime + duration * 2, EasingTypes.In) { Loop = true, LoopDelay = duration });
icon.Transformations.Add(new Transformation(TransformationType.Rotation, 10, -10, startTime + duration * 2, startTime + duration * 4, EasingTypes.InOutSine) { Loop = true, LoopDelay = duration * 2 });
return true;
}
protected override void OnHoverLost(InputState state)
{
icon.ClearTransformations();
icon.RotateTo(0, 500, EasingTypes.Out);
icon.MoveTo(Vector2.Zero, 500, EasingTypes.Out);
icon.ScaleTo(0.7f, 500, EasingTypes.OutElasticHalf);
icon.ScaleTo(Vector2.One, 200, EasingTypes.Out);
if (State == ButtonState.Expanded)
box.ScaleTo(new Vector2(1, 1), 500, EasingTypes.OutElastic);
}
protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
{
trigger();
return true;
}
protected override bool OnKeyDown(InputState state, KeyDownEventArgs args)
{
base.OnKeyDown(state, args);
if (triggerKey == args.Key && triggerKey != Key.Unknown)
{
trigger();
return true;
}
return false;
}
private void trigger()
{
//Game.Audio.PlaySamplePositional($@"menu-{internalName}-click", internalName.Contains(@"back") ? @"menuback" : @"menuhit");
clickAction?.Invoke();
//box.FlashColour(ColourHelper.Lighten2(colour, 0.7f), 200);
}
protected override void Update()
{
HandleInput = state != ButtonState.Exploded && box.VectorScale.X >= 0.8f;
iconText.Alpha = MathHelper.Clamp((box.VectorScale.X - 0.5f) / 0.3f, 0, 1);
base.Update();
}
ButtonState state;
public ButtonState State
{
get { return state; }
set
{
if (state == value)
return;
ButtonState lastState = state;
state = value;
switch (state)
{
case ButtonState.Contracted:
const int contract_duration = 500;
box.ScaleTo(new Vector2(0, 1), contract_duration, EasingTypes.OutExpo);
FadeOut(contract_duration);
break;
case ButtonState.Expanded:
const int expand_duration = 500;
box.ScaleTo(new Vector2(1, 1), expand_duration, EasingTypes.OutExpo);
FadeIn(expand_duration / 6);
break;
case ButtonState.Exploded:
const int explode_duration = 200;
box.ScaleTo(new Vector2(2, 1), explode_duration, EasingTypes.OutExpo);
FadeOut(explode_duration / 4 * 3);
break;
}
}
}
public enum ButtonState
{
Contracted,
Expanded,
Exploded
}
/// <summary>
/// ________
/// / /
/// / /
/// /_______/
/// </summary>
class WedgedBox : Box
{
float wedgeWidth;
public WedgedBox(Vector2 boxSize, float wedgeWidth)
{
Size = boxSize;
this.wedgeWidth = wedgeWidth;
}
/// <summary>
/// Custom DrawQuad used to create the slanted effect.
/// </summary>
protected override Quad DrawQuad
{
get
{
Quad q = base.DrawQuad;
//Will become infinite if we don't limit its maximum size.
float wedge = Math.Min(q.Width, wedgeWidth / Scale / VectorScale.X);
q.TopLeft.X += wedge;
q.BottomRight.X -= wedge;
return q;
}
}
}
}
internal class MenuVisualisation : Drawable
{
}
}
}

View File

@ -0,0 +1,26 @@
//Copyright (c) 2007-2016 ppy Pty Ltd <contact@ppy.sh>.
//Licensed under the MIT License - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using osu.Framework.Audio.Sample;
using osu.Framework.Audio.Track;
using osu.Framework.GameModes;
namespace osu.Game.GameModes.Menu
{
internal class MainMenu : GameMode
{
public override string Name => @"Main Menu";
private AudioTrackBass bgm;
public override void Load()
{
base.Load();
AudioSample welcome = Game.Audio.Sample.GetSample(@"welcome.mp3");
welcome.Play();
Add(new ButtonSystem());
}
}
}

View File

@ -0,0 +1,19 @@
//Copyright (c) 2007-2016 ppy Pty Ltd <contact@ppy.sh>.
//Licensed under the MIT License - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
namespace osu.Game.Graphics.Containers
{
class OsuComponent : AutoSizeContainer
{
public new OsuGame Game => base.Game as OsuGame;
}
}

View File

@ -0,0 +1,17 @@
//Copyright (c) 2007-2016 ppy Pty Ltd <contact@ppy.sh>.
//Licensed under the MIT License - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using osu.Framework.GameModes;
namespace osu.Game.Graphics.Containers
{
class OsuGameMode : GameMode
{
public new OsuGame Game => base.Game as OsuGame;
}
}

View File

@ -0,0 +1,17 @@
//Copyright (c) 2007-2016 ppy Pty Ltd <contact@ppy.sh>.
//Licensed under the MIT License - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using osu.Framework.Graphics.Containers;
namespace osu.Game.Graphics.Containers
{
class OsuLargeComponent : LargeContainer
{
public new OsuGame Game => base.Game as OsuGame;
}
}

View File

@ -0,0 +1,36 @@
//Copyright (c) 2007-2016 ppy Pty Ltd <contact@ppy.sh>.
//Licensed under the MIT License - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Drawables;
using osu.Framework.Input;
using OpenTK;
namespace osu.Game.Graphics.Cursor
{
class CursorContainer : LargeContainer
{
private Cursor cursor;
public CursorContainer()
{
Add(cursor = new Cursor());
}
protected override bool OnMouseMove(InputState state)
{
cursor.Position = GetLocalPosition(state.Mouse.Position);
return base.OnMouseMove(state);
}
class Cursor : Box
{
public Cursor()
{
Size = new Vector2(5, 5);
Origin = Anchor.Centre;
}
}
}
}

View File

@ -0,0 +1,19 @@
//Copyright (c) 2007-2016 ppy Pty Ltd <contact@ppy.sh>.
//Licensed under the MIT License - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using OpenTK;
namespace osu.Game.Graphics.Processing
{
class RatioAdjust : LargeContainer
{
protected override void Update()
{
base.Update();
Scale = Parent.ActualSize.Y / 768f;
Size = new Vector2(1 / Scale);
}
}
}

View File

@ -0,0 +1,604 @@
//Copyright (c) 2007-2016 ppy Pty Ltd <contact@ppy.sh>.
//Licensed under the MIT License - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using osu.Framework.Graphics.Sprites;
using OpenTK;
namespace osu.Game.Graphics
{
internal class TextAwesome : SpriteText
{
//internal override FontFace FontFace => (int)Icon < 0xf000 ? FontFace.OsuFont : FontFace.FontAwesome;
private FontAwesome icon;
public FontAwesome Icon
{
get
{
return icon;
}
set
{
if (icon == value) return;
icon = value;
Text = ((char)icon).ToString();
}
}
internal TextAwesome(FontAwesome icon = FontAwesome.circle, float size = 10, Vector2? position = null)
: base(null)
{
Icon = icon;
Origin = osu.Framework.Graphics.Anchor.Centre;
}
}
internal enum FontAwesome
{
glass = 0xf000,
music = 0xf001,
search = 0xf002,
envelope_o = 0xf003,
heart = 0xf004,
star = 0xf005,
star_o = 0xf006,
user = 0xf007,
film = 0xf008,
th_large = 0xf009,
th = 0xf00a,
th_list = 0xf00b,
check = 0xf00c,
times = 0xf00d,
search_plus = 0xf00e,
search_minus = 0xf010,
power_off = 0xf011,
signal = 0xf012,
gear = 0xf013,
trash_o = 0xf014,
home = 0xf015,
file_o = 0xf016,
clock_o = 0xf017,
road = 0xf018,
download = 0xf019,
arrow_circle_o_down = 0xf01a,
arrow_circle_o_up = 0xf01b,
inbox = 0xf01c,
play_circle_o = 0xf01d,
repeat = 0xf01e,
refresh = 0xf021,
list_alt = 0xf022,
locked = 0xf023,
flag = 0xf024,
headphones = 0xf025,
volume_off = 0xf026,
volume_down = 0xf027,
volume_up = 0xf028,
qrcode = 0xf029,
barcode = 0xf02a,
tag = 0xf02b,
tags = 0xf02c,
book = 0xf02d,
bookmark = 0xf02e,
print = 0xf02f,
camera = 0xf030,
font = 0xf031,
bold = 0xf032,
italic = 0xf033,
text_height = 0xf034,
text_width = 0xf035,
align_left = 0xf036,
align_center = 0xf037,
align_right = 0xf038,
align_justify = 0xf039,
list = 0xf03a,
outdent = 0xf03b,
indent = 0xf03c,
video_camera = 0xf03d,
picture_o = 0xf03e,
pencil = 0xf040,
map_marker = 0xf041,
adjust = 0xf042,
tint = 0xf043,
edit = 0xf044,
share_square_o = 0xf045,
check_square_o = 0xf046,
arrows = 0xf047,
step_backward = 0xf048,
fast_backward = 0xf049,
backward = 0xf04a,
play = 0xf04b,
pause = 0xf04c,
stop = 0xf04d,
forward = 0xf04e,
fast_forward = 0xf050,
step_forward = 0xf051,
eject = 0xf052,
chevron_left = 0xf053,
chevron_right = 0xf054,
plus_circle = 0xf055,
minus_circle = 0xf056,
times_circle = 0xf057,
check_circle = 0xf058,
question_circle = 0xf059,
info_circle = 0xf05a,
crosshairs = 0xf05b,
times_circle_o = 0xf05c,
check_circle_o = 0xf05d,
ban = 0xf05e,
arrow_left = 0xf060,
arrow_right = 0xf061,
arrow_up = 0xf062,
arrow_down = 0xf063,
share = 0xf064,
expand = 0xf065,
compress = 0xf066,
plus = 0xf067,
minus = 0xf068,
asterisk = 0xf069,
exclamation_circle = 0xf06a,
gift = 0xf06b,
leaf = 0xf06c,
fire = 0xf06d,
eye = 0xf06e,
eye_slash = 0xf070,
warning = 0xf071,
plane = 0xf072,
calendar = 0xf073,
random = 0xf074,
comment = 0xf075,
magnet = 0xf076,
chevron_up = 0xf077,
chevron_down = 0xf078,
retweet = 0xf079,
shopping_cart = 0xf07a,
folder = 0xf07b,
folder_open = 0xf07c,
arrows_v = 0xf07d,
arrows_h = 0xf07e,
bar_chart_o = 0xf080,
twitter_square = 0xf081,
facebook_square = 0xf082,
camera_retro = 0xf083,
key = 0xf084,
gears = 0xf085,
comments = 0xf086,
thumbs_o_up = 0xf087,
thumbs_o_down = 0xf088,
star_half = 0xf089,
heart_o = 0xf08a,
sign_out = 0xf08b,
linkedin_square = 0xf08c,
thumb_tack = 0xf08d,
external_link = 0xf08e,
sign_in = 0xf090,
trophy = 0xf091,
github_square = 0xf092,
upload = 0xf093,
lemon_o = 0xf094,
phone = 0xf095,
square_o = 0xf096,
bookmark_o = 0xf097,
phone_square = 0xf098,
twitter = 0xf099,
facebook = 0xf09a,
github = 0xf09b,
unlock = 0xf09c,
credit_card = 0xf09d,
rss = 0xf09e,
hdd_o = 0xf0a0,
bullhorn = 0xf0a1,
bell = 0xf0f3,
certificate = 0xf0a3,
hand_o_right = 0xf0a4,
hand_o_left = 0xf0a5,
hand_o_up = 0xf0a6,
hand_o_down = 0xf0a7,
arrow_circle_left = 0xf0a8,
arrow_circle_right = 0xf0a9,
arrow_circle_up = 0xf0aa,
arrow_circle_down = 0xf0ab,
globe = 0xf0ac,
wrench = 0xf0ad,
tasks = 0xf0ae,
filter = 0xf0b0,
briefcase = 0xf0b1,
arrows_alt = 0xf0b2,
users = 0xf0c0,
link = 0xf0c1,
cloud = 0xf0c2,
flask = 0xf0c3,
cut = 0xf0c4,
copy = 0xf0c5,
paperclip = 0xf0c6,
save_o = 0xf0c7,
square = 0xf0c8,
bars = 0xf0c9,
list_ul = 0xf0ca,
list_ol = 0xf0cb,
strikethrough = 0xf0cc,
underline = 0xf0cd,
table = 0xf0ce,
magic = 0xf0d0,
truck = 0xf0d1,
pinterest = 0xf0d2,
pinterest_square = 0xf0d3,
google_plus_square = 0xf0d4,
google_plus = 0xf0d5,
money = 0xf0d6,
caret_down = 0xf0d7,
caret_up = 0xf0d8,
caret_left = 0xf0d9,
caret_right = 0xf0da,
columns = 0xf0db,
sort = 0xf0dc,
sort_asc = 0xf0dd,
sort_desc = 0xf0de,
envelope = 0xf0e0,
linkedin = 0xf0e1,
undo = 0xf0e2,
legal = 0xf0e3,
dashboard = 0xf0e4,
comment_o = 0xf0e5,
comments_o = 0xf0e6,
bolt = 0xf0e7,
sitemap = 0xf0e8,
umbrella = 0xf0e9,
paste = 0xf0ea,
lightbulb_o = 0xf0eb,
exchange = 0xf0ec,
cloud_download = 0xf0ed,
cloud_upload = 0xf0ee,
user_md = 0xf0f0,
stethoscope = 0xf0f1,
suitcase = 0xf0f2,
bell_o = 0xf0a2,
coffee = 0xf0f4,
cutlery = 0xf0f5,
file_text_o = 0xf0f6,
building_o = 0xf0f7,
hospital_o = 0xf0f8,
ambulance = 0xf0f9,
medkit = 0xf0fa,
fighter_jet = 0xf0fb,
beer = 0xf0fc,
h_square = 0xf0fd,
plus_square = 0xf0fe,
angle_double_left = 0xf100,
angle_double_right = 0xf101,
angle_double_up = 0xf102,
angle_double_down = 0xf103,
angle_left = 0xf104,
angle_right = 0xf105,
angle_up = 0xf106,
angle_down = 0xf107,
desktop = 0xf108,
laptop = 0xf109,
tablet = 0xf10a,
mobile = 0xf10b,
circle_o = 0xf10c,
quote_left = 0xf10d,
quote_right = 0xf10e,
spinner = 0xf110,
circle = 0xf111,
reply = 0xf112,
github_alt = 0xf113,
folder_o = 0xf114,
folder_open_o = 0xf115,
smile_o = 0xf118,
frown_o = 0xf119,
meh_o = 0xf11a,
gamepad = 0xf11b,
keyboard_o = 0xf11c,
flag_o = 0xf11d,
flag_checkered = 0xf11e,
terminal = 0xf120,
code = 0xf121,
reply_all = 0xf122,
mail_reply_all = 0xf122,
star_half_o = 0xf123,
location_arrow = 0xf124,
crop = 0xf125,
code_fork = 0xf126,
chain_broken = 0xf127,
question = 0xf128,
info = 0xf129,
exclamation = 0xf12a,
superscript = 0xf12b,
subscript = 0xf12c,
eraser = 0xf12d,
puzzle_piece = 0xf12e,
microphone = 0xf130,
microphone_slash = 0xf131,
shield = 0xf132,
calendar_o = 0xf133,
fire_extinguisher = 0xf134,
rocket = 0xf135,
maxcdn = 0xf136,
chevron_circle_left = 0xf137,
chevron_circle_right = 0xf138,
chevron_circle_up = 0xf139,
chevron_circle_down = 0xf13a,
html5 = 0xf13b,
css3 = 0xf13c,
anchor = 0xf13d,
unlock_alt = 0xf13e,
bullseye = 0xf140,
ellipsis_h = 0xf141,
ellipsis_v = 0xf142,
rss_square = 0xf143,
play_circle = 0xf144,
ticket = 0xf145,
minus_square = 0xf146,
minus_square_o = 0xf147,
level_up = 0xf148,
level_down = 0xf149,
check_square = 0xf14a,
pencil_square = 0xf14b,
external_link_square = 0xf14c,
share_square = 0xf14d,
compass = 0xf14e,
caret_square_o_down = 0xf150,
caret_square_o_up = 0xf151,
caret_square_o_right = 0xf152,
eur = 0xf153,
gbp = 0xf154,
usd = 0xf155,
inr = 0xf156,
jpy = 0xf157,
rub = 0xf158,
krw = 0xf159,
btc = 0xf15a,
file = 0xf15b,
file_text = 0xf15c,
sort_alpha_asc = 0xf15d,
sort_alpha_desc = 0xf15e,
sort_amount_asc = 0xf160,
sort_amount_desc = 0xf161,
sort_numeric_asc = 0xf162,
sort_numeric_desc = 0xf163,
thumbs_up = 0xf164,
thumbs_down = 0xf165,
youtube_square = 0xf166,
youtube = 0xf167,
xing = 0xf168,
xing_square = 0xf169,
youtube_play = 0xf16a,
dropbox = 0xf16b,
stack_overflow = 0xf16c,
instagram = 0xf16d,
flickr = 0xf16e,
adn = 0xf170,
bitbucket = 0xf171,
bitbucket_square = 0xf172,
tumblr = 0xf173,
tumblr_square = 0xf174,
long_arrow_down = 0xf175,
long_arrow_up = 0xf176,
long_arrow_left = 0xf177,
long_arrow_right = 0xf178,
apple = 0xf179,
windows = 0xf17a,
android = 0xf17b,
linux = 0xf17c,
dribbble = 0xf17d,
skype = 0xf17e,
foursquare = 0xf180,
trello = 0xf181,
female = 0xf182,
male = 0xf183,
gittip = 0xf184,
sun_o = 0xf185,
moon_o = 0xf186,
archive = 0xf187,
bug = 0xf188,
vk = 0xf189,
weibo = 0xf18a,
renren = 0xf18b,
pagelines = 0xf18c,
stack_exchange = 0xf18d,
arrow_circle_o_right = 0xf18e,
arrow_circle_o_left = 0xf190,
caret_square_o_left = 0xf191,
dot_circle_o = 0xf192,
wheelchair = 0xf193,
vimeo_square = 0xf194,
tryy = 0xf195,
plus_square_o = 0xf196,
fa_space_shuttle = 0xf197,
fa_slack = 0xf198,
fa_envelope_square = 0xf199,
fa_wordpress = 0xf19a,
fa_openid = 0xf19b,
fa_bank = 0xf19c,
fa_graduation_cap = 0xf19d,
fa_yahoo = 0xf19e,
fa_google = 0xf1a0,
fa_reddit = 0xf1a1,
fa_reddit_square = 0xf1a2,
fa_stumbleupon_circle = 0xf1a3,
fa_stumbleupon = 0xf1a4,
fa_delicious = 0xf1a5,
fa_digg = 0xf1a6,
fa_pied_piper = 0xf1a7,
fa_pied_piper_alt = 0xf1a8,
fa_drupal = 0xf1a9,
fa_joomla = 0xf1aa,
fa_language = 0xf1ab,
fa_fax = 0xf1ac,
fa_building = 0xf1ad,
fa_child = 0xf1ae,
fa_paw = 0xf1b0,
fa_spoon = 0xf1b1,
fa_cube = 0xf1b2,
fa_cubes = 0xf1b3,
fa_behance = 0xf1b4,
fa_behance_square = 0xf1b5,
fa_steam = 0xf1b6,
fa_steam_square = 0xf1b7,
fa_recycle = 0xf1b8,
fa_car = 0xf1b9,
fa_taxi = 0xf1ba,
fa_tree = 0xf1bb,
fa_spotify = 0xf1bc,
fa_deviantart = 0xf1bd,
fa_soundcloud = 0xf1be,
fa_database = 0xf1c0,
fa_file_pdf_o = 0xf1c1,
fa_file_word_o = 0xf1c2,
fa_file_excel_o = 0xf1c3,
fa_file_powerpoint_o = 0xf1c4,
fa_file_image_o = 0xf1c5,
fa_file_archive_o = 0xf1c6,
fa_file_audio_o = 0xf1c7,
fa_file_video_o = 0xf1c8,
fa_file_code_o = 0xf1c9,
fa_vine = 0xf1ca,
fa_codepen = 0xf1cb,
fa_jsfiddle = 0xf1cc,
fa_life_ring = 0xf1cd,
fa_circle_o_notch = 0xf1ce,
fa_rebel = 0xf1d0,
fa_empire = 0xf1d1,
fa_git_square = 0xf1d2,
fa_git = 0xf1d3,
fa_hacker_news = 0xf1d4,
fa_tencent_weibo = 0xf1d5,
fa_qq = 0xf1d6,
fa_weixin = 0xf1d7,
fa_paper_plane = 0xf1d8,
fa_paper_plane_o = 0xf1d9,
fa_history = 0xf1da,
fa_circle_thin = 0xf1db,
fa_header = 0xf1dc,
fa_paragraph = 0xf1dd,
fa_sliders = 0xf1de,
fa_share_alt = 0xf1e0,
fa_share_alt_square = 0xf1e1,
fa_bomb = 0xf1e2,
fa_futbol_o = 0xf1e3,
fa_tty = 0xf1e4,
fa_binoculars = 0xf1e5,
fa_plug = 0xf1e6,
fa_slideshare = 0xf1e7,
fa_twitch = 0xf1e8,
fa_yelp = 0xf1e9,
fa_newspaper_o = 0xf1ea,
fa_wifi = 0xf1eb,
fa_calculator = 0xf1ec,
fa_paypal = 0xf1ed,
fa_google_wallet = 0xf1ee,
fa_cc_visa = 0xf1f0,
fa_cc_mastercard = 0xf1f1,
fa_cc_discover = 0xf1f2,
fa_cc_amex = 0xf1f3,
fa_cc_paypal = 0xf1f4,
fa_cc_stripe = 0xf1f5,
fa_bell_slash = 0xf1f6,
fa_bell_slash_o = 0xf1f7,
fa_trash = 0xf1f8,
fa_copyright = 0xf1f9,
fa_at = 0xf1fa,
fa_eyedropper = 0xf1fb,
fa_paint_brush = 0xf1fc,
fa_birthday_cake = 0xf1fd,
fa_area_chart = 0xf1fe,
fa_pie_chart = 0xf200,
fa_line_chart = 0xf201,
fa_lastfm = 0xf202,
fa_lastfm_square = 0xf203,
fa_toggle_off = 0xf204,
fa_toggle_on = 0xf205,
fa_bicycle = 0xf206,
fa_bus = 0xf207,
fa_ioxhost = 0xf208,
fa_angellist = 0xf209,
fa_cc = 0xf20a,
fa_ils = 0xf20b,
fa_meanpath = 0xf20c,
// gamemode icons in circles
fa_osu_osu_o = 0xe000,
fa_osu_mania_o = 0xe001,
fa_osu_fruits_o = 0xe002,
fa_osu_taiko_o = 0xe003,
// gamemode icons without circles
fa_osu_filled_circle = 0xe004,
fa_osu_cross_o = 0xe005,
fa_osu_logo = 0xe006,
fa_osu_chevron_down_o = 0xe007,
fa_osu_edit_o = 0xe033,
fa_osu_left_o = 0xe034,
fa_osu_right_o = 0xe035,
fa_osu_charts = 0xe036,
fa_osu_solo = 0xe037,
fa_osu_multi = 0xe038,
fa_osu_gear = 0xe039,
// misc icons
fa_osu_bat = 0xe008,
fa_osu_bubble = 0xe009,
fa_osu_bubble_pop = 0xe02e,
fa_osu_dice = 0xe011,
fa_osu_heart1 = 0xe02f,
fa_osu_heart1_break = 0xe030,
fa_osu_hot = 0xe031,
fa_osu_list_search = 0xe032,
//osu! playstyles
fa_osu_playstyle_tablet = 0xe02a,
fa_osu_playstyle_mouse = 0xe029,
fa_osu_playstyle_keyboard = 0xe02b,
fa_osu_playstyle_touch = 0xe02c,
// osu! difficulties
fa_osu_easy_osu = 0xe015,
fa_osu_normal_osu = 0xe016,
fa_osu_hard_osu = 0xe017,
fa_osu_insane_osu = 0xe018,
fa_osu_expert_osu = 0xe019,
// taiko difficulties
fa_osu_easy_taiko = 0xe01a,
fa_osu_normal_taiko = 0xe01b,
fa_osu_hard_taiko = 0xe01c,
fa_osu_insane_taiko = 0xe01d,
fa_osu_expert_taiko = 0xe01e,
// fruits difficulties
fa_osu_easy_fruits = 0xe01f,
fa_osu_normal_fruits = 0xe020,
fa_osu_hard_fruits = 0xe021,
fa_osu_insane_fruits = 0xe022,
fa_osu_expert_fruits = 0xe023,
// mania difficulties
fa_osu_easy_mania = 0xe024,
fa_osu_normal_mania = 0xe025,
fa_osu_hard_mania = 0xe026,
fa_osu_insane_mania = 0xe027,
fa_osu_expert_mania = 0xe028,
// mod icons
fa_osu_mod_perfect = 0xe02d,
fa_osu_mod_autopilot = 0xe03a,
fa_osu_mod_auto = 0xe03b,
fa_osu_mod_cinema = 0xe03c,
fa_osu_mod_doubletime = 0xe03d,
fa_osu_mod_easy = 0xe03e,
fa_osu_mod_flashlight = 0xe03f,
fa_osu_mod_halftime = 0xe040,
fa_osu_mod_hardrock = 0xe041,
fa_osu_mod_hidden = 0xe042,
fa_osu_mod_nightcore = 0xe043,
fa_osu_mod_nofail = 0xe044,
fa_osu_mod_relax = 0xe045,
fa_osu_mod_spunout = 0xe046,
fa_osu_mod_suddendeath = 0xe047,
fa_osu_mod_target = 0xe048,
fa_osu_mod_bg = 0xe049,
}
}

40
osu.Game/OsuGame.cs Normal file
View File

@ -0,0 +1,40 @@
//Copyright (c) 2007-2016 ppy Pty Ltd <contact@ppy.sh>.
//Licensed under the MIT License - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using System.Drawing;
using osu.Framework.Framework;
using osu.Game.Configuration;
using osu.Game.GameModes.Menu;
using osu.Game.Graphics.Cursor;
using osu.Game.Graphics.Processing;
namespace osu.Game
{
public class OsuGame : Framework.Game
{
internal OsuConfigManager Config = new OsuConfigManager();
protected override string MainResourceFile => @"osu.Game.Resources.dll";
public override void Load()
{
base.Load();
Window.Size = new Size(Config.Get<int>(OsuConfig.Width), Config.Get<int>(OsuConfig.Height));
Window.OnSizeChanged += window_OnSizeChanged;
AddProcessingContainer(new RatioAdjust());
//Add(new FontTest());
Add(new MainMenu());
Add(new CursorContainer());
}
private void window_OnSizeChanged()
{
Config.Set<int>(OsuConfig.Width, Window.Size.Width);
Config.Set<int>(OsuConfig.Height, Window.Size.Height);
}
}
}

View File

@ -0,0 +1,39 @@
//Copyright (c) 2007-2016 ppy Pty Ltd <contact@ppy.sh>.
//Licensed under the MIT License - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using System.Reflection;
using System.Runtime.CompilerServices;
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!main")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("osu!main")]
[assembly: AssemblyCopyright("Copyright © 2016")]
[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("0d3fbf8a-7464-4cf7-8c90-3e7886df2d4d")]
// 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")]

82
osu.Game/osu.Game.csproj Normal file
View File

@ -0,0 +1,82 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{0D3FBF8A-7464-4CF7-8C90-3E7886DF2D4D}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>osu.Game</RootNamespace>
<AssemblyName>osu.Game</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="OpenTK, Version=1.1.0.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4, processorArchitecture=MSIL">
<HintPath>..\packages\ppy.OpenTK.1.1.2225.2\lib\net20\OpenTK.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Drawing" />
</ItemGroup>
<ItemGroup>
<Compile Include="Configuration\OsuConfigManager.cs" />
<Compile Include="GameModes\FontTest.cs" />
<Compile Include="GameModes\Menu\ButtonSystem.cs" />
<Compile Include="GameModes\Menu\MainMenu.cs" />
<Compile Include="GameModes\FieldTest.cs" />
<Compile Include="Graphics\Containers\OsuComponent.cs" />
<Compile Include="Graphics\Containers\OsuGameMode.cs" />
<Compile Include="Graphics\Containers\OsuLargeComponent.cs" />
<Compile Include="Graphics\Cursor\CursorContainer.cs" />
<Compile Include="Graphics\Processing\RatioAdjust.cs" />
<Compile Include="Graphics\TextAwesome.cs" />
<Compile Include="OsuGame.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\osu-framework\osu.Framework\osu.Framework.csproj">
<Project>{c76bf5b3-985e-4d39-95fe-97c9c879b83a}</Project>
<Name>osu.Framework</Name>
</ProjectReference>
<ProjectReference Include="..\osu-resources\osu.Game.Resources\osu.Game.Resources.csproj">
<Project>{d9a367c9-4c1a-489f-9b05-a0cea2b53b58}</Project>
<Name>osu.Game.Resources</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<None Include="..\osu.licenseheader">
<Link>osu.licenseheader</Link>
</None>
<None Include="packages.config" />
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

9
osu.Game/packages.config Normal file
View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (c) 2007-2016 ppy Pty Ltd <contact@ppy.sh>.
Licensed under the MIT License - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
-->
<packages>
<package id="ppy.OpenTK" version="1.1.2225.2" targetFramework="net452" />
</packages>

9
osu.licenseheader Normal file
View File

@ -0,0 +1,9 @@
extensions: .cs
//Copyright (c) 2007-2016 ppy Pty Ltd <contact@ppy.sh>.
//Licensed under the MIT License - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
extensions: .xml .config .xsd
<!--
Copyright (c) 2007-2016 ppy Pty Ltd <contact@ppy.sh>.
Licensed under the MIT License - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
-->

68
osu.sln Normal file
View File

@ -0,0 +1,68 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 14
VisualStudioVersion = 14.0.25420.1
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu.Desktop", "osu.Desktop\osu.Desktop.csproj", "{2A66DD92-ADB1-4994-89E2-C94E04ACDA0D}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Client", "Client", "{0D37A2AD-80A4-464F-A1DE-1560B70F1CE3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu.Framework", "osu-framework\osu.Framework\osu.Framework.csproj", "{C76BF5B3-985E-4D39-95FE-97C9C879B83A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu.Game", "osu.Game\osu.Game.csproj", "{0D3FBF8A-7464-4CF7-8C90-3E7886DF2D4D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu.Game.Resources", "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-framework\osu.Framework.Desktop\osu.Framework.Desktop.csproj", "{65DC628F-A640-4111-AB35-3A5652BC1E17}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Deploy|Any CPU = Deploy|Any CPU
Release|Any CPU = Release|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}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{2A66DD92-ADB1-4994-89E2-C94E04ACDA0D}.Deploy|Any CPU.Build.0 = Deploy|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
{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}.Deploy|Any CPU.ActiveCfg = Debug|Any CPU
{C76BF5B3-985E-4D39-95FE-97C9C879B83A}.Deploy|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
{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}.Deploy|Any CPU.ActiveCfg = Debug|Any CPU
{0D3FBF8A-7464-4CF7-8C90-3E7886DF2D4D}.Deploy|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
{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}.Deploy|Any CPU.ActiveCfg = Debug|Any CPU
{D9A367C9-4C1A-489F-9B05-A0CEA2B53B58}.Deploy|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
{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}.Deploy|Any CPU.ActiveCfg = Debug|Any CPU
{65DC628F-A640-4111-AB35-3A5652BC1E17}.Deploy|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
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}
EndGlobalSection
EndGlobal