浏览代码

Improve the PRINT* functions

StuffedAnon 6 年之前
父节点
当前提交
d80c2c0111

+ 3 - 2
NTERA.Core/IConsole.cs

@@ -1,5 +1,6 @@
 using System.Drawing;
 using NTERA.Core.Interop;
+using NTERA.Core;
 
 namespace NTERA.Core
 {
@@ -33,7 +34,7 @@ namespace NTERA.Core
 		bool Enabled { get; }
 		void ThrowError(bool playSound);
 		void PrintErrorButton(string message);
-		void Write(string message);
+		void Write(string message, PrintFlags? flags = null);
 		bool UseSetColorStyle { get; set; }
 		void PrintC(string message, bool something);
 		DisplayLineAlignment Alignment { get; set; }
@@ -80,4 +81,4 @@ namespace NTERA.Core
 		string getDefStBar();
 		bool IsTimeOut { get; }
 	}
-}
+}

+ 2 - 1
NTERA.Core/NTERA.Core.csproj

@@ -46,9 +46,10 @@
     <Compile Include="Interop\DataStructs.cs" />
     <Compile Include="GameInstance.cs" />
     <Compile Include="IConsole.cs" />
+    <Compile Include="PrintFlags.cs" />
     <Compile Include="IMainWindow.cs" />
     <Compile Include="IScriptEngine.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
-</Project>
+</Project>

+ 10 - 0
NTERA.Core/PrintFlags.cs

@@ -0,0 +1,10 @@
+namespace NTERA.Core
+{
+    public struct PrintFlags {
+        public bool NewLine;
+        public bool Wait;
+        public bool ForceKana;
+        public bool NoColor;
+        public bool SingleLine; // No word wrap
+    }
+}

+ 39 - 25
NTERA.Engine/Runtime/Base/Keywords.cs

@@ -3,6 +3,7 @@ using System.Collections.Generic;
 using System.Drawing;
 using System.Linq;
 using System.Reflection;
+using NTERA.Core;
 using NTERA.Core.Interop;
 using NTERA.Engine.Compiler;
 
@@ -228,30 +229,54 @@ namespace NTERA.Engine.Runtime.Base
 
 			runtime.Console.PrintHtml(htmlValue.String, false);
 		}
-		[Keyword("PRINT", true, false)]
+
+		private static PrintFlags ParsePrintFlags(string opts)
+		{
+			return new PrintFlags {
+				NewLine = opts.Contains("L") || opts.Contains("W"),
+				Wait = opts.Contains("W"),
+				ForceKana = opts.Contains("K"),
+				NoColor = opts.Contains("D")
+			};
+		}
+
 		[Keyword("PRINTFORM", true, true)]
-		public static void Print(EraRuntime runtime, StackFrame context, ExecutionNode node)
+		[Keyword("PRINTFORMK", true, true)]
+		[Keyword("PRINTFORMD", true, true)]
+		[Keyword("PRINTFORML", true, true)]
+		[Keyword("PRINTFORMW", true, true)]
+		[Keyword("PRINTFORMK", true, true)]
+		[Keyword("PRINTFORMKL", true, true)]
+		[Keyword("PRINTFORMKW", true, true)]
+		[Keyword("PRINTFORMD", true, true)]
+		[Keyword("PRINTFORMDL", true, true)]
+		[Keyword("PRINTFORMDW", true, true)]
+		public static void PrintForm(EraRuntime runtime, StackFrame context, ExecutionNode node)
 		{
+			var flags = ParsePrintFlags(node["name"].Substring(9));
 			var value = runtime.ComputeExpression(context, node.Single());
-
-			runtime.Console.Write(value.ToString());
+			runtime.Console.Write(value.ToString(), flags);
 		}
 
-		[Keyword("PRINTFORML", true, true)]
+		[Keyword("PRINT", true, false)]
 		[Keyword("PRINTL", true, false)]
