1
0
mirror of https://github.com/ppy/osu.git synced 2024-11-06 13:47:38 +08:00

ModSelector -> ModSelect, added mod descriptions, added per-mode mod selection, changed animations and made the wave mask properly

This commit is contained in:
DrabWeb 2017-02-16 18:32:27 -04:00
parent 0a58fc62db
commit 9fc3726925
7 changed files with 387 additions and 125 deletions

View File

@ -1,44 +1,38 @@
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>. // Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using System;
using OpenTK.Graphics;
using osu.Framework.Logging;
using osu.Framework.Graphics; using osu.Framework.Graphics;
using osu.Game.Overlays.Mods; using osu.Game.Overlays.Mods;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Sprites;
using osu.Framework.Graphics.Colour;
using osu.Framework.GameModes.Testing; using osu.Framework.GameModes.Testing;
using osu.Framework.Graphics.UserInterface;
using osu.Framework.Graphics.Primitives;
using osu.Game.Modes.UI;
using osu.Game.Modes; using osu.Game.Modes;
using OpenTK;
using osu.Game.Graphics;
namespace osu.Desktop.VisualTests.Tests namespace osu.Desktop.VisualTests.Tests
{ {
class TestCaseModSelector : TestCase class TestCaseModSelect : TestCase
{ {
public override string Name => @"Mod Selector"; public override string Name => @"Mod Select";
public override string Description => @"Tests the mod selector overlay"; public override string Description => @"Tests the mod select overlay";
private ModSelector modSelector; private ModSelect modSelect;
public override void Reset() public override void Reset()
{ {
base.Reset(); base.Reset();
Add(modSelector = new ModSelector Add(modSelect = new ModSelect
{ {
RelativeSizeAxes = Axes.Both, RelativeSizeAxes = Axes.Both,
Origin = Anchor.BottomCentre, Origin = Anchor.BottomCentre,
Anchor = Anchor.BottomCentre, Anchor = Anchor.BottomCentre,
ModMode = PlayMode.Osu,
}); });
AddButton("Toggle", modSelector.ToggleVisibility); AddButton("Toggle", modSelect.ToggleVisibility);
AddButton("osu!", () => modSelect.ModMode = PlayMode.Osu);
AddButton("osu!taiko", () => modSelect.ModMode = PlayMode.Taiko);
AddButton("osu!catch", () => modSelect.ModMode = PlayMode.Catch);
AddButton("osu!mania", () => modSelect.ModMode = PlayMode.Mania);
} }
} }
} }

View File

@ -191,7 +191,7 @@
<Compile Include="Platform\TestStorage.cs" /> <Compile Include="Platform\TestStorage.cs" />
<Compile Include="Tests\TestCaseOptions.cs" /> <Compile Include="Tests\TestCaseOptions.cs" />
<Compile Include="Tests\TestCasePauseOverlay.cs" /> <Compile Include="Tests\TestCasePauseOverlay.cs" />
<Compile Include="Tests\TestCaseModSelector.cs" /> <Compile Include="Tests\TestCaseModSelect.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup /> <ItemGroup />
<ItemGroup /> <ItemGroup />

View File

