using System;
using System.Text;
using Tomlet.Attributes;
namespace MinecraftClient.ChatBots
{
///
/// In-Chat Hangman game
///
public class HangmanGame : ChatBot
{
public static Configs Config = new();
[TomlDoNotInlineObject]
public class Configs
{
[NonSerialized]
private const string BotName = "HangmanGame";
public bool Enabled = false;
public bool English = true;
public string FileWords_EN = "hangman-en.txt";
public string FileWords_FR = "hangman-fr.txt";
public void OnSettingUpdate()
{
FileWords_EN ??= string.Empty;
FileWords_FR ??= string.Empty;
}
}
private int vie = 0;
private readonly int vie_param = 10;
private int compteur = 0;
private readonly int compteur_param = 3000; //5 minutes
private bool running = false;
private bool[] discovered = Array.Empty();
private string word = "";
private string letters = "";
public override void Update()
{
if (running)
{
if (compteur > 0)
{
compteur--;
}
else
{
SendText(Config.English ? "You took too long to try a letter." : "Temps imparti écoulé !");
SendText(Config.English ? "Game canceled." : "Partie annulée.");
running = false;
}
}
}
public override void GetText(string text)
{
string message = "";
string username = "";
text = GetVerbatim(text);
if (IsPrivateMessage(text, ref message, ref username))
{
if (Settings.Config.Main.Advanced.BotOwners.Contains(username.ToLower()))
{
switch (message)
{
case "start":
Start();
break;
case "stop":
running = false;
break;
default:
break;
}
}
}
else
{
if (running && IsChatMessage(text, ref message, ref username))
{
if (message.Length == 1)
{
char letter = message.ToUpper()[0];
if (letter >= 'A' && letter <= 'Z')
{
if (letters.Contains(letter))
{
SendText(Config.English ? ("Letter " + letter + " has already been tried.") : ("Le " + letter + " a déjà été proposé."));
}
else
{
letters += letter;
compteur = compteur_param;
if (word.Contains(letter))
{
for (int i = 0; i < word.Length; i++) { if (word[i] == letter) { discovered[i] = true; } }
SendText(Config.English ? ("Yes, the word contains a " + letter + '!') : ("Le " + letter + " figurait bien dans le mot :)"));
}
else
{
vie--;
if (vie == 0)
{
SendText(Config.English ? "Game Over! :]" : "Perdu ! Partie terminée :]");
SendText(Config.English ? ("The word was: " + word) : ("Le mot était : " + word));
running = false;
}
else SendText(Config.English ? ("The " + letter + "? No.") : ("Le " + letter + " ? Non."));
}
if (running)
{
SendText(Config.English ? ("Mysterious word: " + WordCached + " (lives : " + vie + ")")
: ("Mot mystère : " + WordCached + " (vie : " + vie + ")"));
}
if (Winner)
{
SendText(Config.English ? ("Congrats, " + username + '!') : ("Félicitations, " + username + " !"));
running = false;
}
}
}
}
}
}
}
private void Start()
{
vie = vie_param;
running = true;
letters = "";
word = Chooseword();
compteur = compteur_param;
discovered = new bool[word.Length];
SendText(Config.English ? "Hangman v1.0 - By ORelio" : "Pendu v1.0 - Par ORelio");
SendText(Config.English ? ("Mysterious word: " + WordCached + " (lives : " + vie + ")")
: ("Mot mystère : " + WordCached + " (vie : " + vie + ")"));
SendText(Config.English ? ("Try some letters ... :)") : ("Proposez une lettre ... :)"));
}
private string Chooseword()
{
if (System.IO.File.Exists(Config.English ? Config.FileWords_EN : Config.FileWords_FR))
{
string[] dico = System.IO.File.ReadAllLines(Config.English ? Config.FileWords_EN : Config.FileWords_FR, Encoding.UTF8);
return dico[new Random().Next(dico.Length)];
}
else
{
LogToConsole(Config.English ? "File not found: " + Config.FileWords_EN : "Fichier introuvable : " + Config.FileWords_FR);
return Config.English ? "WORDSAREMISSING" : "DICOMANQUANT";
}
}
private string WordCached
{
get
{
string printed = "";
for (int i = 0; i < word.Length; i++)
{
if (discovered[i])
{
printed += word[i];
}
else printed += '_';
}
return printed;
}
}
private bool Winner
{
get
{
for (int i = 0; i < discovered.Length; i++)
{
if (!discovered[i])
{
return false;
}
}
return true;
}
}
}
}