-		public static void PrintLine(EraRuntime runtime, StackFrame context, ExecutionNode node)
+		[Keyword("PRINTW", true, false)]
+		[Keyword("PRINTK", true, false)]
+		[Keyword("PRINTKL", true, false)]
+		[Keyword("PRINTKW", true, false)]
+		[Keyword("PRINTD", true, false)]
+		[Keyword("PRINTDL", true, false)]
+		[Keyword("PRINTDW", true, false)]
+		public static void Print(EraRuntime runtime, StackFrame context, ExecutionNode node)
 		{
+			var flags = ParsePrintFlags(node["name"].Substring(5));
 			var value = runtime.ComputeExpression(context, node.Single());
-
-			runtime.Console.PrintSingleLine(value.ToString());
+			runtime.Console.Write(value.ToString(), flags);
 		}
 
 		private class PrintDataOptions
 		{
-			public bool PrintLine = false;
-			public bool Wait = false;
-			public bool ForceKana = false;
-			public bool NoColor = false;
+			public PrintFlags Flags = new PrintFlags();
 			public int Count = 0;
 			public ExecutionNode ChosenNode;
 		}
@@ -272,15 +297,7 @@ namespace NTERA.Engine.Runtime.Base
 			   DATAFORMs followed by a ENDDATA and it picks one at random and prints that.
 			 */
 			CurrentPrintDataOptions = new PrintDataOptions();
-			var opts = node["name"].Substring(9);
-			if (opts.Contains("L"))
-				CurrentPrintDataOptions.PrintLine = true;
-			if (opts.Contains("W"))
-				CurrentPrintDataOptions.Wait = true;
-			if (opts.Contains("K"))
-				CurrentPrintDataOptions.ForceKana = true;
-			if (opts.Contains("D"))
-				CurrentPrintDataOptions.NoColor = true;
+			CurrentPrintDataOptions.Flags = ParsePrintFlags(node["name"].Substring(9));
 		}
 
 		[Keyword("DATA", true, true)]
@@ -299,10 +316,7 @@ namespace NTERA.Engine.Runtime.Base
 				throw new ArgumentException("No DATAFORM found before ENDDATA");
 			}
 			var value = runtime.ComputeExpression(context, CurrentPrintDataOptions.ChosenNode);
-			if (CurrentPrintDataOptions.PrintLine)
-				runtime.Console.PrintSingleLine(value.ToString());
-			else
-				runtime.Console.Write(value.ToString());
+			runtime.Console.Write(value.ToString(), CurrentPrintDataOptions.Flags);
 		}
 	}
 }

+ 16 - 18
NTERA/Console/ConsoleRenderer.cs

@@ -33,36 +33,34 @@ namespace NTERA.Console
 			LineHeight = (int)(new Font("MS UI Gothic", 12)).GetHeight();
 		}
 
-		public void WriteItem(IRenderItem item)
+		private void WriteTextItem(TextRenderItem item)
 		{
 			var list = Items[Items.Count - 1];
 
-			var lastItem = list.LastOrDefault();
+			var lastItem = list.LastOrDefault() as TextRenderItem;
 
-			if (lastItem != null)
+			if (lastItem != null && lastItem.TextBrush.Color == item.TextBrush.Color)
 			{
-				if (lastItem is TextRenderItem lastTextItem && item is TextRenderItem newTextItem)
-				{
-					if (lastTextItem.TextBrush.Color == newTextItem.TextBrush.Color)
-					{
-						lastTextItem.Text += newTextItem.Text;
-						
-						AddedItem?.Invoke(item);
-						return;
-					}
-				}
+				lastItem.Text += item.Text;
+			} else {
+				list.Add(item);
+			}
+			// Add a new line if the newline flag is set, or if this isn't text
+			if (item.Flags.NewLine) {
+				Items.Add(new List<IRenderItem>());
 			}
-
-			Items[Items.Count - 1].Add(item);
 
 			AddedItem?.Invoke(item);
 		}
-
-		public void PrintItem(IRenderItem item)
+		public void WriteItem(IRenderItem item)
 		{
+			if (item is TextRenderItem textItem) {
+				WriteTextItem(textItem);
+				return;
+			}
+			// if it isn't text, just add it and always add a new line after it
 			Items[Items.Count - 1].Add(item);
 			Items.Add(new List<IRenderItem>());
-
 			AddedItem?.Invoke(item);
 		}
 