@ -19,6 +19,11 @@ namespace osu.Game.Modes
get; get;
} }
public virtual string Description(PlayMode mode)
{
return @"";
}
public virtual double ScoreMultiplier(PlayMode mode) public virtual double ScoreMultiplier(PlayMode mode)
{ {
return 1; return 1;
@ -26,7 +31,7 @@ namespace osu.Game.Modes
public virtual bool Ranked(PlayMode mode) public virtual bool Ranked(PlayMode mode)
{ {
return false; return true;
} }
} }
@ -34,6 +39,7 @@ namespace osu.Game.Modes
{ {
public override Mods Name => Mods.NoFail; public override Mods Name => Mods.NoFail;
public override FontAwesome Icon => FontAwesome.fa_osu_mod_nofail; public override FontAwesome Icon => FontAwesome.fa_osu_mod_nofail;
public override string Description(PlayMode mode) => @"You can't fail, no matter what.";
public override double ScoreMultiplier(PlayMode mode) => 0.5; public override double ScoreMultiplier(PlayMode mode) => 0.5;
public override bool Ranked(PlayMode mode) => true; public override bool Ranked(PlayMode mode) => true;
} }
@ -42,6 +48,7 @@ namespace osu.Game.Modes
{ {
public override Mods Name => Mods.Easy; public override Mods Name => Mods.Easy;
public override FontAwesome Icon => FontAwesome.fa_osu_mod_easy; public override FontAwesome Icon => FontAwesome.fa_osu_mod_easy;
public override string Description(PlayMode mode) => @"Reduces overall difficulty - larger circles, more forgiving HP drain, less accuracy required.";
public override double ScoreMultiplier(PlayMode mode) => 0.5; public override double ScoreMultiplier(PlayMode mode) => 0.5;
public override bool Ranked(PlayMode mode) => true; public override bool Ranked(PlayMode mode) => true;
} }
@ -50,7 +57,23 @@ namespace osu.Game.Modes
{ {
public override Mods Name => Mods.Hidden; public override Mods Name => Mods.Hidden;
public override FontAwesome Icon => FontAwesome.fa_osu_mod_hidden; public override FontAwesome Icon => FontAwesome.fa_osu_mod_hidden;
public override double ScoreMultiplier(PlayMode mode) => 1.06; public override string Description(PlayMode mode)
{
switch (mode)
{
case PlayMode.Osu:
case PlayMode.Catch:
return @"Play with no approach circles and fading notes for a slight score advantage.";
case PlayMode.Taiko:
case PlayMode.Mania:
return @"The notes fade out before you hit them!";
default:
throw new NotSupportedException();
}
}
public override double ScoreMultiplier(PlayMode mode) => mode == PlayMode.Mania ? 1.0 : 1.06;
public override bool Ranked(PlayMode mode) => true; public override bool Ranked(PlayMode mode) => true;
} }
@ -58,14 +81,33 @@ namespace osu.Game.Modes
{ {
public override Mods Name => Mods.HardRock; public override Mods Name => Mods.HardRock;
public override FontAwesome Icon => FontAwesome.fa_osu_mod_hardrock; public override FontAwesome Icon => FontAwesome.fa_osu_mod_hardrock;
public override double ScoreMultiplier(PlayMode mode) => 1.06; public override string Description(PlayMode mode) => @"Everything just got a bit harder...";
public override bool Ranked(PlayMode mode) => true; public override double ScoreMultiplier(PlayMode mode)
{
switch (mode)
{
case PlayMode.Osu:
case PlayMode.Taiko:
return 1.06;
case PlayMode.Catch:
return 1.12;
case PlayMode.Mania:
return 1.0;
default:
throw new NotSupportedException();
}
}
public override bool Ranked(PlayMode mode) => mode != PlayMode.Mania;
} }
public class ModSuddenDeath : Mod public class ModSuddenDeath : Mod
{ {
public override Mods Name => Mods.SuddenDeath; public override Mods Name => Mods.SuddenDeath;
public override FontAwesome Icon => FontAwesome.fa_osu_mod_suddendeath; public override FontAwesome Icon => FontAwesome.fa_osu_mod_suddendeath;
public override string Description(PlayMode mode) => @"Miss a note and fail.";
public override double ScoreMultiplier(PlayMode mode) => 1; public override double ScoreMultiplier(PlayMode mode) => 1;
public override bool Ranked(PlayMode mode) => true; public override bool Ranked(PlayMode mode) => true;
} }
@ -74,7 +116,25 @@ namespace osu.Game.Modes
{ {
public override Mods Name => Mods.DoubleTime; public override Mods Name => Mods.DoubleTime;
public override FontAwesome Icon => FontAwesome.fa_osu_mod_doubletime; public override FontAwesome Icon => FontAwesome.fa_osu_mod_doubletime;
public override double ScoreMultiplier(PlayMode mode) => 1.12; public override string Description(PlayMode mode) => @"Zoooooooooom";
public override double ScoreMultiplier(PlayMode mode)
{
switch (mode)
{
case PlayMode.Osu:
case PlayMode.Taiko:
return 1.12;
case PlayMode.Catch:
return 1.06;
case PlayMode.Mania:
return 1.0;
default:
throw new NotSupportedException();
}
}
public override bool Ranked(PlayMode mode) => true; public override bool Ranked(PlayMode mode) => true;
} }
@ -82,6 +142,26 @@ namespace osu.Game.Modes
{ {
public override Mods Name => Mods.Relax; public override Mods Name => Mods.Relax;
public override FontAwesome Icon => FontAwesome.fa_osu_mod_relax; public override FontAwesome Icon => FontAwesome.fa_osu_mod_relax;
public override string Description(PlayMode mode)
{
switch (mode)
{
case PlayMode.Osu:
return "You don't need to click. \nGive your clicking/tapping finger a break from the heat of things.";
case PlayMode.Taiko:
return @"Relax! You will no longer get dizzyfied by ninja-like spinners, demanding drumrolls or unexpected katu's.";
case PlayMode.Catch:
return @"Use the mouse to control the catcher.";
case PlayMode.Mania:
return @"Unsupported";
default:
throw new NotSupportedException();
}
}
public override double ScoreMultiplier(PlayMode mode) => 0; public override double ScoreMultiplier(PlayMode mode) => 0;
public override bool Ranked(PlayMode mode) => false; public override bool Ranked(PlayMode mode) => false;
} }
@ -90,23 +170,24 @@ namespace osu.Game.Modes
{ {
public override Mods Name => Mods.HalfTime; public override Mods Name => Mods.HalfTime;
public override FontAwesome Icon => FontAwesome.fa_osu_mod_halftime; public override FontAwesome Icon => FontAwesome.fa_osu_mod_halftime;
public override double ScoreMultiplier(PlayMode mode) => 0.3; public override string Description(PlayMode mode) => @"Less zoom";
public override double ScoreMultiplier(PlayMode mode) => mode == PlayMode.Mania ? 0.5 : 0.3;
public override bool Ranked(PlayMode mode) => true; public override bool Ranked(PlayMode mode) => true;
} }
public class ModNightcore : Mod public class ModNightcore : ModDoubleTime
{ {
public override Mods Name => Mods.Nightcore; public override Mods Name => Mods.Nightcore;
public override FontAwesome Icon => FontAwesome.fa_osu_mod_nightcore; public override FontAwesome Icon => FontAwesome.fa_osu_mod_nightcore;
public override double ScoreMultiplier(PlayMode mode) => 1.12; public override string Description(PlayMode mode) => @"uguuuuuuuu";
public override bool Ranked(PlayMode mode) => true;
} }
public class ModFlashlight : Mod public class ModFlashlight : Mod
{ {
public override Mods Name => Mods.Flashlight; public override Mods Name => Mods.Flashlight;
public override FontAwesome Icon => FontAwesome.fa_osu_mod_flashlight; public override FontAwesome Icon => FontAwesome.fa_osu_mod_flashlight;
public override double ScoreMultiplier(PlayMode mode) => 1.12; public override string Description(PlayMode mode) => @"Restricted view area.";
public override double ScoreMultiplier(PlayMode mode) => mode == PlayMode.Mania ? 1.0 : 1.12;
public override bool Ranked(PlayMode mode) => true; public override bool Ranked(PlayMode mode) => true;
} }
@ -114,6 +195,7 @@ namespace osu.Game.Modes
{ {
public override Mods Name => Mods.Autoplay; public override Mods Name => Mods.Autoplay;
public override FontAwesome Icon => FontAwesome.fa_osu_mod_auto; public override FontAwesome Icon => FontAwesome.fa_osu_mod_auto;
public override string Description(PlayMode mode) => @"Watch a perfect automated play through the song";
public override double ScoreMultiplier(PlayMode mode) => 0; public override double ScoreMultiplier(PlayMode mode) => 0;
public override bool Ranked(PlayMode mode) => false; public override bool Ranked(PlayMode mode) => false;
} }
@ -122,64 +204,65 @@ namespace osu.Game.Modes
{ {
public override Mods Name => Mods.SpunOut; public override Mods Name => Mods.SpunOut;
public override FontAwesome Icon => FontAwesome.fa_osu_mod_spunout; public override FontAwesome Icon => FontAwesome.fa_osu_mod_spunout;
public override string Description(PlayMode mode) => @"Spinners will be automatically completed";
public override double ScoreMultiplier(PlayMode mode) => 0.9; public override double ScoreMultiplier(PlayMode mode) => 0.9;
public override bool Ranked(PlayMode mode) => true; public override bool Ranked(PlayMode mode) => mode == PlayMode.Osu;
} }
public class ModRelax2 : Mod public class ModAutopilot : Mod
{ {
public override Mods Name => Mods.Relax2; public override Mods Name => Mods.Autopilot;
public override FontAwesome Icon => FontAwesome.fa_osu_mod_autopilot; public override FontAwesome Icon => FontAwesome.fa_osu_mod_autopilot;
public override string Description(PlayMode mode) => @"Automatic cursor movement - just follow the rhythm.";
public override double ScoreMultiplier(PlayMode mode) => 0; public override double ScoreMultiplier(PlayMode mode) => 0;
public override bool Ranked(PlayMode mode) => false; public override bool Ranked(PlayMode mode) => mode == PlayMode.Osu;
} }
public class ModPerfect : Mod public class ModPerfect : ModSuddenDeath
{ {
public override Mods Name => Mods.Perfect; public override Mods Name => Mods.Perfect;
public override FontAwesome Icon => FontAwesome.fa_osu_mod_perfect; public override FontAwesome Icon => FontAwesome.fa_osu_mod_perfect;
public override double ScoreMultiplier(PlayMode mode) => 1; public override string Description(PlayMode mode) => @"SS or quit.";
public override bool Ranked(PlayMode mode) => true;
} }
public class ModKey4 : Mod public class ModKey4 : Mod
{ {
public override Mods Name => Mods.Key4; public override Mods Name => Mods.Key4;
public override FontAwesome Icon => FontAwesome.fa_key; public override FontAwesome Icon => FontAwesome.fa_close;
public override double ScoreMultiplier(PlayMode mode) => 1; public override double ScoreMultiplier(PlayMode mode) => 1;
public override bool Ranked(PlayMode mode) => true; public override bool Ranked(PlayMode mode) => mode == PlayMode.Mania;
} }
public class ModKey5 : Mod public class ModKey5 : Mod
{ {
public override Mods Name => Mods.Key5; public override Mods Name => Mods.Key5;
public override FontAwesome Icon => FontAwesome.fa_key; public override FontAwesome Icon => FontAwesome.fa_close;
public override double ScoreMultiplier(PlayMode mode) => 1; public override double ScoreMultiplier(PlayMode mode) => 1;
public override bool Ranked(PlayMode mode) => true; public override bool Ranked(PlayMode mode) => mode == PlayMode.Mania;
} }
public class ModKey6 : Mod public class ModKey6 : Mod
{ {
public override Mods Name => Mods.Key6; public override Mods Name => Mods.Key6;
public override FontAwesome Icon => FontAwesome.fa_key; public override FontAwesome Icon => FontAwesome.fa_close;
public override double ScoreMultiplier(PlayMode mode) => 1; public override double ScoreMultiplier(PlayMode mode) => 1;
public override bool Ranked(PlayMode mode) => true; public override bool Ranked(PlayMode mode) => mode == PlayMode.Mania;
} }
public class ModKey7 : Mod public class ModKey7 : Mod
{ {
public override Mods Name => Mods.Key7; public override Mods Name => Mods.Key7;
public override FontAwesome Icon => FontAwesome.fa_key; public override FontAwesome Icon => FontAwesome.fa_close;
public override double ScoreMultiplier(PlayMode mode) => 1; public override double ScoreMultiplier(PlayMode mode) => 1;
public override bool Ranked(PlayMode mode) => true; public override bool Ranked(PlayMode mode) => mode == PlayMode.Mania;
} }
public class ModKey8 : Mod public class ModKey8 : Mod
{ {
public override Mods Name => Mods.Key8; public override Mods Name => Mods.Key8;
public override FontAwesome Icon => FontAwesome.fa_key; public override FontAwesome Icon => FontAwesome.fa_close;
public override double ScoreMultiplier(PlayMode mode) => 1; public override double ScoreMultiplier(PlayMode mode) => 1;
public override bool Ranked(PlayMode mode) => true; public override bool Ranked(PlayMode mode) => mode == PlayMode.Mania;
} }
public class ModFadeIn : Mod public class ModFadeIn : Mod
@ -187,13 +270,14 @@ namespace osu.Game.Modes
public override Mods Name => Mods.FadeIn; public override Mods Name => Mods.FadeIn;
public override FontAwesome Icon => FontAwesome.fa_osu_mod_hidden; public override FontAwesome Icon => FontAwesome.fa_osu_mod_hidden;
public override double ScoreMultiplier(PlayMode mode) => 1; public override double ScoreMultiplier(PlayMode mode) => 1;
public override bool Ranked(PlayMode mode) => true; public override bool Ranked(PlayMode mode) => mode == PlayMode.Mania;
} }
public class ModRandom : Mod public class ModRandom : Mod
{ {
public override Mods Name => Mods.Random; public override Mods Name => Mods.Random;
public override FontAwesome Icon => FontAwesome.fa_random; public override FontAwesome Icon => FontAwesome.fa_close;
public override string Description(PlayMode mode) => @"Shuffle around the notes!";
public override double ScoreMultiplier(PlayMode mode) => 1; public override double ScoreMultiplier(PlayMode mode) => 1;
public override bool Ranked(PlayMode mode) => false; public override bool Ranked(PlayMode mode) => false;
} }
@ -211,47 +295,48 @@ namespace osu.Game.Modes
public override Mods Name => Mods.Target; public override Mods Name => Mods.Target;
public override FontAwesome Icon => FontAwesome.fa_osu_mod_target; public override FontAwesome Icon => FontAwesome.fa_osu_mod_target;
public override double ScoreMultiplier(PlayMode mode) => 1; public override double ScoreMultiplier(PlayMode mode) => 1;
public override bool Ranked(PlayMode mode) => true; public override bool Ranked(PlayMode mode) => mode == PlayMode.Osu;
} }
public class ModKey9 : Mod public class ModKey9 : Mod
{ {
public override Mods Name => Mods.Key9; public override Mods Name => Mods.Key9;
public override FontAwesome Icon => FontAwesome.fa_key; public override FontAwesome Icon => FontAwesome.fa_close;
public override double ScoreMultiplier(PlayMode mode) => 1; public override double ScoreMultiplier(PlayMode mode) => 1;
public override bool Ranked(PlayMode mode) => true; public override bool Ranked(PlayMode mode) => mode == PlayMode.Mania;
} }
public class ModKeyCoop : Mod public class ModKeyCoop : Mod
{ {
public override Mods Name => Mods.KeyCoop; public override Mods Name => Mods.KeyCoop;
public override FontAwesome Icon => FontAwesome.fa_key; public override FontAwesome Icon => FontAwesome.fa_close;
public override string Description(PlayMode mode) => @"Double the key amount, double the fun!";
public override double ScoreMultiplier(PlayMode mode) => 1; public override double ScoreMultiplier(PlayMode mode) => 1;
public override bool Ranked(PlayMode mode) => true; public override bool Ranked(PlayMode mode) => mode == PlayMode.Mania;
} }
public class ModKey1 : Mod public class ModKey1 : Mod
{ {
public override Mods Name => Mods.Key1; public override Mods Name => Mods.Key1;
public override FontAwesome Icon => FontAwesome.fa_key; public override FontAwesome Icon => FontAwesome.fa_close;
public override double ScoreMultiplier(PlayMode mode) => 1; public override double ScoreMultiplier(PlayMode mode) => 1;
public override bool Ranked(PlayMode mode) => true; public override bool Ranked(PlayMode mode) => mode == PlayMode.Mania;
} }
public class ModKey3 : Mod public class ModKey3 : Mod
{ {
public override Mods Name => Mods.Key3; public override Mods Name => Mods.Key3;
public override FontAwesome Icon => FontAwesome.fa_key; public override FontAwesome Icon => FontAwesome.fa_close;
public override double ScoreMultiplier(PlayMode mode) => 1; public override double ScoreMultiplier(PlayMode mode) => 1;
public override bool Ranked(PlayMode mode) => true; public override bool Ranked(PlayMode mode) => mode == PlayMode.Mania;
} }
public class ModKey2 : Mod public class ModKey2 : Mod
{ {
public override Mods Name => Mods.Key2; public override Mods Name => Mods.Key2;
public override FontAwesome Icon => FontAwesome.fa_key; public override FontAwesome Icon => FontAwesome.fa_close;
public override double ScoreMultiplier(PlayMode mode) => 1; public override double ScoreMultiplier(PlayMode mode) => 1;
public override bool Ranked(PlayMode mode) => true; public override bool Ranked(PlayMode mode) => mode == PlayMode.Mania;
} }
@ -299,7 +384,7 @@ namespace osu.Game.Modes
SpunOut = 1 << 12, SpunOut = 1 << 12,
[Description(@"Autopilot")] [Description(@"Autopilot")]
Relax2 = 1 << 13, Autopilot = 1 << 13,
[Description(@"Perfect")] [Description(@"Perfect")]
Perfect = 1 << 14, Perfect = 1 << 14,
@ -349,7 +434,7 @@ namespace osu.Game.Modes
LastMod = 1 << 29, LastMod = 1 << 29,
KeyMod = Key1 | Key2 | Key3 | Key4 | Key5 | Key6 | Key7 | Key8 | Key9 | KeyCoop, KeyMod = Key1 | Key2 | Key3 | Key4 | Key5 | Key6 | Key7 | Key8 | Key9 | KeyCoop,
FreeModAllowed = NoFail | Easy | Hidden | HardRock | SuddenDeath | Flashlight | FadeIn | Relax | Relax2 | SpunOut | KeyMod, FreeModAllowed = NoFail | Easy | Hidden | HardRock | SuddenDeath | Flashlight | FadeIn | Relax | Autopilot | SpunOut | KeyMod,
ScoreIncreaseMods = Hidden | HardRock | DoubleTime | Flashlight | FadeIn ScoreIncreaseMods = Hidden | HardRock | DoubleTime | Flashlight | FadeIn
} }
} }

