// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. using System; using System.Collections.Generic; using osu.Game.Beatmaps; using osu.Game.Replays; using osu.Game.Rulesets.Pippidon.Objects; using osu.Game.Rulesets.Pippidon.UI; using osu.Game.Rulesets.Replays; namespace osu.Game.Rulesets.Pippidon.Replays { public class PippidonAutoGenerator : AutoGenerator { protected Replay Replay; protected List Frames => Replay.Frames; public new Beatmap Beatmap => (Beatmap)base.Beatmap; public PippidonAutoGenerator(IBeatmap beatmap) : base(beatmap) { Replay = new Replay(); } public override Replay Generate() { int currentLane = 0; Frames.Add(new PippidonReplayFrame()); foreach (PippidonHitObject hitObject in Beatmap.HitObjects) { if (currentLane == hitObject.Lane) continue; int totalTravel = Math.Abs(hitObject.Lane - currentLane); var direction = hitObject.Lane > currentLane ? PippidonAction.MoveDown : PippidonAction.MoveUp; double time = hitObject.StartTime - 5; if (totalTravel == PippidonPlayfield.LANE_COUNT - 1) addFrame(time, direction == PippidonAction.MoveDown ? PippidonAction.MoveUp : PippidonAction.MoveDown); else { time -= totalTravel * KEY_UP_DELAY; for (int i = 0; i < totalTravel; i++) { addFrame(time, direction); time += KEY_UP_DELAY; } } currentLane = hitObject.Lane; } return Replay; } private void addFrame(double time, PippidonAction direction) { Frames.Add(new PippidonReplayFrame(direction) { Time = time }); Frames.Add(new PippidonReplayFrame { Time = time + KEY_UP_DELAY }); //Release the keys as well } } }