+ 15 - 16
NTERA/Console/EraConsoleInstance.cs

@@ -14,23 +14,22 @@ namespace NTERA.Console
 
 		public AutoResetEvent InputResetEvent { get; protected set; } = new AutoResetEvent(false);
 
+		public Color DefaultForeColor = Color.White;
 		public Color ForeColor = Color.White;
 
-		public void AddText(string text, Color? color = null, bool print = true)
+		public void AddText(string text, PrintFlags? flags = null, Color? color = null)
 		{
+			var flags_ = flags ?? new PrintFlags { NewLine = true };
 			var item = new TextRenderItem(text)
 			{
-				TextBrush = new SolidBrush(color ?? ForeColor),
-				Alignment = Alignment
+				TextBrush = new SolidBrush(color ?? (flags_.NoColor ? DefaultForeColor : ForeColor)),
+				Alignment = Alignment,
+				Flags = flags_
 			};
 
-
-			if (print)
-				Renderer.PrintItem(item);
-			else
-				Renderer.WriteItem(item);
+			Renderer.WriteItem(item);
 		}
-        
+
 
 		public bool IsRunning { get; set; } = true;
 		public bool Enabled { get; set; } = true;
@@ -63,13 +62,13 @@ namespace NTERA.Console
 		public void PrintError(string message)
 		{
 			System.Console.Write("ERROR: " + message + "\n");
-			AddText(message, Color.Red);
+			AddText(message, color: Color.Red );
 		}
 
 		public void PrintSystemLine(string message)
 		{
 			System.Console.Write("INFO: " + message + "\n");
-			AddText(message, Color.Gray);
+			AddText(message, color: Color.Gray);
 		}
 
 		public void DebugClearTraceLog()
@@ -88,7 +87,7 @@ namespace NTERA.Console
 		public void PrintWarning(string message, int level)
 		{
 			System.Console.Write("WARNING: " + message + "\n");
-			AddText(message, Color.Yellow);
+			AddText(message, color: Color.Yellow);
 		}
 
 		public void setStBar(string bar)
@@ -134,7 +133,7 @@ namespace NTERA.Console
 
 		public void PrintSingleLine(string line, bool temporary = false)
 		{
-			AddText(line, print: true);
+			AddText(line, new PrintFlags { SingleLine = true });
 		}
 
 		public void RefreshStrings(bool something)
@@ -155,11 +154,11 @@ namespace NTERA.Console
 
 		protected StringBuilder bodyBuilder = new StringBuilder();
 
-		public void Write(string message)
+		public void Write(string message, PrintFlags? flags = null)
 		{
 			//message.Replace(' ', ' ');
 			//bodyBuilder.Append(message);
-			AddText(message, print: false);
+			AddText(message, flags);
 		}
 
 		public void NewLine()
@@ -243,7 +242,7 @@ namespace NTERA.Console
 		public void PrintHtml(string html, bool newline)
 		{
 			foreach (var item in HtmlParser.ParseHtml(html, ScriptEngine.GetImage))
-				Renderer.PrintItem(item);
+				Renderer.WriteItem(item);
 		}
 
 		public void PrintImg(string img)

+ 3 - 0
NTERA/Console/RenderItem/TextRenderItem.cs

@@ -3,6 +3,7 @@ using System.Collections.Generic;
 using System.Drawing;
 using System.Linq;
 using System.Windows.Forms;
+using NTERA.Core;
 using NTERA.Core.Interop;
 
 namespace NTERA.Console.RenderItem
@@ -17,6 +18,8 @@ namespace NTERA.Console.RenderItem
 
 		public DisplayLineAlignment Alignment { get; set; }
 
+		public PrintFlags Flags { get; set; }
+
 		private static readonly string[] FullwidthCharacters = "0123456789。".ToCharArray().Select(x => x.ToString()).ToArray();
 
 		private static string AlignText(string input)