From 8e01fb70c375d46ee3ef89e6bdee087ee04837ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 13 Oct 2025 11:39:56 +0200 Subject: [PATCH] Fix artist/title keyword filters not working properly with not-equals operator Closes https://github.com/ppy/osu/issues/35264. --- .../Select/Carousel/CarouselBeatmap.cs | 21 +++++++++++++++---- .../SelectV2/BeatmapCarouselFilterMatching.cs | 21 +++++++++++++++---- 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/osu.Game/Screens/Select/Carousel/CarouselBeatmap.cs b/osu.Game/Screens/Select/Carousel/CarouselBeatmap.cs index 970f25d04b..39bf4e134b 100644 --- a/osu.Game/Screens/Select/Carousel/CarouselBeatmap.cs +++ b/osu.Game/Screens/Select/Carousel/CarouselBeatmap.cs @@ -77,10 +77,23 @@ namespace osu.Game.Screens.Select.Carousel if (!match) return false; match &= !criteria.Creator.HasFilter || criteria.Creator.Matches(BeatmapInfo.Metadata.Author.Username); - match &= !criteria.Artist.HasFilter || criteria.Artist.Matches(BeatmapInfo.Metadata.Artist) || - criteria.Artist.Matches(BeatmapInfo.Metadata.ArtistUnicode); - match &= !criteria.Title.HasFilter || criteria.Title.Matches(BeatmapInfo.Metadata.Title) || - criteria.Title.Matches(BeatmapInfo.Metadata.TitleUnicode); + + if (criteria.Artist.HasFilter) + { + if (criteria.Artist.ExcludeTerm) + match &= criteria.Artist.Matches(BeatmapInfo.Metadata.Artist) && criteria.Artist.Matches(BeatmapInfo.Metadata.ArtistUnicode); + else + match &= criteria.Artist.Matches(BeatmapInfo.Metadata.Artist) || criteria.Artist.Matches(BeatmapInfo.Metadata.ArtistUnicode); + } + + if (criteria.Title.HasFilter) + { + if (criteria.Title.ExcludeTerm) + match &= criteria.Title.Matches(BeatmapInfo.Metadata.Title) && criteria.Title.Matches(BeatmapInfo.Metadata.TitleUnicode); + else + match &= criteria.Title.Matches(BeatmapInfo.Metadata.Title) || criteria.Title.Matches(BeatmapInfo.Metadata.TitleUnicode); + } + match &= !criteria.DifficultyName.HasFilter || criteria.DifficultyName.Matches(BeatmapInfo.DifficultyName); match &= !criteria.Source.HasFilter || criteria.Source.Matches(BeatmapInfo.Metadata.Source); diff --git a/osu.Game/Screens/SelectV2/BeatmapCarouselFilterMatching.cs b/osu.Game/Screens/SelectV2/BeatmapCarouselFilterMatching.cs index 9a9ba5352b..2a132a8a45 100644 --- a/osu.Game/Screens/SelectV2/BeatmapCarouselFilterMatching.cs +++ b/osu.Game/Screens/SelectV2/BeatmapCarouselFilterMatching.cs @@ -96,10 +96,23 @@ namespace osu.Game.Screens.SelectV2 if (!match) return false; match &= !criteria.Creator.HasFilter || criteria.Creator.Matches(beatmap.Metadata.Author.Username); - match &= !criteria.Artist.HasFilter || criteria.Artist.Matches(beatmap.Metadata.Artist) || - criteria.Artist.Matches(beatmap.Metadata.ArtistUnicode); - match &= !criteria.Title.HasFilter || criteria.Title.Matches(beatmap.Metadata.Title) || - criteria.Title.Matches(beatmap.Metadata.TitleUnicode); + + if (criteria.Artist.HasFilter) + { + if (criteria.Artist.ExcludeTerm) + match &= criteria.Artist.Matches(beatmap.Metadata.Artist) && criteria.Artist.Matches(beatmap.Metadata.ArtistUnicode); + else + match &= criteria.Artist.Matches(beatmap.Metadata.Artist) || criteria.Artist.Matches(beatmap.Metadata.ArtistUnicode); + } + + if (criteria.Title.HasFilter) + { + if (criteria.Title.ExcludeTerm) + match &= criteria.Title.Matches(beatmap.Metadata.Title) && criteria.Title.Matches(beatmap.Metadata.TitleUnicode); + else + match &= criteria.Title.Matches(beatmap.Metadata.Title) || criteria.Title.Matches(beatmap.Metadata.TitleUnicode); + } + match &= !criteria.DifficultyName.HasFilter || criteria.DifficultyName.Matches(beatmap.DifficultyName); match &= !criteria.Source.HasFilter || criteria.Source.Matches(beatmap.Metadata.Source);