using System; using System.Collections.Generic; using UnityEngine; using System.Linq; using TMPro; using System.Text.RegularExpressions; using UnityEngine.UI; public enum WGameState { Uninitialized, Playing, Win, Lose } public class WordPuzzle : MonoBehaviour { private TMP_Text[] allLetterTexts; private List usedLetterTexts = new List(); private List words = new List(); private int currentCount; private int currentSubmit = 0; public GameObject congratulations; public GameObject retry; public TMP_Text retryText; public Color inWordColor = Color.yellow; public Color perfectMatchColor = Color.green; public Color wrongColor = Color.red; public string currentWord = string.Empty; public WGameState gameState = WGameState.Uninitialized; [SerializeField] private TextAsset textAsset = null; public AudioClip loseSound; public AudioClip winSound; private void Awake() { allLetterTexts = GetComponentsInChildren(); foreach (var text in allLetterTexts) { text.text = string.Empty; } words = Regex.Split(textAsset.text, Environment.NewLine).ToList(); if (string.IsNullOrEmpty(currentWord)) { currentWord = words[UnityEngine.Random.Range(0, words.Count)]; Debug.Log("Chosen random word: " + currentWord); } gameState = WGameState.Uninitialized; } private void Update() { if (gameState == WGameState.Playing) { HandleInput(); } } private void HandleInput() { if (Input.GetKeyDown(KeyCode.Backspace)) { RemoveChar(); } else if (Input.GetKeyDown(KeyCode.Return) || Input.GetKeyDown(KeyCode.KeypadEnter)) { SubmitButtonClick(); } else { foreach (KeyCode key in Enum.GetValues(typeof(KeyCode))) { if (Input.GetKeyDown(key) && key >= KeyCode.A && key <= KeyCode.Z) { DoKeyPress(key.ToString().ToLower()[0]); break; } } } } public void SetGameState(WGameState state) { gameState = state; } public void StartGame(string overrideWord) { currentWord = overrideWord; ResetPuzzle(); } private void RemoveChar() { if (!usedLetterTexts.Any() || currentCount <= 0) return; usedLetterTexts.Last().text = string.Empty; usedLetterTexts.RemoveAt(usedLetterTexts.Count - 1); currentCount--; } private void DoKeyPress(char character) { if (usedLetterTexts.Count >= allLetterTexts.Length || currentCount >= 5) return; var currentText = allLetterTexts[usedLetterTexts.Count]; currentText.text = character.ToString(); usedLetterTexts.Add(currentText); currentCount++; } private void SubmitButtonClick() { if (currentCount != 5) return; var submittedWord = string.Empty; int ii = 0; for (int i = 0 + (currentSubmit * 5); i < usedLetterTexts.Count; i++) { TMP_Text texts = usedLetterTexts[i]; var textsChar = char.Parse(texts.text); submittedWord += textsChar; texts.color = wrongColor; if (currentWord.Contains(textsChar)) { texts.color = inWordColor; if (textsChar == currentWord[ii]) texts.color = perfectMatchColor; } ii++; } if (words.Contains(submittedWord)) { if(submittedWord == currentWord) { congratulations.SetActive(true); SetGameState(WGameState.Win); SoundFXManager.instance.PlaySound(winSound, transform, 1.0f); return; } currentSubmit++; currentCount = 0; } else { for (int i = 0 + (currentSubmit * 5); i < usedLetterTexts.Count; i++) { TMP_Text texts = usedLetterTexts[i]; texts.color = Color.white; } } if(currentSubmit == 6) { retry.SetActive(true); retryText.text = currentWord; SetGameState(WGameState.Lose); SoundFXManager.instance.PlaySound(loseSound, transform, 1.0f); } } public void ResetPuzzle() { allLetterTexts = GetComponentsInChildren(); retry.SetActive(false); congratulations.SetActive(false); usedLetterTexts.Clear(); foreach (var texts in allLetterTexts) { texts.text = string.Empty; texts.color = Color.white; } currentSubmit = 0; currentCount = 0; if (string.IsNullOrEmpty(currentWord)) { currentWord = words[UnityEngine.Random.Range(0, words.Count)]; Debug.Log("Chosen random word: " + currentWord); } SetGameState(WGameState.Playing); } }