View File

@ -1,6 +1,7 @@
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>. // Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using System;
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Game.Graphics; using osu.Game.Graphics;
using osu.Game.Modes; using osu.Game.Modes;
@ -9,11 +10,76 @@ namespace osu.Game
{ {
public class AssistedSection : ModSection public class AssistedSection : ModSection
{ {
public ModButton RelaxButton => Buttons[0]; private ModButton relaxButton;
public ModButton AutopilotButton => Buttons[1]; public ModButton RelaxButton
public ModButton TargetPracticeButton => Buttons[2]; {
public ModButton SpunOutButton => Buttons[3]; get
public ModButton AutoplayCinemaButton => Buttons[4]; { return relaxButton;
}
}
private ModButton autopilotButton;
public ModButton AutopilotButton
{
get
{
return autopilotButton;
}
}
private ModButton targetPracticeButton;
public ModButton TargetPracticeButton
{
get
{
return targetPracticeButton;
}
}
private ModButton spunOutButton;
public ModButton SpunOutButton
{
get
{
return spunOutButton;
}
}
private ModButton autoplayCinemaButton;
public ModButton AutoplayCinemaButton
{
get
{
return autoplayCinemaButton;
}
}
private ModButton keyButton;
public ModButton KeyButton
{
get
{
return keyButton;
}
}
private ModButton coopButton;
public ModButton CoopButton
{
get
{
return coopButton;
}
}
private ModButton randomButton;
public ModButton RandomButton
{
get
{
return randomButton;
}
}
[BackgroundDependencyLoader] [BackgroundDependencyLoader]
private void load(OsuColour colours) private void load(OsuColour colours)
@ -21,40 +87,44 @@ namespace osu.Game
Colour = colours.Blue; Colour = colours.Blue;
} }
public AssistedSection() public AssistedSection(PlayMode mode)
{ {
Header = @"Assisted"; Header = @"Assisted";
switch (mode)
{
case PlayMode.Osu:
Buttons = new ModButton[] Buttons = new ModButton[]
{ {
new ModButton relaxButton = new ModButton
{ {
Mods = new Mod[] Mods = new Mod[]
{ {
new ModRelax(), new ModRelax(),
}, },
}, },
new ModButton autopilotButton = new ModButton
{ {
Mods = new Mod[] Mods = new Mod[]
{ {
new ModRelax2(), new ModAutopilot(),
}, },
}, },
new ModButton targetPracticeButton = new ModButton
{ {
Mods = new Mod[] Mods = new Mod[]
{ {
new ModTarget(), new ModTarget(),
}, },
}, },
new ModButton spunOutButton = new ModButton
{ {
Mods = new Mod[] Mods = new Mod[]
{ {
new ModSpunOut(), new ModSpunOut(),
}, },
}, },
new ModButton autoplayCinemaButton = new ModButton
{ {
Mods = new Mod[] Mods = new Mod[]
{ {
@ -63,6 +133,76 @@ namespace osu.Game
}, },
}, },
}; };
break;
case PlayMode.Taiko:
case PlayMode.Catch:
Buttons = new ModButton[]
{
relaxButton = new ModButton
{
Mods = new Mod[]
{
new ModRelax(),
},
},
autoplayCinemaButton = new ModButton
{
Mods = new Mod[]
{
new ModAutoplay(),
new ModCinema(),
},
},
};
break;
case PlayMode.Mania:
Buttons = new ModButton[]
{
keyButton = new ModButton
{
Mods = new Mod[]
{
new ModKey4(),
new ModKey5(),
new ModKey6(),
new ModKey7(),
new ModKey8(),
new ModKey9(),
new ModKey1(),
new ModKey2(),
new ModKey3(),
},
},
coopButton = new ModButton
{
Mods = new Mod[]
{
new ModKeyCoop(),
},
},
randomButton = new ModButton
{
Mods = new Mod[]
{
new ModRandom(),
},
},
autoplayCinemaButton = new ModButton
{
Mods = new Mod[]
{
new ModAutoplay(),
new ModCinema(),
},
},
};
break;
default:
throw new NotSupportedException();
}
} }
} }
} }

