public interface IProgram
{
void ReceiveUserInput(string input);
void InitializeProgram();
void ShowMainMenu();
}
public class HackingProgram1980 : IProgram
{
enum Screen {
MainMenu,
Password,
Win,
Lose
}
Screen currentScreen;
Level[] levels = { new Level1(), new Level2(), new Level3() };
Level currentLevel;
string currentWord = "";
public void InitializeProgram() {
currentScreen = Screen.MainMenu;
ShowMainMenu();
}
public void ShowMainMenu() {
Terminal1980.ClearScreen();
Terminal1980.WriteLine("");
Terminal1980.WriteLine("CODE 0004 - TROJAN IMPLANTED");
Terminal1980.WriteLine("Overriding with language: pt_BR");
Terminal1980.WriteLine("------------------------------------");
Terminal1980.WriteLine("=== PROGRAMA 01: Hack ===");
Terminal1980.WriteLine("Escolha qual terminal hackear:");
Terminal1980.WriteLine($"- 1: Biblioteca Municipal{levels[0].IsCompletedText}");
Terminal1980.WriteLine($"- 2: Polícia Federal{levels[1].IsCompletedText}");
Terminal1980.WriteLine($"- 3: NASA{levels[2].IsCompletedText}");
currentScreen = Screen.MainMenu;
int completedLevels = 0;
foreach (Level level in levels) {
if (level.isCompleted) {
completedLevels++;
}
}
if (completedLevels == levels.Length) {
Terminal1980.WriteLine("Você é o HACKERMAN.");
}
}
void ShowPasswordScreen() {
Terminal1980.ClearScreen();
Terminal1980.WriteLine("");
Terminal1980.WriteLine("Você pode digitar 'menu' ou 'bios'\na qualquer momento para retornar");
GetWordList();
ShowPasswordQuiz();
}
void ShowWinScreen() {
Terminal1980.ClearScreen();
currentScreen = Screen.Win;
currentLevel.isCompleted = true;
currentLevel.ShowWinScreen();
Terminal1980.WriteLine("Digite algo para retornar ao menu.");
}
public void ReceiveUserInput(string input) {
switch (currentScreen) {
case Screen.MainMenu:
HandleMenuInput(input);
return;
case Screen.Password:
HandlePasswordInput(input);
return;
case Screen.Win:
ShowMainMenu();
return;
case Screen.Lose:
ShowMainMenu();
return;
}
}
private void HandleMenuInput(string input) {
int menuIndex;
Debug.Log($"input : {input}");
if (int.TryParse(input, out menuIndex)) {
switch (menuIndex) {
case 1:
currentLevel = levels[0];
currentScreen = Screen.Password;
ShowPasswordScreen();
return;
case 2:
currentLevel = levels[1];
currentScreen = Screen.Password;
ShowPasswordScreen();
return;
case 3:
currentLevel = levels[2];
currentScreen = Screen.Password;
ShowPasswordScreen();
return;
default:
break;
}
}
Terminal1980.WriteLine("Selecione um terminal válido.");
}
private void HandlePasswordInput(string input) {
if (input == currentWord) {
Terminal1980.WriteLine("Correto!");
if (currentLevel.remainingWords.Count == 0) {
ShowWinScreen();
return;
}
ShowPasswordQuiz();
}
else {
Terminal1980.WriteLine("Senha incorreta!");
if (AddExtraWord()) {
ShowPasswordQuiz();
}
else {
Terminal1980.WriteLine("As senhas se esgotaram\nERROR 484 TROJAN DETECTADO");
Terminal1980.WriteLine("Digite algo para retornar ao menu.");
currentScreen = Screen.Lose;
}
}
}
void GetWordList() {
currentLevel.remainingWords.Clear();
currentLevel.unusedWords.Clear();
List<string> temporaryWordList = new List<string>();
foreach (string word in currentLevel.AllWordsList) {
temporaryWordList.Add(word);
}
int iterator = 0;
while (temporaryWordList.Count > 0) {
int index = UnityEngine.Random.Range(0, temporaryWordList.Count);
if (iterator < currentLevel.MinWordsForWin) {
currentLevel.remainingWords.Push(temporaryWordList[index]);
}
else {
currentLevel.unusedWords.Push(temporaryWordList[index]);
}
temporaryWordList.RemoveAt(index);
iterator++;
}
}
string GetRandomWord() {
return currentLevel.remainingWords.Pop();
}
bool AddExtraWord() {
if (currentLevel.unusedWords.Count > 0) {
currentLevel.remainingWords.Push(currentLevel.unusedWords.Pop());
return true;
}
else {
return false;
}
}
void ShowPasswordQuiz() {
currentWord = GetRandomWord();
int currentPasswordCount = currentLevel.MinWordsForWin - currentLevel.remainingWords.Count;
Terminal1980.WriteLine($"Decifre a senha {currentPasswordCount}/{currentLevel.MinWordsForWin} : { currentWord.Anagram() }");
}
abstract class Level {
string isCompletedText = " => HACKD";
public bool isCompleted;
public abstract string[] AllWordsList { get; }
public abstract int MinWordsForWin { get; }
public string IsCompletedText {
get {
return isCompleted ? isCompletedText : "";
}
}
public abstract void ShowWinScreen();
public Stack<string> remainingWords = new Stack<string>();
public Stack<string> unusedWords = new Stack<string>();
}
class Level1 : Level {
public override int MinWordsForWin => 3;
public override string[] AllWordsList { get => new string[] { "livro", "cadeira", "marcador", "prateleira", "página", "capítulo", "romance", "mesa" }; }
public override void ShowWinScreen() {
Terminal1980.WriteLine(@"
______ ______
_/ Y \_
// ~~ ~~ | ~~ ~ \\
// ~ ~ ~~ | ~~~ ~~ \\
//________.|.________\\
`----------`-'----------'");
Terminal1980.WriteLine("A biblioteca foi hackeada.");
}
}
class Level2 : Level {
public override string[] AllWordsList => new string[] { "viatura", "jurisprudência", "aprisionamento", "acompanhamento", "resguardo", "fiscalização", "segurança" };
public override int MinWordsForWin => 4;
public override void ShowWinScreen() {
Terminal1980.WriteLine(@"
,
_.- ` `'-.
'._ __{}_(
|'--.__\
( -_\-
| _ |
)\___/
.--'`:._]
/ \ '-.");
Terminal1980.WriteLine("A polícia foi hackeada.");
}
}
class Level3 : Level {
public override string[] AllWordsList => new string[] { "cosmologia", "entropia", "meteorito", "astrofísica", "lançamento", "espaço sideral" };
public override int MinWordsForWin => 5;
public override void ShowWinScreen() {
Terminal1980.WriteLine(@"
|
/ \
/ _ \
|.o '.|
|'._.'|
| |
,'| | |`.
/ | | | \
|,-'--|--'-.| ");
Terminal1980.WriteLine("A NASA foi hackeada.");
}
}