using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace TheSlimesJourney { public class TextUI : UI { struct GameAction { public GameAction(Game.Actions action, string description) { this.action = action; this.description = description; } public Game.Actions action; public string description; } Dictionary availableActions; bool printedPossibleInputs = false; //---Public--- public void Clear() { Console.Clear(); } public void DescribeEnemies(List enemies) { for (int i = 0; i < enemies.Count; i++) { Character enemy = enemies[i]; string conditionText = "'s condition cannot be ascertained."; float healthPercentage = (float)enemy.health / (float)enemy.maxHealth; if (healthPercentage > 0.99f) conditionText = " is #green#in perfect condition."; else if (healthPercentage > 0.9f) conditionText = " is #green#mostly unhurt."; else if (healthPercentage > 0.75f) conditionText = " is #yellow#slightly hurt."; else if (healthPercentage > 0.5f) conditionText = " is #brown#wounded."; else if (healthPercentage > 0.25f) conditionText = " is #red#badly wounded."; else conditionText = " is #red#near death."; Print("Enemy " + enemy.name + conditionText); } } public void DisplayCondition() { Print("#" + PercentageToColor((float)Game.player.health / (float)Game.player.maxHealth) + "#Your HP: " + Game.player.health + "/" + Game.player.maxHealth); } public void DisplayEventChoices(List choices) { for (int i = 0; i < choices.Count; i++) { Print("#white#(" + (i + 1) + ")#default# " + choices[i]); } } public void DisplayIntro() { Print(" #green#-----------------------------"); Print(" #green#| |"); Print(" #green#| #red#THE SLIME'S JOURNEY#green# |"); Print(" #green#| |"); Print(" #green#-----------------------------"); Print(""); Print(" #white#Made by VDZ in 48 hours for"); Print(" #yellow#Ludum Dare 33 - You are the Monster"); } public void DisplayInventoryOptions(List items, bool forced = false) { switch (Game.gameState) { case Game.GameState.DroppingItem: Print("Drop which item?"); break; case Game.GameState.EatingItem: Print("Eat which item?"); break; case Game.GameState.UsingItem: case Game.GameState.UsingItemCombat: Print("Use which item?"); break; default: Print("Choose an item:"); break; } for (int i = 0; i < items.Count; i++) { Print("#white#(" + (i + 1) + ") #purple#" + items[i].GetName()); } if (!forced) Print("(0) Cancel"); } public void DisplayMutationOptions(List mutations) { Print("Choose a mutation:"); for (int i = 0; i < mutations.Count; i++) { Print("#white#(" + (i + 1) + ")#default# " + mutations[i].name + " - " + mutations[i].description); } } public void DisplayWanderOptions(List events) { if (events.Count == 1) Print("#yellow#You see only one option:"); else if (events.Count == 2) Print("#yellow#You see two possible courses of action:"); else Print("#yellow#You have several options:"); for (int i = 0; i < events.Count; i++) { Print("#white#(" + (i + 1) + ")#default# " + events[i].description); } } public void GameOver() { Console.BackgroundColor = ConsoleColor.DarkRed; Print("#red#You die!"); Console.BackgroundColor = ConsoleColor.Black; Pause(); } public void Pause() { System.Threading.Thread.Sleep(1000); } public void Print(string message) { PrintPart(message); PrintLine(); } public void WaitForInput(List availableActions) { ParseActions(availableActions); if (!printedPossibleInputs) { PrintLine(); PrintActions(); printedPossibleInputs = true; } ConsoleKeyInfo key = Console.ReadKey(); if (Game.gameState != Game.GameState.Returning) PrintLine(); bool done = false; if (this.availableActions.ContainsKey(key.Key)) { done = true; printedPossibleInputs = false; //Reprint next time PrintLine(); HandleAction(this.availableActions[key.Key]); } if (!done) WaitForInput(availableActions); } //---Non-public--- void HandleAction(GameAction action) { bool handled = false; switch(action.action) { case Game.Actions.Status: PrintStatus(); handled = true; break; } if (!handled) Game.HandleAction(action.action); } void ParseActions(List originalActions) { this.availableActions = new Dictionary(); for (int i = 0; i < originalActions.Count; i++) { switch (originalActions[i]) { //Free mode case Game.Actions.DropItem: availableActions.Add(ConsoleKey.D, new GameAction(originalActions[i], "(D)rop")); break; case Game.Actions.EatItem: availableActions.Add(ConsoleKey.E, new GameAction(originalActions[i], "(E)at")); break; case Game.Actions.Grow: availableActions.Add(ConsoleKey.G, new GameAction(originalActions[i], "(G)row")); break; case Game.Actions.Help: availableActions.Add(ConsoleKey.H, new GameAction(originalActions[i], "(H)elp")); break; case Game.Actions.UseItem: availableActions.Add(ConsoleKey.I, new GameAction(originalActions[i], "(I)tem")); break; case Game.Actions.Rest: availableActions.Add(ConsoleKey.R, new GameAction(originalActions[i], "(R)est")); break; case Game.Actions.Status: availableActions.Add(ConsoleKey.S, new GameAction(originalActions[i], "(S)tatus")); break; case Game.Actions.Wander: availableActions.Add(ConsoleKey.W, new GameAction(originalActions[i], "(W)ander")); break; case Game.Actions.Quit: availableActions.Add(ConsoleKey.Q, new GameAction(originalActions[i], "(Q)uit")); break; case Game.Actions.RealQuit: availableActions.Add(ConsoleKey.Q, new GameAction(originalActions[i], "(Q)uit")); break; //Combat mode case Game.Actions.Attack: availableActions.Add(ConsoleKey.A, new GameAction(originalActions[i], "(A)ttack")); break; case Game.Actions.Defend: availableActions.Add(ConsoleKey.D, new GameAction(originalActions[i], "(D)efend")); break; case Game.Actions.UseItemCombat: availableActions.Add(ConsoleKey.I, new GameAction(originalActions[i], "(I)tem")); break; case Game.Actions.Run: availableActions.Add(ConsoleKey.R, new GameAction(originalActions[i], "(R)un")); break; //Growing case Game.Actions.HealthUpgrade: availableActions.Add(ConsoleKey.D1, new GameAction(originalActions[i], "(1) Health")); availableActions.Add(ConsoleKey.NumPad1, new GameAction(originalActions[i], "(1) Health")); break; case Game.Actions.StrengthUpgrade: availableActions.Add(ConsoleKey.D2, new GameAction(originalActions[i], "(2) Strength")); availableActions.Add(ConsoleKey.NumPad2, new GameAction(originalActions[i], "(2) Strength")); break; case Game.Actions.DefenseUpgrade: availableActions.Add(ConsoleKey.D3, new GameAction(originalActions[i], "(3) Defense")); availableActions.Add(ConsoleKey.NumPad3, new GameAction(originalActions[i], "(3) Defense")); break; case Game.Actions.Mutate: availableActions.Add(ConsoleKey.D4, new GameAction(originalActions[i], "(4) Mutate")); availableActions.Add(ConsoleKey.NumPad4, new GameAction(originalActions[i], "(4) Mutate")); break; //Items case Game.Actions.LeaveItem: availableActions.Add(ConsoleKey.L, new GameAction(originalActions[i], "(L)eave it")); break; case Game.Actions.TakeItem: availableActions.Add(ConsoleKey.T, new GameAction(originalActions[i], "(T)ake it")); break; case Game.Actions.EatItemDirect: availableActions.Add(ConsoleKey.E, new GameAction(originalActions[i], "(E)at it")); break; //Misc case Game.Actions.Continue: availableActions.Add(ConsoleKey.Enter, new GameAction(originalActions[i], "(Enter) Continue")); break; case Game.Actions.One: availableActions.Add(ConsoleKey.D1, new GameAction(originalActions[i], "(1)")); availableActions.Add(ConsoleKey.NumPad1, new GameAction(originalActions[i], "(1)")); break; case Game.Actions.Two: availableActions.Add(ConsoleKey.D2, new GameAction(originalActions[i], "(2)")); availableActions.Add(ConsoleKey.NumPad2, new GameAction(originalActions[i], "(2)")); break; case Game.Actions.Three: availableActions.Add(ConsoleKey.D3, new GameAction(originalActions[i], "(3)")); availableActions.Add(ConsoleKey.NumPad3, new GameAction(originalActions[i], "(3)")); break; case Game.Actions.Four: availableActions.Add(ConsoleKey.D4, new GameAction(originalActions[i], "(4)")); availableActions.Add(ConsoleKey.NumPad4, new GameAction(originalActions[i], "(4)")); break; case Game.Actions.Five: availableActions.Add(ConsoleKey.D5, new GameAction(originalActions[i], "(5)")); availableActions.Add(ConsoleKey.NumPad5, new GameAction(originalActions[i], "(5)")); break; case Game.Actions.Six: availableActions.Add(ConsoleKey.D6, new GameAction(originalActions[i], "(6)")); availableActions.Add(ConsoleKey.NumPad6, new GameAction(originalActions[i], "(6)")); break; case Game.Actions.Seven: availableActions.Add(ConsoleKey.D7, new GameAction(originalActions[i], "(7)")); availableActions.Add(ConsoleKey.NumPad7, new GameAction(originalActions[i], "(7)")); break; case Game.Actions.Eight: availableActions.Add(ConsoleKey.D8, new GameAction(originalActions[i], "(8)")); availableActions.Add(ConsoleKey.NumPad8, new GameAction(originalActions[i], "(8)")); break; case Game.Actions.Nine: availableActions.Add(ConsoleKey.D9, new GameAction(originalActions[i], "(9)")); availableActions.Add(ConsoleKey.NumPad9, new GameAction(originalActions[i], "(9)")); break; case Game.Actions.Cancel: availableActions.Add(ConsoleKey.D0, new GameAction(originalActions[i], "(0) Cancel")); availableActions.Add(ConsoleKey.NumPad0, new GameAction(originalActions[i], "(0) Cancel")); break; case Game.Actions.Yes: availableActions.Add(ConsoleKey.Y, new GameAction(originalActions[i], "(Y)es")); break; case Game.Actions.No: availableActions.Add(ConsoleKey.N, new GameAction(originalActions[i], "(N)o")); break; } } } void PrintActions() { switch(Game.gameState) { case Game.GameState.Dead: Print("Do you wish to see your final status? (Y/N)"); break; case Game.GameState.Quitting: Print("Are you sure you wish to quit? (Y/N)"); break; case Game.GameState.Dead2: Print("#red#Press Q to quit."); break; case Game.GameState.Intro: Print(" #white#Press enter to begin."); break; case Game.GameState.Returning: Print("#white#Press enter to continue."); break; case Game.GameState.Wandering: case Game.GameState.Growing: case Game.GameState.Mutating: case Game.GameState.DroppingItem: case Game.GameState.EatingItem: case Game.GameState.UsingItem: case Game.GameState.UsingItemCombat: case Game.GameState.EventChoice: PrintPart("#white#Your choice: "); break; default: PrintPart("#white#Available commands: "); int counter = 0; foreach (KeyValuePair kp in availableActions) { PrintPart(kp.Value.description); counter++; if (counter < availableActions.Count) PrintPart(", "); else PrintPart(": "); } break; } } void PrintLine(string message = "") { Console.WriteLine(message); } void PrintPart(string message) { Console.ForegroundColor = ConsoleColor.Gray; bool done = false; while (!done) { int nextHash = message.IndexOf("#"); if (nextHash != 0) { bool newline = false; int length = nextHash; if (length == -1) length = message.Length; if (Console.CursorLeft == 1) Console.CursorLeft = 0; //Leading space string toWrite = message.Substring(0, length); //Wordwrapping if (Console.CursorLeft + length > Console.BufferWidth) { bool stopWriting = false; string[] split = toWrite.Split(new string[] { " " }, StringSplitOptions.None); toWrite = ""; for (int i = 0; i < split.Length; i++) { if (!stopWriting) { if (Console.CursorLeft + toWrite.Length + split[i].Length + 2 > Console.BufferWidth) { stopWriting = true; newline = true; } else { toWrite += split[i] + " "; } } } } //Write Console.Write(toWrite); message = message.Substring(toWrite.Length); if (message.Length == 0) done = true; if (newline) Console.WriteLine(); } else { int endHash = message.Substring(1).IndexOf("#"); Console.ForegroundColor = GetColor(message.Substring(1, endHash)); message = message.Substring(endHash + 2); } } } public void PrintStatus() { if (Game.gameState == Game.GameState.Dead) { Print("#red#" + Game.player.name + " died after " + Game.turn + " turns."); } else { Print("YOUR STATUS:"); } Print("------------"); Print("#white#" + Game.player.name); Print("#" + PercentageToColor((float)Game.player.health / (float)Game.player.maxHealth) + "#Health: " + Game.player.health + "/" + Game.player.maxHealth); Print("#white#Strength: " + Game.player.strength); Print("#white#Defense: " + Game.player.defense); Print("#white#Experience: " + Game.player.experience); PrintLine(); if (Game.player.mutations.Count == 0) Print("You have no mutations."); else { Print("#white#Mutations:"); foreach (KeyValuePair kp in Game.player.mutations) { Print(kp.Key); } } Game.Return(); } //===Colors=== ConsoleColor GetColor(string name) { switch (name) { case "brown": return ConsoleColor.DarkYellow; case "cyan": return ConsoleColor.Cyan; case "green": return ConsoleColor.DarkGreen; case "purple": return ConsoleColor.DarkMagenta; case "red": return ConsoleColor.Red; case "white": return ConsoleColor.White; case "yellow": return ConsoleColor.Yellow; } return ConsoleColor.Gray; } string PercentageToColor(float percentage) { if (percentage < 0.25f) return "red"; if (percentage < 0.5f) return "brown"; if (percentage < 0.75f) return "yellow"; else return "green"; } } }