2020-09-09 16:59:50 +00:00
using System ;
using System.Collections.Generic ;
using System.Text.Json ;
using System.IO ;
using System.Text.RegularExpressions ;
namespace wikicreachia {
class Program {
static void Main ( string [ ] args ) {
( string major , int minor ) status = ( "base" , 0 ) ;
var creachers = new Dictionary < string , Creacher > ( ) ;
var userCreacher = new Dictionary < string , object > ( ) ;
string prompt = "" ;
string input ;
string inputLower ;
bool readKey ;
Regex inputTrimmer = new Regex ( @" *(.+) *" ) ;
if ( File . Exists ( "wikicreachia.json" ) ) {
using ( var sr = new StreamReader ( "wikicreachia.json" ) ) {
creachers = JsonSerializer . Deserialize < Dictionary < string , Creacher > > ( sr . ReadToEnd ( ) ) ;
}
}
while ( true ) {
readKey = false ;
switch ( status . major ) {
case "base" :
prompt = "Welcome to Wikicreachia! Type 'help' for help, or 'q' to quit." ;
break ;
case "add" :
2020-09-09 17:13:18 +00:00
if ( status . minor < = 3 ) {
2020-09-09 16:59:50 +00:00
string [ ] prompts = {
"Input the name of your creacher, or 'c' to cancel." ,
2020-09-09 17:13:18 +00:00
"Input the species of your creacher." ,
2020-09-09 16:59:50 +00:00
"Input the desired number of footsies (number)." ,
"Input the biome your creacher inhabits most often (freeform text)." ,
} ;
prompt = prompts [ status . minor ] ;
}
2020-09-09 17:13:18 +00:00
else if ( status . minor = = 4 ) {
2020-09-09 16:59:50 +00:00
prompt = "Press the number corresponding to your creacher's primary method of locomotion:" ;
foreach ( Locomotion option in Enum . GetValues ( typeof ( Locomotion ) ) ) {
prompt + = $"\n{(int)option + 1}. {option}" ;
}
readKey = true ;
}
2020-09-09 17:13:18 +00:00
else if ( status . minor = = 5 ) {
2020-09-09 16:59:50 +00:00
prompt = "Press the number corresponding to the elevation level your creacher is usually found at:\n1. Below sea level\n2. At sea level\n3. Above sea level" ;
readKey = true ;
}
break ;
default :
prompt = $"Unknown status {status.major}!" ;
break ;
}
Console . Write ( $"\n{prompt}\n> " ) ;
if ( readKey ) {
input = Console . ReadKey ( ) . KeyChar . ToString ( ) ;
Console . WriteLine ( ) ; // insert a newline after the character
}
else {
input = Console . ReadLine ( ) ;
if ( input . Length > 0 ) {
input = inputTrimmer . Match ( input ) . Groups [ 1 ] . Value ; // trim leading/traling whitespace
}
}
inputLower = input . ToLower ( ) ;
// general cases - commands that can be used at any time, such as "quit"
if ( String . IsNullOrWhiteSpace ( input ) ) {
Console . WriteLine ( "I can't hear you!" ) ;
continue ;
}
if ( inputLower = = "q" | | inputLower = = "quit" ) {
Console . WriteLine ( "Thanks for using WikiCreachia!" ) ;
using ( var sw = new StreamWriter ( "wikicreachia.json" ) ) {
sw . Write ( JsonSerializer . Serialize ( creachers ) ) ;
}
return ;
}
else if ( new List < string > { "h" , "help" , "?" } . Contains ( inputLower ) ) {
Console . WriteLine ( "WikiCreachia is a program for creating and viewing info about creachers." ) ;
Console . WriteLine ( "To add a new creacher, type 'add'." ) ;
Console . WriteLine ( "To view info about a creacher, type its name." ) ;
Console . WriteLine ( "To see the list of creachers, type 'list'." ) ;
Console . WriteLine ( ) ;
continue ;
}
// specific cases - commands that depend on status.major
if ( status . major = = "base" ) {
if ( input = = "add" ) {
status . major = "add" ;
continue ;
}
else if ( input = = "list" ) {
if ( creachers . Count = = 0 ) {
Console . WriteLine ( "We don't have even a single creacher! 0uo\nWhy not crete one?" ) ;
}
else {
Console . WriteLine ( "Here comes the creacher parade!" ) ;
foreach ( Creacher entry in creachers . Values ) {
Console . WriteLine ( entry ) ;
}
}
}
else if ( creachers . ContainsKey ( input ) ) {
Console . WriteLine ( creachers [ input ] ) ;
}
else {
Console . WriteLine ( $"I don't have any info on \" { input } \ "." ) ;
}
}
else if ( status . major = = "add" ) {
if ( input = = "c" ) {
Console . WriteLine ( "Creacher creation cancelled." ) ;
status . major = "base" ;
continue ;
}
if ( status . minor = = 0 ) {
if ( creachers . ContainsKey ( input ) ) {
Console . WriteLine ( "Such a creacher already exists! 0uo" ) ;
}
else {
// create new dict to ensure all values are empty
userCreacher = new Dictionary < string , object > ( ) ;
userCreacher [ "name" ] = input ;
status . minor + + ;
}
}
else if ( status . minor = = 1 ) {
2020-09-09 17:13:18 +00:00
userCreacher [ "species" ] = input ;
status . minor + + ;
}
else if ( status . minor = = 2 ) {
2020-09-09 16:59:50 +00:00
if ( int . TryParse ( input , out int footsies ) & & footsies > = 0 ) {
userCreacher [ "footsies" ] = footsies ;
status . minor + + ;
}
else {
Console . WriteLine ( "Please enter a valid number." ) ;
}
}
2020-09-09 17:13:18 +00:00
else if ( status . minor = = 3 ) {
2020-09-09 16:59:50 +00:00
userCreacher [ "biome" ] = input ;
status . minor + + ;
}
2020-09-09 17:13:18 +00:00
else if ( status . minor = = 4 ) {
2020-09-09 16:59:50 +00:00
if ( int . TryParse ( input , out int choice ) & & Enum . IsDefined ( typeof ( Locomotion ) , choice - 1 ) ) {
userCreacher [ "locomotion" ] = ( Locomotion ) choice - 1 ;
status . minor + + ;
}
else {
Console . WriteLine ( "Invalid choice - please try again." ) ;
}
}
2020-09-09 17:13:18 +00:00
else if ( status . minor = = 5 ) {
2020-09-09 16:59:50 +00:00
if ( int . TryParse ( input , out int choice ) & & Enum . IsDefined ( typeof ( RelativeElevation ) , choice - 1 ) ) {
userCreacher [ "elevation" ] = ( RelativeElevation ) choice - 1 ;
// try to create the new creacher
creachers . Add (
( string ) userCreacher [ "name" ] , new Creacher (
( string ) userCreacher [ "name" ] ,
2020-09-09 17:13:18 +00:00
( string ) userCreacher [ "species" ] ,
2020-09-09 16:59:50 +00:00
( int ) userCreacher [ "footsies" ] ,
( string ) userCreacher [ "biome" ] ,
( Locomotion ) userCreacher [ "locomotion" ] ,
( RelativeElevation ) userCreacher [ "elevation" ]
)
) ;
Console . WriteLine ( "Added {0}!" , userCreacher [ "name" ] ) ;
using ( var sw = new StreamWriter ( "wikicreachia.json" ) ) {
sw . Write ( JsonSerializer . Serialize ( creachers ) ) ;
}
status . major = "base" ;
status . minor = 0 ;
}
else {
Console . WriteLine ( "Invalid choice - please try again." ) ;
}
}
}
}
}
}
}