From 8dfb0cb367ca309bb1ac74daa9416c1b341022fa Mon Sep 17 00:00:00 2001 From: Ryan Date: Mon, 28 Aug 2017 00:46:03 -0400 Subject: [PATCH] Focus controls, and stablity improvments Many console enhancements! --- ReadMe.md | 2 +- parseManager/Fancy.cs | 86 ++++++++++++ parseManager/Program.cs | 186 ++++++++++++++++++------- parseManager/bin/Debug/parsetest2.txt | 59 ++++++-- parseManager/bin/Debug/test.txt | 38 ++--- parseManager/parseManager.cs | 145 +++++++++++++------ parseManager/parseManagerTester.csproj | 10 ++ 7 files changed, 402 insertions(+), 124 deletions(-) create mode 100644 parseManager/Fancy.cs diff --git a/ReadMe.md b/ReadMe.md index 4fcad9d..03ca894 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -5,7 +5,7 @@ TODO: - [ ] Add other cool built in things (Fun) - [ ] Add object support (Tough) - [ ] Improve audio support (Simple) -- [ ] Add simple threading (Alright) +- [x] Add simple threading (Alright) - [ ] Fix Bugs! (Death) Maybe: diff --git a/parseManager/Fancy.cs b/parseManager/Fancy.cs new file mode 100644 index 0000000..9c597a8 --- /dev/null +++ b/parseManager/Fancy.cs @@ -0,0 +1,86 @@ +/* + * Created by SharpDevelop. + * User: Ryan + * Date: 8/27/2017 + * Time: 8:29 PM + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ +using System; + +namespace FancyPrintCS +{ + public static class Fancy + { + static char[][] fvars = { + new char[]{ '╚', '═', '╝', '║', '╔', '╗', '╠', '╣', '╩', '╦', '╬' }, + new char[]{ '+', '═', '+', '|', '+', '+', '+', '+', '+', '+', '+' }, + new char[]{ '└', '─', '┘', '│', '┌', '┐', '├', '┤', '┴', '┬', '┼' }, + new char[]{ '+', '~', '+', '|', '+', '+', '+', '+', '+', '+', '+' }, + new char[]{ '+', '-', '+', '|', '+', '+', '+', '+', '+', '+', '+' }, + new char[]{ '╙', '─', '╜', '║', '╓', '╖', '╟', '╢', '╨', '╥', '╫' }, + new char[]{ '╘', '═', '╛', '│', '╒', '╕', '╞', '╡', '╧', '╤', '╪' } + }; + static int form = 3; + static int fvar; + public static void SetForm(int n) + { + if (n < 1 || n > 3) { + Console.WriteLine("Invalid int value! Only 1, 2 and 3"); + } else { + form = n; + } + } + public static void SetForm(string n) + { + if (n.ToLower()=="left"){ + form=2; + } else if(n.ToLower()=="right"){ + form=3; + } else if(n.ToLower()=="center"){ + form=1; + } + } + public static void Print(string[] msg) + { + int max = 0; + var f = fvars[fvar]; + for (int i = 0; i < msg.Length; i++) { + if (msg[i].Length > max) { + max = msg[i].Length + 2; + } + } + Console.WriteLine(f[4] + new String(f[1], max) + f[5]); + string space1 = ""; + string space2 = ""; + for (int i = 0; i < msg.Length; i++) { + if (form == 1) { // CENTER + if ((max - 2) != msg[i].Length) { + space1 = new String(' ', (max - msg[i].Length) / 2 + ((max - msg[i].Length) % 2)); + space2 = new String(' ', ((max - msg[i].Length) / 2)); + } else { + space1 = new String(' ', (max - msg[i].Length) / 2 + ((max - msg[i].Length) % 2)); + space2 = new String(' ', ((max - msg[i].Length) / 2)); + } + } else if (form == 2) { // LEFT + space1 = ""; + space2 = new String(' ', max - msg[i].Length); + } else if (form == 3) { // RIGHT + space2 = ""; + space1 = new String(' ', max - msg[i].Length); + } + if (msg[i] == "/l") { + Console.WriteLine(f[6] + new String(f[1], max) + f[7]); + } else { + Console.WriteLine(f[3] + space1 + msg[i] + space2 + f[3]); + } + } + Console.WriteLine(f[0] + new String(f[1], max) + f[2]); + } + public static void Print(string msg) + { + var msgArr = msg.Split(','); + Fancy.Print(msgArr); + } + } +} diff --git a/parseManager/Program.cs b/parseManager/Program.cs index e6bd5a9..5debef6 100644 --- a/parseManager/Program.cs +++ b/parseManager/Program.cs @@ -7,79 +7,161 @@ * To change this template use Tools | Options | Coding | Edit Standard Headers. */ using System; -using System.Threading; -using CSCore; -using CSCore.Codecs; -using CSCore.SoundOut; +using System.Diagnostics; +using System.Runtime.InteropServices; using parseManagerCS; +using System.Windows.Input; public class define : standardDefine // If you want the standard methods you must include this, Also this class cannot be static! { - double count; - ISoundOut GetSoundOut() + int origRow = Console.CursorTop; + int origCol = Console.CursorLeft; + public void setPosition(parseManager PM, double x, double y) { - if (WasapiOut.IsSupportedOnCurrentPlatform) - return new WasapiOut(); - else - return new DirectSoundOut(); + Console.SetCursorPosition((int)x, (int)y); } - IWaveSource GetSoundSource(string path) + public void writeAt(parseManager PM, string s, double x, double y) { - return CodecFactory.Instance.GetCodec(path); - } - public void _play() - { - string path = (string)GLOBALS.GetData("__MUSIC"); - double id = (double)GLOBALS.GetData("__MUSICH"); - using (IWaveSource soundSource = GetSoundSource(path)) { - using (ISoundOut soundOut = GetSoundOut()) { - soundOut.Initialize(soundSource); - GLOBALS.AddData("__MUSICH" + id, soundOut); - soundOut.Play(); - soundOut.WaitForStopped(); - } + try { + Console.SetCursorPosition(origCol + (int)x, origRow + (int)y); + Console.Write(s); + } catch (ArgumentOutOfRangeException e) { + Console.Clear(); + Console.WriteLine(e.Message); } } - public void STOP(parseManager PM, double id) + public bool isDown(parseManager PM, string key) { - var sound = (ISoundOut)GLOBALS.GetData("__MUSICH" + id); - sound.Stop(); + if(!ApplicationIsActivated()){ + return false; + } + Key kk = Key.Zoom; + var k = key.ToUpper(); + if (k == "A") { + kk = Key.A; + } else if (k == "B") { + kk = Key.B; + } else if (k == "C") { + kk = Key.C; + } else if (k == "D") { + kk = Key.D; + } else if (k == "E") { + kk = Key.E; + } else if (k == "F") { + kk = Key.F; + } else if (k == "G") { + kk = Key.G; + } else if (k == "H") { + kk = Key.H; + } else if (k == "I") { + kk = Key.I; + } else if (k == "J") { + kk = Key.J; + } else if (k == "K") { + kk = Key.K; + } else if (k == "L") { + kk = Key.L; + } else if (k == "M") { + kk = Key.M; + } else if (k == "N") { + kk = Key.N; + } else if (k == "O") { + kk = Key.O; + } else if (k == "P") { + kk = Key.P; + } else if (k == "Q") { + kk = Key.Q; + } else if (k == "R") { + kk = Key.R; + } else if (k == "S") { + kk = Key.S; + } else if (k == "T") { + kk = Key.T; + } else if (k == "U") { + kk = Key.U; + } else if (k == "V") { + kk = Key.V; + } else if (k == "W") { + kk = Key.W; + } else if (k == "X") { + kk = Key.X; + } else if (k == "Y") { + kk = Key.Y; + } else if (k == "Z") { + kk = Key.Z; + } else if (k == "{UP}") { + kk = Key.Up; + } else if (k == "{DOWN}") { + kk = Key.Down; + } else if (k == "{LEFT}") { + kk = Key.Left; + } else if (k == "{RIGHT}") { + kk = Key.Right; + } else if (k == "{ENTER}") { + kk = Key.Enter; + } else if (k == "{LSHIFT}"){ + kk = Key.LeftShift; + } else if (k == "{RSHIFT}"){ + kk = Key.RightShift; + } else if (k == "0"){ + kk = Key.D0; + } else if (k == "1"){ + kk = Key.D1; + } else if (k == "2"){ + kk = Key.D2; + } else if (k == "3"){ + kk = Key.D3; + } else if (k == "4"){ + kk = Key.D4; + } else if (k == "5"){ + kk = Key.D5; + } else if (k == "6"){ + kk = Key.D6; + } else if (k == "7"){ + kk = Key.D7; + } else if (k == "8"){ + kk = Key.D8; + } else if (k == "9"){ + kk = Key.D9; + } else if(k == "{SPACE}"){ + kk = Key.Space; + } + return Keyboard.IsKeyDown(kk); } - public void RESUME(parseManager PM, double id) + public string isPressing(parseManager PM) { - var sound = (ISoundOut)GLOBALS.GetData("__MUSICH" + id); - sound.Resume(); + return Console.ReadKey(true).Key.ToString(); } - public void SETV(parseManager PM, double id, double vol) + public static bool ApplicationIsActivated() { - var sound = (ISoundOut)GLOBALS.GetData("__MUSICH" + id); - sound.Volume = (float)vol; - } - public void PAUSE(parseManager PM, double id) - { - var sound = (ISoundOut)GLOBALS.GetData("__MUSICH" + id); - sound.Pause(); - } - public double PLAY(parseManager PM, string filepath) - { - GLOBALS.AddData("__MUSIC", filepath); - GLOBALS.AddData("__MUSICH", count++); - var oThread = new Thread(new ThreadStart(_play)); - oThread.Start(); - return count - 1; + var activatedHandle = GetForegroundWindow(); + if (activatedHandle == IntPtr.Zero) { + return false; // No window is currently activated + } else { + var procId = Process.GetCurrentProcess().Id; + int activeProcId; + GetWindowThreadProcessId(activatedHandle, out activeProcId); + return activeProcId == procId; + } } + [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] + static extern IntPtr GetForegroundWindow(); + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] + static extern int GetWindowThreadProcessId(IntPtr handle, out int processId); } namespace parseManagerCS { class Program { + [STAThread] public static void Main(string[] args) { - if (args.Length == 0) { - Console.Write("Please Include a file path!"); - Console.ReadLine(); - Environment.Exit(0); - } - parseManager PM = new parseManager(args[0], "define"); +// if (args.Length == 0) { +// Console.Write("Please Include a file path!"); +// Console.ReadLine(); +// Environment.Exit(0); +// } + parseManager PM = new parseManager("parsetest2.txt", "define"); nextType next = PM.Next(); string type; while (next.GetCMDType() != "EOF") { diff --git a/parseManager/bin/Debug/parsetest2.txt b/parseManager/bin/Debug/parsetest2.txt index 794f844..0babc6f 100644 --- a/parseManager/bin/Debug/parsetest2.txt +++ b/parseManager/bin/Debug/parsetest2.txt @@ -1,13 +1,48 @@ -ENTRY START -[START]{ - "Hello" - song=PLAY("test.flac") - print("Hello!") - "Don't hit enter!" - "Am I still going?" - PAUSE(song) - "I'm alive!" - "Lets resume" - RESUME(song) - ":)" +ENTRY STARTHERE +[STARTHERE]{ + write("Name: ") + name=getInput() + clear() + if name=="" then SKIP(-4)|SKIP(0) + PAUSE("So your name is $name$, thats cool!") + pos=1 + ::loop:: + clear() + setFG(Color_Blue) + fancy("left"," What to do $name$?,/l, Play Game, View Stats, View Credits, Quit Game") + keyUP=isDown("{UP}") + keyDOWN=isDown("{DOWN}") + keyENTER=isDown("{RIGHT}") + if keyUP==true then setVarPlay("pos",pos-1)|SKIP(0) + if keyDOWN==true then setVarPlay("pos",pos+1)|SKIP(0) + if keyENTER==true then GOTO("choicemade")|SKIP(0) + writeAt("->",1,pos+2) + sleep(75) + GOTO("loop") + ::choicemade:: + if pos==1 then print("You Pressed Play!")|SKIP(0) + if pos==2 then print("You Pressed Stats")|SKIP(0) + if pos==3 then print("You Pressed Credits")|SKIP(0) + if pos==4 then print("You Pressed Quit")|SKIP(0) + PAUSE("Tests done (Press Enter!)") +} +[PAUSE:function(msg)]{ + write(msg) + ::loop:: + keyENTER=isDown("{ENTER}") + if keyENTER==true then SKIP(0)|GOTO("loop") + print(" ") +} +[setVarPlay:function(var,val)]{ + setVar(var,val) + if pos<1 then GOTO("toolittle")|SKIP(0) + if pos>4 then GOTO("toomuch")|SKIP(0) + beep() + GOTO("end") + ::toolittle:: + setVar("pos",1) + GOTO("end") + ::toomuch:: + setVar("pos",4) + ::end:: } \ No newline at end of file diff --git a/parseManager/bin/Debug/test.txt b/parseManager/bin/Debug/test.txt index de2b710..8e89b2e 100644 --- a/parseManager/bin/Debug/test.txt +++ b/parseManager/bin/Debug/test.txt @@ -1,29 +1,28 @@ ENTRY TESTSTART [TESTSTART]{ - SetFG(Color_Blue) - write("This is blue ") - SetFG(Color_Red) - print("This is red") - ResetColor() + song=loadSong("test.flac") + setFG(Color_Blue) "Hello (Press Enter)" - print("PLAY SONG (1)") - print("MESSAGE (2)") - print("An Adventure (3)") - print("QUIT (4)") + -- print("PLAY SONG (1)") + -- print("MESSAGE (2)") + -- print("An Adventure (3)") + -- print("QUIT (4)") + fancy("left","PLAY SONG (1),MESSAGE (2),An Adventure (3),QUIT (4)") ::choice:: write("Choose: ") - choice=GetInput() + choice=getInput() if choice=="1" then JUMP("SONG")|SKIP(0) if choice=="2" then JUMP("YO")|SKIP(0) if choice=="4" then QUIT()|SKIP(0) if choice=="3" then SKIP(2)|SKIP(0) GOTO("choice") "We are here now! Time for some fun..." + ::name:: write("Please enter your name: ") - name=GetInput() - setCC() - if name=="" then SKIP(-4)|SKIP(0) + name=getInput() ClearLine() + setCC() + if name=="" then GOTO("name")|SKIP(0) print("So your name is $name$ huh...") "I won't judge haha" "Anyway let's get controls for that song" @@ -34,11 +33,11 @@ ENTRY TESTSTART print("Quit (q)") ::control:: write("Choose: ") - choice=GetInput() + choice=getInput() if choice=="s" then STOP(song)|SKIP(0) if choice=="t" then JUMP("PLAYS")|SKIP(0) - if choice=="a" then PAUSE(song)|SKIP(0) - if choice=="r" then RESUME(song)|SKIP(0) + if choice=="a" then pauseSong(song)|SKIP(0) + if choice=="r" then resumeSong(song)|SKIP(0) if choice=="q" then QUIT()|SKIP(0) GOTO("control") } @@ -47,12 +46,13 @@ ENTRY TESTSTART setCC() } [PLAYS]{ - PAUSE(song) - song=PLAY("test.flac") + pauseSong(song) + song=loadSong("test.flac") + playSong(song) GOTO("control") } [SONG]{ - song=PLAY("test.flac") + playSong(song) GOTO("choice") } [YO]{ diff --git a/parseManager/parseManager.cs b/parseManager/parseManager.cs index 95b0c5c..a267ccd 100644 --- a/parseManager/parseManager.cs +++ b/parseManager/parseManager.cs @@ -6,10 +6,15 @@ using System; using System.IO; using System.Collections.Generic; +using System.Runtime.InteropServices; using System.Text.RegularExpressions; using System.Reflection; +using CSCore; +using CSCore.Codecs; +using CSCore.SoundOut; using parseManagerCS; using System.Threading; +using FancyPrintCS; namespace parseManagerCS { /// The parseManager is an Advance Config Script @@ -156,7 +161,8 @@ namespace parseManagerCS // foreach (Match m in Regex.Matches(data, @"USING ([a-zA-Z0-9_\./]+)")) { // m.Groups[1].ToString(); // } - var match = Regex.Matches(data, @"\[(.+)\][\r\n]*?\{([^\0]+?)\}"); + data = data + "\n"; + var match = Regex.Matches(data, "\\[(.+)\\][\r\n]*?\\{([^\0]+?)\\}\r?\n"); var count = 0; foreach (Match m in match) { string Blck = m.Groups[1].ToString(); @@ -307,6 +313,9 @@ namespace parseManagerCS } public ENV GetENV() { + if (_defualtENV == null) { + return _mainENV; + } return _defualtENV; } public ENV GetDENV() @@ -535,7 +544,7 @@ namespace parseManagerCS bool boo; double ex; for (int i = 0; i < len; i++) { - if (!v[i].StartsWith("[")) + if (!v[i].StartsWith("[") && !v[i].StartsWith("\"")) ex = evaluater.Evaluate(v[i]); else ex = double.NaN; @@ -671,9 +680,9 @@ namespace parseManagerCS var m = Regex.Match(_type, @"([a-zA-Z0-9_]+)"); _pureType = m.Groups[1].ToString(); var tCont = Regex.Replace(cont, @"\-\-\[\[[\S\s]+\]\]", "", RegexOptions.Multiline); - tCont = Regex.Replace(tCont, @"\-\-.+\r\n", "", RegexOptions.Multiline); - tCont = Regex.Replace(tCont, @"\-\-.+\n", "", RegexOptions.Multiline); tCont = Regex.Replace(tCont, @"\t", "", RegexOptions.Multiline); + tCont = Regex.Replace(tCont, @"^\-\-.+\r\n", "", RegexOptions.Multiline); + tCont = Regex.Replace(tCont, @"^\-\-.+\n", "", RegexOptions.Multiline); tCont = Regex.Replace(tCont, @"\n\n", "", RegexOptions.Multiline); tCont = Regex.Replace(tCont, @"\r\n\r\n", "", RegexOptions.Multiline); tCont = Regex.Replace(tCont, @"\-\-\[\[[\S\s]+\]\]", "", RegexOptions.Multiline); @@ -1206,6 +1215,7 @@ namespace parseManagerCS } public class standardDefine { + double count; Random rnd = new Random(); public void newThread(parseManager PM, string Block) { @@ -1248,10 +1258,6 @@ public class standardDefine env["__DefualtENV"] = PM.GetENV(); GLOBALS.WriteToBinaryFile("savedata.dat", env); } - public void save(parseManager PM) - { - SAVE(PM); - } public bool LOAD(parseManager PM) { try { @@ -1268,49 +1274,41 @@ public class standardDefine return false; } } - public void load(parseManager PM) - { - LOAD(PM); - } public void TRACEBACK(parseManager PM) { ENV env = PM.Pop(); PM.SetBlock((string)env[0]); var c = PM.GetCurrentChunk(); c.SetPos((int)env[1]); - SetENV(PM, (ENV)env[3]); + setENV(PM, (ENV)env[3]); } public void EXIT(parseManager PM) { PM.Deactivate(); } - public void exit(parseManager PM) - { - EXIT(PM); - } public void QUIT(parseManager PM) { Environment.Exit(0); } - public void SetENV(parseManager PM, ENV env) + public void setENV(parseManager PM, ENV env) { PM.SetENV(env); } - public ENV GetENV(parseManager PM) + public ENV getENV(parseManager PM) { return PM.GetENV(); } - public ENV GetDefualtENV(parseManager PM) + public ENV getDefualtENV(parseManager PM) { return PM.GetDENV(); } - public ENV CreateENV(parseManager PM) + public ENV createENV(parseManager PM) { var temp = new ENV(); temp.SetParent(PM.GetENV()); return temp; } - public string GetInput(parseManager PM) + public string getInput(parseManager PM) { return Console.ReadLine(); } @@ -1324,15 +1322,15 @@ public class standardDefine Console.Write(" "); } } - public void SetBG(parseManager PM, ConsoleColor BG) + public void setBG(parseManager PM, ConsoleColor BG) { Console.BackgroundColor = BG; } - public void SetFG(parseManager PM, ConsoleColor FG) + public void setFG(parseManager PM, ConsoleColor FG) { Console.ForegroundColor = FG; } - public void ResetColor(parseManager PM) + public void resetColor(parseManager PM) { Console.ResetColor(); } @@ -1356,7 +1354,7 @@ public class standardDefine PM.PushError("Unable to GOTO a non existing label: " + label + "!"); return 0; } - public double LEN(parseManager PM, object o) + public double len(parseManager PM, object o) { string type = o.GetType().ToString(); if (type.Contains("String")) { @@ -1367,30 +1365,18 @@ public class standardDefine } return 0; } - public double len(parseManager PM, object o) - { - return LEN(PM, o); - } public void JUMP(parseManager PM, string block) { var c = PM.GetCurrentChunk(); c.ResetPos(); PM.SetBlock(block); } - public void jump(parseManager PM, string block) - { - JUMP(PM, block); - } public void SKIP(parseManager PM, double n) { var c = PM.GetCurrentChunk(); var pos = c.GetPos(); c.SetPos(pos + (int)n); } - public void skip(parseManager PM, double n) - { - SKIP(PM, n); - } public double tonumber(parseManager PM, string strn) { double d; @@ -1402,8 +1388,12 @@ public class standardDefine } public void sleep(parseManager PM, double n) { - int i = (int)n * 1000; - Thread.Sleep(i); + Thread.Sleep((int)n); + } + public void setVar(parseManager PM, string var, object value) + { + var env = PM.GetDENV(); + env[var] = value; } public double ADD(parseManager PM, double a, double b) { @@ -1449,8 +1439,83 @@ public class standardDefine { return Math.Round(num, (int)n); } + public void clear(parseManager PM) + { + Console.Clear(); + } public void write(parseManager PM, object o) { Console.Write(o); } + public void backspace(parseManager PM) + { + Console.Write("\b"); + } + public void beep(parseManager PM) + { + Console.Beep(); + } + public void fancy(parseManager PM, string form, string msg) + { + Fancy.SetForm(form); + Fancy.Print(msg); + } + ISoundOut GetSoundOut() + { + if (WasapiOut.IsSupportedOnCurrentPlatform) + return new WasapiOut(); + else + return new DirectSoundOut(); + } + IWaveSource GetSoundSource(string path) + { + return CodecFactory.Instance.GetCodec(path); + } + public void _load() + { + string path = (string)GLOBALS.GetData("__MUSIC"); + double id = (double)GLOBALS.GetData("__MUSICH"); + using (IWaveSource soundSource = GetSoundSource(path)) { + using (ISoundOut soundOut = GetSoundOut()) { + soundOut.Initialize(soundSource); + GLOBALS.AddData("__MUSICH" + id, soundOut); + while (true) { + Thread.Sleep(100); + } + } + } + } + public void stopSong(parseManager PM, double id) + { + var sound = (ISoundOut)GLOBALS.GetData("__MUSICH" + id); + sound.Stop(); + } + public void playSong(parseManager PM, double id) + { + var sound = (ISoundOut)GLOBALS.GetData("__MUSICH" + id); + sound.Play(); + } + public void resumeSong(parseManager PM, double id) + { + var sound = (ISoundOut)GLOBALS.GetData("__MUSICH" + id); + sound.Resume(); + } + public void setSongVolume(parseManager PM, double id, double vol) + { + var sound = (ISoundOut)GLOBALS.GetData("__MUSICH" + id); + sound.Volume = (float)vol; + } + public void pauseSong(parseManager PM, double id) + { + var sound = (ISoundOut)GLOBALS.GetData("__MUSICH" + id); + sound.Pause(); + } + public double loadSong(parseManager PM, string filepath) + { + GLOBALS.AddData("__MUSIC", filepath); + GLOBALS.AddData("__MUSICH", count++); + var oThread = new Thread(new ThreadStart(_load)); + oThread.Start(); + return count - 1; + } } \ No newline at end of file diff --git a/parseManager/parseManagerTester.csproj b/parseManager/parseManagerTester.csproj index 2b70956..9e498d0 100644 --- a/parseManager/parseManagerTester.csproj +++ b/parseManager/parseManagerTester.csproj @@ -37,6 +37,9 @@ 4.0 + + 3.0 + 3.5 @@ -45,12 +48,19 @@ 3.5 + + 3.5 + 3.5 + + 3.0 + +