View File

@ -20,7 +20,7 @@ using osu.Framework.Allocation;
namespace osu.Game.Overlays.Mods namespace osu.Game.Overlays.Mods
{ {
public class ModSelector : OverlayContainer public class ModSelect : OverlayContainer
{ {
private readonly int waves_duration = 1000; private readonly int waves_duration = 1000;
private readonly int move_up_duration = 1500; private readonly int move_up_duration = 1500;
@ -34,6 +34,8 @@ namespace osu.Game.Overlays.Mods
private OsuSpriteText rankedLabel, multiplierLabel; private OsuSpriteText rankedLabel, multiplierLabel;
private FlowContainer rankedMultiplerContainer; private FlowContainer rankedMultiplerContainer;
private FlowContainer modSectionsContainer;
private DifficultyReductionSection difficultyReductionSection; private DifficultyReductionSection difficultyReductionSection;
private DifficultyIncreaseSection difficultyIncreaseSection; private DifficultyIncreaseSection difficultyIncreaseSection;
private AssistedSection assistedSection; private AssistedSection assistedSection;
@ -43,7 +45,45 @@ namespace osu.Game.Overlays.Mods
public Bindable<Mod[]> SelectedMods = new Bindable<Mod[]>(); public Bindable<Mod[]> SelectedMods = new Bindable<Mod[]>();
// TODO: Add the fancy wave transition (https://streamable.com/qk4u) private PlayMode modMode;
public PlayMode ModMode
{
get
{
return modMode;
}
set
{
if (value == modMode) return;
modMode = value;
modSectionsContainer.Children = new Drawable[]
{
difficultyReductionSection = new DifficultyReductionSection
{
RelativeSizeAxes = Axes.X,
Origin = Anchor.TopCentre,
Anchor = Anchor.TopCentre,
Action = modButtonPressed,
},
difficultyIncreaseSection = new DifficultyIncreaseSection
{
RelativeSizeAxes = Axes.X,
Origin = Anchor.TopCentre,
Anchor = Anchor.TopCentre,
Action = modButtonPressed,
},
assistedSection = new AssistedSection(value)
{
RelativeSizeAxes = Axes.X,
Origin = Anchor.TopCentre,
Anchor = Anchor.TopCentre,
Action = modButtonPressed,
},
};
}
}
protected override void PopIn() protected override void PopIn()
{ {
FadeIn(move_up_duration, EasingTypes.OutQuint); FadeIn(move_up_duration, EasingTypes.OutQuint);
@ -56,7 +96,7 @@ namespace osu.Game.Overlays.Mods
rankedMultiplerContainer.MoveToX(0, ranked_multiplier_duration, EasingTypes.OutQuint); rankedMultiplerContainer.MoveToX(0, ranked_multiplier_duration, EasingTypes.OutQuint);
rankedMultiplerContainer.FadeIn(ranked_multiplier_duration, EasingTypes.OutQuint); rankedMultiplerContainer.FadeIn(ranked_multiplier_duration, EasingTypes.OutQuint);
ModSection[] sections = new ModSection[] { difficultyReductionSection, difficultyIncreaseSection, assistedSection }; ModSection[] sections = { difficultyReductionSection, difficultyIncreaseSection, assistedSection };
for (int i = 0; i < sections.Length; i++) for (int i = 0; i < sections.Length; i++)
{ {
sections[i].ButtonsContainer.TransformSpacingTo(new Vector2(50f, 0f), button_duration, EasingTypes.OutQuint); sections[i].ButtonsContainer.TransformSpacingTo(new Vector2(50f, 0f), button_duration, EasingTypes.OutQuint);
@ -80,7 +120,7 @@ namespace osu.Game.Overlays.Mods
rankedMultiplerContainer.MoveToX(rankedMultiplerContainer.DrawSize.X, move_out_duration, EasingTypes.InSine); rankedMultiplerContainer.MoveToX(rankedMultiplerContainer.DrawSize.X, move_out_duration, EasingTypes.InSine);
rankedMultiplerContainer.FadeOut(move_out_duration, EasingTypes.InSine); rankedMultiplerContainer.FadeOut(move_out_duration, EasingTypes.InSine);
ModSection[] sections = new ModSection[] { difficultyReductionSection, difficultyIncreaseSection, assistedSection }; ModSection[] sections = { difficultyReductionSection, difficultyIncreaseSection, assistedSection };
for (int i = 0; i < sections.Length; i++) for (int i = 0; i < sections.Length; i++)
{ {
sections[i].ButtonsContainer.TransformSpacingTo(new Vector2(100f, 0f), move_out_duration, EasingTypes.InSine); sections[i].ButtonsContainer.TransformSpacingTo(new Vector2(100f, 0f), move_out_duration, EasingTypes.InSine);
@ -119,32 +159,32 @@ namespace osu.Game.Overlays.Mods
{ {
if (sectionMod.Name == Modes.Mods.HardRock) if (sectionMod.Name == Modes.Mods.HardRock)
{ {
difficultyReductionSection.EasyButton.Deselect(); difficultyReductionSection.EasyButton?.Deselect();
} }
else if (sectionMod.Name == Modes.Mods.Easy) else if (sectionMod.Name == Modes.Mods.Easy)
{ {
difficultyIncreaseSection.HardRockButton.Deselect(); difficultyIncreaseSection.HardRockButton?.Deselect();
} }
if (sectionMod.Name == Modes.Mods.SuddenDeath || sectionMod.Name == Modes.Mods.Perfect) if (sectionMod.Name == Modes.Mods.SuddenDeath || sectionMod.Name == Modes.Mods.Perfect)
{ {
difficultyReductionSection.NoFailButton.Deselect(); difficultyReductionSection.NoFailButton?.Deselect();
assistedSection.RelaxButton.Deselect(); assistedSection.RelaxButton?.Deselect();
assistedSection.AutopilotButton.Deselect(); assistedSection.AutopilotButton?.Deselect();
assistedSection.AutoplayCinemaButton.Deselect(); assistedSection.AutoplayCinemaButton?.Deselect();
} }
else if (sectionMod.Name == Modes.Mods.NoFail || sectionMod.Name == Modes.Mods.Relax || sectionMod.Name == Modes.Mods.Relax2 || sectionMod.Name == Modes.Mods.Autoplay || sectionMod.Name == Modes.Mods.Cinema) else if (sectionMod.Name == Modes.Mods.NoFail || sectionMod.Name == Modes.Mods.Relax || sectionMod.Name == Modes.Mods.Autopilot || sectionMod.Name == Modes.Mods.Autoplay || sectionMod.Name == Modes.Mods.Cinema)
{ {
difficultyIncreaseSection.SuddenDeathButton.Deselect(); difficultyIncreaseSection.SuddenDeathButton?.Deselect();
} }
if (sectionMod.Name == Modes.Mods.DoubleTime || sectionMod.Name == Modes.Mods.Nightcore) if (sectionMod.Name == Modes.Mods.DoubleTime || sectionMod.Name == Modes.Mods.Nightcore)
{ {
difficultyReductionSection.HalfTimeButton.Deselect(); difficultyReductionSection.HalfTimeButton?.Deselect();
} }
else if (sectionMod.Name == Modes.Mods.HalfTime) else if (sectionMod.Name == Modes.Mods.HalfTime)
{ {
difficultyIncreaseSection.DoubleTimeNightcoreButton.Deselect(); difficultyIncreaseSection.DoubleTimeNightcoreButton?.Deselect();
} }
} }
@ -155,12 +195,11 @@ namespace osu.Game.Overlays.Mods
foreach (Mod mod in SelectedMods.Value) foreach (Mod mod in SelectedMods.Value)
{ {
// TODO: Make this take the actual current mode multiplier *= mod.ScoreMultiplier(ModMode);
multiplier *= mod.ScoreMultiplier(PlayMode.Osu);
if (ranked) if (ranked)
{ {
ranked = mod.Ranked(PlayMode.Osu); ranked = mod.Ranked(ModMode);
} }
} }
@ -193,7 +232,7 @@ namespace osu.Game.Overlays.Mods
SelectedMods.Value = selectedMods.ToArray(); SelectedMods.Value = selectedMods.ToArray();
} }
public ModSelector() public ModSelect()
{ {
Children = new Drawable[] Children = new Drawable[]
{ {
@ -353,7 +392,7 @@ namespace osu.Game.Overlays.Mods
}, },
}, },
}, },
new FlowContainer modSectionsContainer = new FlowContainer
{ {
Origin = Anchor.TopCentre, Origin = Anchor.TopCentre,
Anchor = Anchor.TopCentre, Anchor = Anchor.TopCentre,
@ -381,7 +420,7 @@ namespace osu.Game.Overlays.Mods
Anchor = Anchor.TopCentre, Anchor = Anchor.TopCentre,
Action = modButtonPressed, Action = modButtonPressed,
}, },
assistedSection = new AssistedSection assistedSection = new AssistedSection(PlayMode.Osu)
{ {
RelativeSizeAxes = Axes.X, RelativeSizeAxes = Axes.X,
Origin = Anchor.TopCentre, Origin = Anchor.TopCentre,

View File

@ -29,7 +29,6 @@ using OpenTK.Input;
using System.Collections.Generic; using System.Collections.Generic;
using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Containers;
using osu.Framework.Threading; using osu.Framework.Threading;
using osu.Game.Overlays.Mods;
namespace osu.Game.Screens.Select namespace osu.Game.Screens.Select
{ {
@ -45,7 +44,7 @@ namespace osu.Game.Screens.Select
private static readonly Vector2 wedged_container_size = new Vector2(0.5f, 225); private static readonly Vector2 wedged_container_size = new Vector2(0.5f, 225);
private BeatmapInfoWedge beatmapInfoWedge; private BeatmapInfoWedge beatmapInfoWedge;
private ModSelector modSelect; private Overlays.Mods.ModSelect modSelect;
private static readonly Vector2 background_blur = new Vector2(20); private static readonly Vector2 background_blur = new Vector2(20);
private CancellationTokenSource initialAddSetsTask; private CancellationTokenSource initialAddSetsTask;
@ -135,7 +134,7 @@ namespace osu.Game.Screens.Select
Right = 20, Right = 20,
}, },
}, },
modSelect = new ModSelector modSelect = new Overlays.Mods.ModSelect
{ {
RelativeSizeAxes = Axes.Both, RelativeSizeAxes = Axes.Both,
Origin = Anchor.BottomCentre, Origin = Anchor.BottomCentre,
@ -156,6 +155,11 @@ namespace osu.Game.Screens.Select
{ {
playMode = osuGame.PlayMode; playMode = osuGame.PlayMode;
playMode.ValueChanged += playMode_ValueChanged; playMode.ValueChanged += playMode_ValueChanged;
modSelect.ModMode = playMode;
}
else
{
modSelect.ModMode = PlayMode.Osu;
} }
if (database == null) if (database == null)

View File

@ -272,7 +272,7 @@
<Compile Include="Overlays\Pause\ResumeButton.cs" /> <Compile Include="Overlays\Pause\ResumeButton.cs" />
<Compile Include="Overlays\Pause\RetryButton.cs" /> <Compile Include="Overlays\Pause\RetryButton.cs" />
<Compile Include="Overlays\Pause\QuitButton.cs" /> <Compile Include="Overlays\Pause\QuitButton.cs" />
<Compile Include="Overlays\Mods\ModSelector.cs" /> <Compile Include="Overlays\Mods\ModSelect.cs" />
<Compile Include="Modes\Mod.cs" /> <Compile Include="Modes\Mod.cs" />
<Compile Include="Overlays\Mods\ModButton.cs" /> <Compile Include="Overlays\Mods\ModButton.cs" />
<Compile Include="Modes\UI\ModIcon.cs" /> <Compile Include="Modes\UI\ModIcon.cs" />