bonuska1/App/Program.cs

118 lines
6.0 KiB
C#

using Game.Data;
using Game.UI;
namespace Game {
internal class Program {
static int Main(string[] args) {
CommandLineOptions opts = CommandLineOptions.Parse(args);
TextDisplay display = new TextDisplay();
if (!display.InitWindow()) {
return 1;
}
display.PrintSimpleWelcome();
Thread.Sleep(1200);
display.ShowSplash();
Thread.Sleep(2500);
GameConfig gameConfig;
try {
GameConfig? existingGameConfig = GameFiles.ReadGameConfig();
if (existingGameConfig == null) {
gameConfig = GameFiles.CreateDefaultGameConfig();
} else {
gameConfig = existingGameConfig;
}
} catch {
display.ShowFatalError(I18n.GetMessage(I18n.Message.ERROR_READ_CONFIG_UNKNOWN));
Console.ReadKey();
return 2;
}
string databaseFileName = opts.databaseFilename ?? gameConfig.databasePath;
Database questionDatabase;
try {
questionDatabase = Database.ReadFromFile(databaseFileName);
} catch (DatabaseReadException e) {
display.ShowFatalError(string.Format(I18n.GetMessage(I18n.Message.SYNTAX_ERROR), I18n.GetMessage(e.messageId), e.line.ToString(), e.column.ToString()));
Console.ReadKey();
return 3;
}
display.ShowMainGameScreenBase();
display.DrawRules();
Console.ReadKey();
Random rng = new Random();
List<Question> questions = questionDatabase.questions.OrderBy(_ => rng.Next()).ToList();
int correntAnswers = 0;
for (int i = 0; i < questions.Count; ++i) {
Question question = questions[i];
display.ShowMainGameScreenBase();
display.DrawText(TextDisplay.HAlignment.Center, TextDisplay.VAlignment.Center, 6, display.windowWidth / 2 + 1, question.question, 0, 0x5e61ed);
int x1 = display.windowWidth / 4;
int x2 = display.windowWidth * 3 / 4;
int y1 = display.windowHeight * 2 / 5;
int y2 = Math.Min(y1 + 4, display.windowHeight - 2);
int selectedAnswer = 0;
bool redraw = true;
while (true) {
display.DrawTextBox(TextDisplay.HAlignment.Center, TextDisplay.VAlignment.Center, TextDisplay.BoxType.Simple, y1, x1, question.answers[0], selectedAnswer != 0 ? 0xffffff : 0x1a03a0, selectedAnswer != 0 ? 0xffffff : 0x1a03a0, selectedAnswer != 0 ? 0x1a03a0 : 0xffffff);
if (question.answers.Count >= 2)
display.DrawTextBox(TextDisplay.HAlignment.Center, TextDisplay.VAlignment.Center, TextDisplay.BoxType.Simple, y1, x2, question.answers[1], selectedAnswer != 1 ? 0xffffff : 0x1a03a0, selectedAnswer != 1 ? 0xffffff : 0x1a03a0, selectedAnswer != 1 ? 0x1a03a0 : 0xffffff);
if (question.answers.Count >= 3)
display.DrawTextBox(TextDisplay.HAlignment.Center, TextDisplay.VAlignment.Center, TextDisplay.BoxType.Simple, y2, x1, question.answers[2], selectedAnswer != 2 ? 0xffffff : 0x1a03a0, selectedAnswer != 2 ? 0xffffff : 0x1a03a0, selectedAnswer != 2 ? 0x1a03a0 : 0xffffff);
if (question.answers.Count >= 4)
display.DrawTextBox(TextDisplay.HAlignment.Center, TextDisplay.VAlignment.Center, TextDisplay.BoxType.Simple, y2, x2, question.answers[3], selectedAnswer != 3 ? 0xffffff : 0x1a03a0, selectedAnswer != 3 ? 0xffffff : 0x1a03a0, selectedAnswer != 3 ? 0x1a03a0 : 0xffffff);
bool end = false;
while (true) {
var key = Console.ReadKey(true);
if (key.Key == ConsoleKey.UpArrow) {
if (selectedAnswer == 2 || selectedAnswer == 3) {
redraw = true;
selectedAnswer -= 2;
break;
}
} else if (key.Key == ConsoleKey.DownArrow) {
if (selectedAnswer == 0 || selectedAnswer == 1) {
redraw = true;
selectedAnswer += 2;
break;
}
} else if (key.Key == ConsoleKey.RightArrow) {
if (selectedAnswer == 0 || selectedAnswer == 2) {
redraw = true;
selectedAnswer += 1;
break;
}
} else if (key.Key == ConsoleKey.LeftArrow) {
if (selectedAnswer == 1 || selectedAnswer == 3) {
redraw = true;
selectedAnswer -= 1;
break;
}
} else if (key.Key == ConsoleKey.Enter) {
end = true;
break;
}
}
if (end) {
if (selectedAnswer == question.correctAnswer) {
correntAnswers++;
}
break;
}
}
}
display.ShowMainGameScreenBase();
display.DrawText(TextDisplay.HAlignment.Center, TextDisplay.VAlignment.Center, display.windowHeight / 4, display.windowWidth / 2 + 1, String.Format(I18n.GetMessage(I18n.Message.GAME_OVER), correntAnswers, questions.Count), 0xffffff, 0x5e61ed);
Console.ReadKey();
display.ResetWindow();
return 0;
}
}
}