diff --git a/osu.Game.Rulesets.PumpTrainer/Beatmaps/NextHitObjectGenerator.cs b/osu.Game.Rulesets.PumpTrainer/Beatmaps/NextHitObjectGenerator.cs index 7fb1bfe..955a3be 100644 --- a/osu.Game.Rulesets.PumpTrainer/Beatmaps/NextHitObjectGenerator.cs +++ b/osu.Game.Rulesets.PumpTrainer/Beatmaps/NextHitObjectGenerator.cs @@ -424,24 +424,38 @@ private void banColumnsCausingBannedPatterns(List candidateColumns, Foot // Ban horizontal triples if (random.NextDouble() > Settings.HorizontalTripleFrequency) { - int previousPhysicalColumn = columnToPhysicalColumn[previousColumn]; - int previousPreviousPhysicalColumn = columnToPhysicalColumn[previousPreviousColumn]; - - if (previousPhysicalColumn - previousPreviousPhysicalColumn == 1) - { - // Going right! - List columnsToBan = columnToPhysicalColumn.Where(entry => entry.Value == previousPhysicalColumn + 1).Select(entry => entry.Key).ToList(); - candidateColumns.RemoveAll(columnsToBan.Contains); - } - else if (previousPhysicalColumn - previousPreviousPhysicalColumn == -1) + // Only bother banning ban if both previous columns are in the half-doubles zone + if (columnIsInHalfDoublesZone(previousColumn) && columnIsInHalfDoublesZone(previousPreviousColumn)) { - // Going left! - List columnsToBan = columnToPhysicalColumn.Where(entry => entry.Value == previousPhysicalColumn - 1).Select(entry => entry.Key).ToList(); + int previousPhysicalColumn = columnToPhysicalColumn[previousColumn]; + int previousPreviousPhysicalColumn = columnToPhysicalColumn[previousPreviousColumn]; + + List columnsToBan = []; + + if (previousPhysicalColumn - previousPreviousPhysicalColumn == 1) + { + // Going right! + columnsToBan = columnToPhysicalColumn.Where(entry => entry.Value == previousPhysicalColumn + 1).Select(entry => entry.Key).ToList(); + } + else if (previousPhysicalColumn - previousPreviousPhysicalColumn == -1) + { + // Going left! + columnsToBan = columnToPhysicalColumn.Where(entry => entry.Value == previousPhysicalColumn - 1).Select(entry => entry.Key).ToList(); + } + + // Only ban columns that are in the half-doubles zone + columnsToBan = columnsToBan.Where(columnIsInHalfDoublesZone).ToList(); + candidateColumns.RemoveAll(columnsToBan.Contains); } } } + private bool columnIsInHalfDoublesZone(Column column) + { + return columnToPhysicalColumn[column] >= 1 && columnToPhysicalColumn[column] <= 4; + } + private Column getRandomCandidateColumn(List candidateColumns, int nonRepeatExtraWeight) { if (candidateColumns.Count == 0) diff --git a/osu.Game.Rulesets.PumpTrainer/Beatmaps/PumpTrainerBeatmapConverterSettings.cs b/osu.Game.Rulesets.PumpTrainer/Beatmaps/PumpTrainerBeatmapConverterSettings.cs index 07fd5ec..a30a852 100644 --- a/osu.Game.Rulesets.PumpTrainer/Beatmaps/PumpTrainerBeatmapConverterSettings.cs +++ b/osu.Game.Rulesets.PumpTrainer/Beatmaps/PumpTrainerBeatmapConverterSettings.cs @@ -50,11 +50,13 @@ public class PumpTrainerBeatmapConverterSettings public double DiagonalSkipFrequency = 0; /// - /// 0 to 1 determining how frequently to generate 3 adjacent notes that span consecutive, unique columns on the physical dance pad. + /// 0 to 1 determining how frequently to generate 3 adjacent notes that span consecutive, unique columns on the physical dance pad, + /// in the half-double region (not a singles pad). /// Higher means more likely. For example, P1UR and P1DR are on the same unique column on the physical dance pad. /// Example starting left foot: P1C --> P1DR --> P2UL /// Example starting right foot: P2UL --> P1DR --> P1C (horizontal twists would have to be on for this to happen) - /// The following would NOT count as a horizontal triple, starting left foot: P1C --> P2UL --> P1DR + /// NOT a horizontal triple: starting left foot: P1C --> P2UL --> P1DR + /// NOT a horizontal triple, starting left foot: P1UL --> P1C --> P1UR (because it only spans a singles pad) /// public double HorizontalTripleFrequency = 0; diff --git a/osu.Game.Rulesets.PumpTrainer/Mods/PumpTrainerModBanSinglesTwists.cs b/osu.Game.Rulesets.PumpTrainer/Mods/PumpTrainerModBanSinglesTwists.cs index 4567027..be7b6ad 100644 --- a/osu.Game.Rulesets.PumpTrainer/Mods/PumpTrainerModBanSinglesTwists.cs +++ b/osu.Game.Rulesets.PumpTrainer/Mods/PumpTrainerModBanSinglesTwists.cs @@ -20,7 +20,7 @@ public class PumpTrainerModBanSinglesTwists : Mod, IApplicableToBeatmapConverter Precision = 0.1, }; - public override string Name => "[P1Single+] Ban Singles Twists"; + public override string Name => "[P1Single+] Ban Simple Twists"; public override string Acronym => "S"; public override LocalisableString Description => "Reduces the frequency of the right foot hitting the left pads, and vice versa, in the context of a single pad."; diff --git a/osu.Game.Rulesets.PumpTrainer/Mods/PumpTrainerModHorizontalTriples.cs b/osu.Game.Rulesets.PumpTrainer/Mods/PumpTrainerModHorizontalTriples.cs index 80ddf11..ba78a21 100644 --- a/osu.Game.Rulesets.PumpTrainer/Mods/PumpTrainerModHorizontalTriples.cs +++ b/osu.Game.Rulesets.PumpTrainer/Mods/PumpTrainerModHorizontalTriples.cs @@ -1,29 +1,40 @@ -using osu.Framework.Bindables; +using System; +using osu.Framework.Bindables; using osu.Framework.Localisation; using osu.Game.Beatmaps; using osu.Game.Configuration; using osu.Game.Rulesets.Mods; using osu.Game.Rulesets.PumpTrainer.Beatmaps; +using osu.Game.Rulesets.PumpTrainer.Mods.ExcludeColumns; namespace osu.Game.Rulesets.PumpTrainer.Mods { public class PumpTrainerModHorizontalTriples : Mod, IApplicableToBeatmapConverter { [SettingSource("Frequency")] - public Bindable HorizontalTripleFrequency { get; } = new BindableDouble(1.0) + public Bindable HorizontalTripleFrequency { get; } = new BindableDouble(0.5) { MinValue = 0.1, MaxValue = 1.0, - Default = 1.0, + Default = 0.5, Precision = 0.1, }; - public override string Name => "Horizontal Triples"; + public override string Name => "[Half-Dbl+] Horizontal Triples"; public override string Acronym => "HHH"; public override LocalisableString Description => - "Three consecutive notes spanning three physical dance pad columns (not note columns) in one direction."; + "Three consecutive notes spanning three physical dance pad columns (not note columns) in one direction, in the half-doubles region."; public override double ScoreMultiplier => 1; public override ModType Type => ModType.DifficultyIncrease; + public override Type[] IncompatibleMods => new Type[] + { + typeof(PumpTrainerModExcludeP1C), + typeof(PumpTrainerModExcludeP1UR), + typeof(PumpTrainerModExcludeP1DR), + typeof(PumpTrainerModExcludeP2DL), + typeof(PumpTrainerModExcludeP2UL), + typeof(PumpTrainerModExcludeP2C), + }; public void ApplyToBeatmapConverter(IBeatmapConverter beatmapConverter) { diff --git a/osu.Game.Rulesets.PumpTrainer/Mods/PumpTrainerModHorizontalTwists.cs b/osu.Game.Rulesets.PumpTrainer/Mods/PumpTrainerModHorizontalTwists.cs index 01be9a8..84cf8ca 100644 --- a/osu.Game.Rulesets.PumpTrainer/Mods/PumpTrainerModHorizontalTwists.cs +++ b/osu.Game.Rulesets.PumpTrainer/Mods/PumpTrainerModHorizontalTwists.cs @@ -21,8 +21,7 @@ public class PumpTrainerModHorizontalTwists : Mod, IApplicableToBeatmapConverter public override string Name => "Horizontal Twists"; public override string Acronym => "H"; public override LocalisableString Description => - "Horizontal crossovers involving a center panel.\n" + - "Requires the \"horizontal triples\" mod to be enabled."; + "Horizontal crossovers involving a center panel."; public override double ScoreMultiplier => 1; public override ModType Type => ModType.DifficultyIncrease; diff --git a/osu.Game.Rulesets.PumpTrainer/Mods/PumpTrainerModIgnoreOsuSliderEnds.cs b/osu.Game.Rulesets.PumpTrainer/Mods/PumpTrainerModIgnoreOsuSliderEnds.cs index 58888a8..2a8da00 100644 --- a/osu.Game.Rulesets.PumpTrainer/Mods/PumpTrainerModIgnoreOsuSliderEnds.cs +++ b/osu.Game.Rulesets.PumpTrainer/Mods/PumpTrainerModIgnoreOsuSliderEnds.cs @@ -1,7 +1,5 @@ -using osu.Framework.Bindables; -using osu.Framework.Localisation; +using osu.Framework.Localisation; using osu.Game.Beatmaps; -using osu.Game.Configuration; using osu.Game.Rulesets.Mods; using osu.Game.Rulesets.PumpTrainer.Beatmaps; @@ -9,7 +7,7 @@ namespace osu.Game.Rulesets.PumpTrainer.Mods { public class PumpTrainerModIgnoreOsuSliderEnds : Mod, IApplicableToBeatmapConverter { - public override string Name => "Ignore osu! slider ends"; + public override string Name => "Ignore osu! Slider Ends"; public override string Acronym => "SE"; public override LocalisableString Description => "Recommended for osu! \"tech\"-style maps which have difficult rhythms."; diff --git a/osu.Game.Rulesets.PumpTrainer/PumpTrainerRuleset.cs b/osu.Game.Rulesets.PumpTrainer/PumpTrainerRuleset.cs index 5cbe0ff..9a16eb2 100644 --- a/osu.Game.Rulesets.PumpTrainer/PumpTrainerRuleset.cs +++ b/osu.Game.Rulesets.PumpTrainer/PumpTrainerRuleset.cs @@ -45,10 +45,10 @@ public override IEnumerable GetModsFor(ModType type) case ModType.DifficultyIncrease: return new Mod[] { - new PumpTrainerModHorizontalTriples(), new PumpTrainerModHorizontalTwists(), new PumpTrainerModDiagonalTwists(), new PumpTrainerModDiagonalSkips(), + new PumpTrainerModHorizontalTriples(), new PumpTrainerModDoubleTime(), };