diff --git a/src/EllieBot/Modules/Games/Hangman/DefaultHangmanSource.cs b/src/EllieBot/Modules/Games/Hangman/DefaultHangmanSource.cs index 333e8f0..8509e4b 100644 --- a/src/EllieBot/Modules/Games/Hangman/DefaultHangmanSource.cs +++ b/src/EllieBot/Modules/Games/Hangman/DefaultHangmanSource.cs @@ -44,7 +44,7 @@ public sealed class DefaultHangmanSource : IHangmanSource public IReadOnlyCollection<string> GetCategories() => termsDict.Keys.ToList(); - public bool GetTerm(string? category, [NotNullWhen(true)] out HangmanTerm? term) + public bool GetTerm(string? category, [NotNullWhen(true)] out (HangmanTerm Term, string Category)? term) { if (category is null) { @@ -54,7 +54,7 @@ public sealed class DefaultHangmanSource : IHangmanSource if (termsDict.TryGetValue(category, out var terms)) { - term = terms[_rng.Next(0, terms.Length)]; + term = (terms[_rng.Next(0, terms.Length)], category); return true; } diff --git a/src/EllieBot/Modules/Games/Hangman/HangmanCommands.cs b/src/EllieBot/Modules/Games/Hangman/HangmanCommands.cs index 12e29d2..e85fa55 100644 --- a/src/EllieBot/Modules/Games/Hangman/HangmanCommands.cs +++ b/src/EllieBot/Modules/Games/Hangman/HangmanCommands.cs @@ -10,7 +10,8 @@ public partial class Games [Cmd] [RequireContext(ContextType.Guild)] public async Task Hangmanlist() - => await Response().Confirm(GetText(strs.hangman_types(prefix)), _service.GetHangmanTypes().Join('\n')) + => await Response() + .Confirm(GetText(strs.hangman_types(prefix)), _service.GetHangmanTypes().Join('\n')) .SendAsync(); private static string Draw(HangmanGame.State state) @@ -35,29 +36,25 @@ public partial class Games public static EmbedBuilder GetEmbed(IMessageSenderService sender, HangmanGame.State state) { + var eb = sender.CreateEmbed() + .WithOkColor() + .AddField("Hangman", Draw(state)) + .AddField("Guess", Format.Code(state.Word)); + if (state.Phase == HangmanGame.Phase.Running) { - return sender.CreateEmbed() - .WithOkColor() - .AddField("Hangman", Draw(state)) - .AddField("Guess", Format.Code(state.Word)) - .WithFooter(state.MissedLetters.Join(' ')); + return eb + .WithFooter(state.MissedLetters.Join(' ')) + .WithAuthor(state.Category); } if (state.Phase == HangmanGame.Phase.Ended && state.Failed) { - return sender.CreateEmbed() - .WithErrorColor() - .AddField("Hangman", Draw(state)) - .AddField("Guess", Format.Code(state.Word)) + return eb .WithFooter(state.MissedLetters.Join(' ')); } - return sender.CreateEmbed() - .WithOkColor() - .AddField("Hangman", Draw(state)) - .AddField("Guess", Format.Code(state.Word)) - .WithFooter(state.MissedLetters.Join(' ')); + return eb.WithFooter(state.MissedLetters.Join(' ')); } [Cmd] diff --git a/src/EllieBot/Modules/Games/Hangman/HangmanGame.cs b/src/EllieBot/Modules/Games/Hangman/HangmanGame.cs index 58e779b..3b139d3 100644 --- a/src/EllieBot/Modules/Games/Hangman/HangmanGame.cs +++ b/src/EllieBot/Modules/Games/Hangman/HangmanGame.cs @@ -4,9 +4,20 @@ namespace EllieBot.Modules.Games.Hangman; public sealed class HangmanGame { - public enum GuessResult { NoAction, AlreadyTried, Incorrect, Guess, Win } + public enum GuessResult + { + NoAction, + AlreadyTried, + Incorrect, + Guess, + Win + } - public enum Phase { Running, Ended } + public enum Phase + { + Running, + Ended + } private Phase CurrentPhase { get; set; } @@ -17,16 +28,21 @@ public sealed class HangmanGame private readonly string _word; private readonly string _imageUrl; - public HangmanGame(HangmanTerm term) + public string Category { get; } + + public HangmanGame(HangmanTerm term, string cat) { _word = term.Word; _imageUrl = term.ImageUrl; + Category = cat; _remaining = _word.ToLowerInvariant().Where(x => char.IsLetter(x)).Select(char.ToLowerInvariant).ToHashSet(); } public State GetState(GuessResult guessResult = GuessResult.NoAction) - => new(_incorrect.Count, + => new( + Category, + _incorrect.Count, CurrentPhase, CurrentPhase == Phase.Ended ? _word : GetScrambledWord(), guessResult, @@ -99,6 +115,7 @@ public sealed class HangmanGame } public record State( + string Category, int Errors, Phase Phase, string Word, diff --git a/src/EllieBot/Modules/Games/Hangman/HangmanService.cs b/src/EllieBot/Modules/Games/Hangman/HangmanService.cs index c483027..dc7db68 100644 --- a/src/EllieBot/Modules/Games/Hangman/HangmanService.cs +++ b/src/EllieBot/Modules/Games/Hangman/HangmanService.cs @@ -36,10 +36,10 @@ public sealed class HangmanService : IHangmanService, IExecNoCommand public bool StartHangman(ulong channelId, string? category, [NotNullWhen(true)] out HangmanGame.State? state) { state = null; - if (!_source.GetTerm(category, out var term)) + if (!_source.GetTerm(category, out var termData)) return false; - var game = new HangmanGame(term); + var game = new HangmanGame(termData.Value.Term, termData.Value.Category); lock (_locker) { var hc = _hangmanGames.GetOrAdd(channelId, game); diff --git a/src/EllieBot/Modules/Games/Hangman/HangmanTerm.cs b/src/EllieBot/Modules/Games/Hangman/HangmanTerm.cs index 22e5144..edb88f7 100644 --- a/src/EllieBot/Modules/Games/Hangman/HangmanTerm.cs +++ b/src/EllieBot/Modules/Games/Hangman/HangmanTerm.cs @@ -1,4 +1,6 @@ #nullable disable +using YamlDotNet.Serialization; + namespace EllieBot.Modules.Games.Hangman; public sealed class HangmanTerm diff --git a/src/EllieBot/Modules/Games/Hangman/IHangmanSource.cs b/src/EllieBot/Modules/Games/Hangman/IHangmanSource.cs index d28199b..04b3c03 100644 --- a/src/EllieBot/Modules/Games/Hangman/IHangmanSource.cs +++ b/src/EllieBot/Modules/Games/Hangman/IHangmanSource.cs @@ -6,5 +6,5 @@ public interface IHangmanSource : IEService { public IReadOnlyCollection<string> GetCategories(); public void Reload(); - public bool GetTerm(string? category, [NotNullWhen(true)] out HangmanTerm? term); + public bool GetTerm(string? category, [NotNullWhen(true)] out (HangmanTerm Term, string Category)? term); } \ No newline at end of file