mirror of
https://github.com/ppy/osu.git
synced 2024-12-14 06:52:55 +08:00
Add very basic replay handling
This commit is contained in:
parent
57d02f9b64
commit
33fdc2c1d6
@ -22,6 +22,7 @@ namespace osu.Game.Rulesets.Catch
|
|||||||
[Description("Move right")]
|
[Description("Move right")]
|
||||||
MoveRight,
|
MoveRight,
|
||||||
[Description("Engage dash")]
|
[Description("Engage dash")]
|
||||||
Dash
|
Dash,
|
||||||
|
PositionUpdate
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -81,7 +81,7 @@ namespace osu.Game.Rulesets.Catch
|
|||||||
{
|
{
|
||||||
Mods = new Mod[]
|
Mods = new Mod[]
|
||||||
{
|
{
|
||||||
new ModAutoplay<CatchHitObject>(),
|
new CatchModAutoplay(),
|
||||||
new ModCinema(),
|
new ModCinema(),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
24
osu.Game.Rulesets.Catch/Mods/CatchModAutoplay.cs
Normal file
24
osu.Game.Rulesets.Catch/Mods/CatchModAutoplay.cs
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using osu.Game.Beatmaps;
|
||||||
|
using osu.Game.Rulesets.Catch.Objects;
|
||||||
|
using osu.Game.Rulesets.Catch.Replays;
|
||||||
|
using osu.Game.Rulesets.Mods;
|
||||||
|
using osu.Game.Rulesets.Scoring;
|
||||||
|
using osu.Game.Users;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Catch.Mods
|
||||||
|
{
|
||||||
|
public class CatchModAutoplay : ModAutoplay<CatchHitObject>
|
||||||
|
{
|
||||||
|
protected override Score CreateReplayScore(Beatmap<CatchHitObject> beatmap)
|
||||||
|
{
|
||||||
|
return new Score
|
||||||
|
{
|
||||||
|
User = new User { Username = "osu!salad!" },
|
||||||
|
Replay = new CatchAutoGenerator(beatmap).Generate(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
54
osu.Game.Rulesets.Catch/Replays/CatchAutoGenerator.cs
Normal file
54
osu.Game.Rulesets.Catch/Replays/CatchAutoGenerator.cs
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using System.Linq;
|
||||||
|
using osu.Game.Beatmaps;
|
||||||
|
using osu.Game.Rulesets.Catch.Objects;
|
||||||
|
using osu.Game.Rulesets.Replays;
|
||||||
|
using osu.Game.Users;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Catch.Replays
|
||||||
|
{
|
||||||
|
internal class CatchAutoGenerator : AutoGenerator<CatchHitObject>
|
||||||
|
{
|
||||||
|
public const double RELEASE_DELAY = 20;
|
||||||
|
|
||||||
|
public CatchAutoGenerator(Beatmap<CatchHitObject> beatmap)
|
||||||
|
: base(beatmap)
|
||||||
|
{
|
||||||
|
Replay = new Replay { User = new User { Username = @"Autoplay" } };
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Replay Replay;
|
||||||
|
|
||||||
|
public override Replay Generate()
|
||||||
|
{
|
||||||
|
// Todo: Realistically this shouldn't be needed, but the first frame is skipped with the way replays are currently handled
|
||||||
|
Replay.Frames.Add(new CatchReplayFrame(-100000, 0));
|
||||||
|
|
||||||
|
foreach (var obj in Beatmap.HitObjects)
|
||||||
|
{
|
||||||
|
switch (obj)
|
||||||
|
{
|
||||||
|
case Fruit _:
|
||||||
|
Replay.Frames.Add(new CatchReplayFrame(obj.StartTime, obj.X));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var nestedObj in obj.NestedHitObjects.Cast<CatchHitObject>())
|
||||||
|
{
|
||||||
|
switch (nestedObj)
|
||||||
|
{
|
||||||
|
case BananaShower.Banana _:
|
||||||
|
case TinyDroplet _:
|
||||||
|
case Droplet _:
|
||||||
|
Replay.Frames.Add(new CatchReplayFrame(nestedObj.StartTime, nestedObj.X));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Replay;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using osu.Framework.Input;
|
||||||
|
using osu.Game.Rulesets.Replays;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Catch.Replays
|
||||||
|
{
|
||||||
|
public class CatchFramedReplayInputHandler : FramedReplayInputHandler
|
||||||
|
{
|
||||||
|
public CatchFramedReplayInputHandler(Replay replay)
|
||||||
|
: base(replay)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override List<InputState> GetPendingStates() => new List<InputState>
|
||||||
|
{
|
||||||
|
new CatchReplayState
|
||||||
|
{
|
||||||
|
PressedActions = new List<CatchAction> { CatchAction.PositionUpdate },
|
||||||
|
CatcherX = ((CatchReplayFrame)CurrentFrame).MouseX
|
||||||
|
},
|
||||||
|
new CatchReplayState { PressedActions = new List<CatchAction>() },
|
||||||
|
};
|
||||||
|
|
||||||
|
public class CatchReplayState : ReplayState<CatchAction>
|
||||||
|
{
|
||||||
|
public float? CatcherX { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
17
osu.Game.Rulesets.Catch/Replays/CatchReplayFrame.cs
Normal file
17
osu.Game.Rulesets.Catch/Replays/CatchReplayFrame.cs
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using osu.Game.Rulesets.Replays;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Catch.Replays
|
||||||
|
{
|
||||||
|
public class CatchReplayFrame : ReplayFrame
|
||||||
|
{
|
||||||
|
public override bool IsImportant => MouseX > 0;
|
||||||
|
|
||||||
|
public CatchReplayFrame(double time, float? x = null)
|
||||||
|
: base(time, x ?? -1, null, ReplayButtonState.None)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -6,8 +6,10 @@ using osu.Game.Beatmaps;
|
|||||||
using osu.Game.Rulesets.Catch.Beatmaps;
|
using osu.Game.Rulesets.Catch.Beatmaps;
|
||||||
using osu.Game.Rulesets.Catch.Objects;
|
using osu.Game.Rulesets.Catch.Objects;
|
||||||
using osu.Game.Rulesets.Catch.Objects.Drawable;
|
using osu.Game.Rulesets.Catch.Objects.Drawable;
|
||||||
|
using osu.Game.Rulesets.Catch.Replays;
|
||||||
using osu.Game.Rulesets.Catch.Scoring;
|
using osu.Game.Rulesets.Catch.Scoring;
|
||||||
using osu.Game.Rulesets.Objects.Drawables;
|
using osu.Game.Rulesets.Objects.Drawables;
|
||||||
|
using osu.Game.Rulesets.Replays;
|
||||||
using osu.Game.Rulesets.Scoring;
|
using osu.Game.Rulesets.Scoring;
|
||||||
using osu.Game.Rulesets.UI;
|
using osu.Game.Rulesets.UI;
|
||||||
using osu.Game.Rulesets.UI.Scrolling;
|
using osu.Game.Rulesets.UI.Scrolling;
|
||||||
@ -23,6 +25,8 @@ namespace osu.Game.Rulesets.Catch.UI
|
|||||||
|
|
||||||
public override ScoreProcessor CreateScoreProcessor() => new CatchScoreProcessor(this);
|
public override ScoreProcessor CreateScoreProcessor() => new CatchScoreProcessor(this);
|
||||||
|
|
||||||
|
protected override FramedReplayInputHandler CreateReplayInputHandler(Replay replay) => new CatchFramedReplayInputHandler(replay);
|
||||||
|
|
||||||
protected override BeatmapProcessor<CatchHitObject> CreateBeatmapProcessor() => new CatchBeatmapProcessor();
|
protected override BeatmapProcessor<CatchHitObject> CreateBeatmapProcessor() => new CatchBeatmapProcessor();
|
||||||
|
|
||||||
protected override BeatmapConverter<CatchHitObject> CreateBeatmapConverter() => new CatchBeatmapConverter();
|
protected override BeatmapConverter<CatchHitObject> CreateBeatmapConverter() => new CatchBeatmapConverter();
|
||||||
|
@ -13,6 +13,7 @@ using osu.Framework.MathUtils;
|
|||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Rulesets.Catch.Objects;
|
using osu.Game.Rulesets.Catch.Objects;
|
||||||
using osu.Game.Rulesets.Catch.Objects.Drawable;
|
using osu.Game.Rulesets.Catch.Objects.Drawable;
|
||||||
|
using osu.Game.Rulesets.Catch.Replays;
|
||||||
using osu.Game.Rulesets.Judgements;
|
using osu.Game.Rulesets.Judgements;
|
||||||
using osu.Game.Rulesets.Objects.Drawables;
|
using osu.Game.Rulesets.Objects.Drawables;
|
||||||
using osu.Game.Rulesets.UI;
|
using osu.Game.Rulesets.UI;
|
||||||
@ -21,7 +22,7 @@ using OpenTK.Graphics;
|
|||||||
|
|
||||||
namespace osu.Game.Rulesets.Catch.UI
|
namespace osu.Game.Rulesets.Catch.UI
|
||||||
{
|
{
|
||||||
public class CatcherArea : Container
|
public class CatcherArea : Container, IKeyBindingHandler<CatchAction>
|
||||||
{
|
{
|
||||||
public const float CATCHER_SIZE = 172;
|
public const float CATCHER_SIZE = 172;
|
||||||
|
|
||||||
@ -72,6 +73,20 @@ namespace osu.Game.Rulesets.Catch.UI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool OnPressed(CatchAction action)
|
||||||
|
{
|
||||||
|
if (action != CatchAction.PositionUpdate) return false;
|
||||||
|
|
||||||
|
CatchFramedReplayInputHandler.CatchReplayState state = (CatchFramedReplayInputHandler.CatchReplayState)GetContainingInputManager().CurrentState;
|
||||||
|
|
||||||
|
if (state.CatcherX.HasValue)
|
||||||
|
MovableCatcher.X = state.CatcherX.Value;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool OnReleased(CatchAction action) => false;
|
||||||
|
|
||||||
public bool AttemptCatch(CatchHitObject obj) => MovableCatcher.AttemptCatch(obj);
|
public bool AttemptCatch(CatchHitObject obj) => MovableCatcher.AttemptCatch(obj);
|
||||||
|
|
||||||
public class Catcher : Container, IKeyBindingHandler<CatchAction>
|
public class Catcher : Container, IKeyBindingHandler<CatchAction>
|
||||||
|
@ -60,11 +60,15 @@
|
|||||||
<Compile Include="Mods\CatchModPerfect.cs" />
|
<Compile Include="Mods\CatchModPerfect.cs" />
|
||||||
<Compile Include="Mods\CatchModRelax.cs" />
|
<Compile Include="Mods\CatchModRelax.cs" />
|
||||||
<Compile Include="Mods\CatchModSuddenDeath.cs" />
|
<Compile Include="Mods\CatchModSuddenDeath.cs" />
|
||||||
|
<Compile Include="Mods\CatchModAutoplay.cs" />
|
||||||
<Compile Include="Objects\Drawable\DrawableCatchHitObject.cs" />
|
<Compile Include="Objects\Drawable\DrawableCatchHitObject.cs" />
|
||||||
<Compile Include="Objects\Drawable\DrawableDroplet.cs" />
|
<Compile Include="Objects\Drawable\DrawableDroplet.cs" />
|
||||||
<Compile Include="Objects\Drawable\DrawableJuiceStream.cs" />
|
<Compile Include="Objects\Drawable\DrawableJuiceStream.cs" />
|
||||||
<Compile Include="Objects\Drawable\Pieces\Pulp.cs" />
|
<Compile Include="Objects\Drawable\Pieces\Pulp.cs" />
|
||||||
<Compile Include="Objects\JuiceStream.cs" />
|
<Compile Include="Objects\JuiceStream.cs" />
|
||||||
|
<Compile Include="Replays\CatchAutoGenerator.cs" />
|
||||||
|
<Compile Include="Replays\CatchFramedReplayInputHandler.cs" />
|
||||||
|
<Compile Include="Replays\CatchReplayFrame.cs" />
|
||||||
<Compile Include="Scoring\CatchScoreProcessor.cs" />
|
<Compile Include="Scoring\CatchScoreProcessor.cs" />
|
||||||
<Compile Include="Judgements\CatchJudgement.cs" />
|
<Compile Include="Judgements\CatchJudgement.cs" />
|
||||||
<Compile Include="Objects\CatchHitObject.cs" />
|
<Compile Include="Objects\CatchHitObject.cs" />
|
||||||
|
Loading…
Reference in New Issue
Block a user