diff --git a/Game/Game.sln b/Game/Game.sln new file mode 100644 index 0000000..c6e097f --- /dev/null +++ b/Game/Game.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.4.33403.182 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Game", "Game\Game.csproj", "{9B96D5C7-8B64-463D-9AA8-E25AA17831C8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestsForGame", "TestsForGame\TestsForGame.csproj", "{8F9ECC7B-3D85-4839-930E-90A426CD0E34}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {9B96D5C7-8B64-463D-9AA8-E25AA17831C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9B96D5C7-8B64-463D-9AA8-E25AA17831C8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9B96D5C7-8B64-463D-9AA8-E25AA17831C8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9B96D5C7-8B64-463D-9AA8-E25AA17831C8}.Release|Any CPU.Build.0 = Release|Any CPU + {8F9ECC7B-3D85-4839-930E-90A426CD0E34}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8F9ECC7B-3D85-4839-930E-90A426CD0E34}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8F9ECC7B-3D85-4839-930E-90A426CD0E34}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8F9ECC7B-3D85-4839-930E-90A426CD0E34}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {44167783-B5A0-436E-A141-633477AFAD18} + EndGlobalSection +EndGlobal diff --git a/Game/Game/EventLoop.cs b/Game/Game/EventLoop.cs new file mode 100644 index 0000000..18baf86 --- /dev/null +++ b/Game/Game/EventLoop.cs @@ -0,0 +1,117 @@ +namespace Game; + +public delegate void ArrowHandler(int startPositionLeft, int startPositionTop, WorkWithConsole data, ref List<((int, int), char)> forTests); + +/// +/// Event handler implementation class +/// +public static class EventLoop +{ + /// + /// Event Handler + /// + /// Function for moving to the left + /// Function for moving to the right + /// Function for moving to the up + /// Function for moving to the down + /// File with map + /// The selected type for testing or normal operation + /// A list intended for entering results for tests ONLY + /// List of commands for tests ONLY + /// Incorrectly set map + /// Checking that the read card line is not empty + public static void Run(ArrowHandler left, ArrowHandler right, ArrowHandler up, ArrowHandler down, + string fileWithMap, WorkWithConsole data, ref List<((int, int), char)> forTests, List listKeys = null) + { + int length = 0; + int width = 0; + var file = new StreamReader(fileWithMap); + int sizeAtSymbols = 0; + int sizeSpaces = 0; + bool isFirst = true; + while (!file.EndOfStream) + { + if (!isFirst) + { + if (width == 1 && sizeAtSymbols != length) + { + throw new InvalidMapException(); + } + else if (width != 1 && sizeAtSymbols != 2 || sizeSpaces != length - sizeAtSymbols) + { + throw new InvalidMapException(); + } + } + var line = file.ReadLine(); + ++width; + if (line == null) + { + throw new ArgumentException(); + } + int size = line.Count(x => x == '@'); + if (length != 0 && length != line.Length) + { + throw new InvalidMapException(); + } + length = line.Length; + sizeAtSymbols = line.Count(x => x == '@'); + sizeSpaces = line.Count(x => x == ' '); + isFirst = false; + Console.WriteLine(line); + } + if (sizeAtSymbols != length) + { + throw new InvalidMapException(); + } + + if (width < 3 || length < 3) + { + throw new InvalidMapException(); + } + data.SetCursorPosition(length / 2, width / 2, ref forTests); + data.Print('@', ref forTests); + int startPositionLeft = length / 2; + int startPositionTop = width / 2; + data.SetCursorPosition(startPositionLeft, startPositionTop, ref forTests); + var checkType = new PrintInList(); + while (true) + { + if (data.GetType() == checkType.GetType() && listKeys.Count == 0) + { + return; + } + var key = data.Comparison(listKeys); + switch (key) + { + case "left": + if (startPositionLeft != 1) + { + left(startPositionLeft, startPositionTop, data, ref forTests); + --startPositionLeft; + } + break; + case "right": + if (startPositionLeft != length - 2) + { + right(startPositionLeft, startPositionTop, data, ref forTests); + ++startPositionLeft; + } + break; + case "up": + if (startPositionTop != 1) + { + up(startPositionLeft, startPositionTop, data, ref forTests); + --startPositionTop; + } + break; + case "down": + if (startPositionTop != width - 2) + { + down(startPositionLeft, startPositionTop, data, ref forTests); + ++startPositionTop; + } + break; + } + } + } +} diff --git a/Game/Game/Game.cs b/Game/Game/Game.cs new file mode 100644 index 0000000..e882bb7 --- /dev/null +++ b/Game/Game/Game.cs @@ -0,0 +1,67 @@ +namespace Game; + +/// +/// A class that implements actions in the game +/// +public static class Game +{ + /// + /// Move to the Left + /// + /// X coordinate + /// Y coordinate + /// Selected type: testing or normal launch + /// The list of entering results for tests ONLY + public static void OnLeft(int startPositionLeft, int startPositionTop, WorkWithConsole data, ref List<((int, int), char)> forTests) + { + data.Print(' ', ref forTests); + data.SetCursorPosition(startPositionLeft - 1, startPositionTop, ref forTests); + data.Print('@', ref forTests); + data.SetCursorPosition(startPositionLeft - 1, startPositionTop, ref forTests); + } + + /// + /// Move to the Right + /// + /// X coordinate + /// Y coordinate + /// Selected type: testing or normal launch + /// The list of entering results for tests ONLY + public static void OnRight(int startPositionLeft, int startPositionTop, WorkWithConsole data, ref List<((int, int), char)> forTests) + { + data.Print(' ', ref forTests); + data.SetCursorPosition(startPositionLeft + 1, startPositionTop, ref forTests); + data.Print('@', ref forTests); + data.SetCursorPosition(startPositionLeft + 1, startPositionTop, ref forTests); + } + + /// + /// Move to the Up + /// + /// X coordinate + /// Y coordinate + /// Selected type: testing or normal launch + /// The list of entering results for tests ONLY + public static void OnUp(int startPositionLeft, int startPositionTop, WorkWithConsole data, ref List<((int, int), char)> forTests) + { + data.Print(' ', ref forTests); + data.SetCursorPosition(startPositionLeft, startPositionTop - 1, ref forTests); + data.Print('@', ref forTests); + data.SetCursorPosition(startPositionLeft, startPositionTop - 1, ref forTests); + } + + /// + /// Move to the Down + /// + /// X coordinate + /// Y coordinate + /// Selected type: testing or normal launch + /// The list of entering results for tests ONLY + public static void OnDown(int startPositionLeft, int startPositionTop, WorkWithConsole data, ref List<((int, int), char)> forTests) + { + data.Print(' ', ref forTests); + data.SetCursorPosition(startPositionLeft, startPositionTop + 1, ref forTests); + data.Print('@', ref forTests); + data.SetCursorPosition(startPositionLeft, startPositionTop + 1, ref forTests); + } +} diff --git a/Game/Game/Game.csproj b/Game/Game/Game.csproj new file mode 100644 index 0000000..f02677b --- /dev/null +++ b/Game/Game/Game.csproj @@ -0,0 +1,10 @@ + + + + Exe + net7.0 + enable + enable + + + diff --git a/Game/Game/Interface.cs b/Game/Game/Interface.cs new file mode 100644 index 0000000..6e30b97 --- /dev/null +++ b/Game/Game/Interface.cs @@ -0,0 +1,29 @@ +namespace Game; + +/// +/// The interface for the game, namely for tests and normal startup +/// +interface GameInterface +{ + /// + /// For a normal launch, it prints to the console for tests, it is included in a special list + /// + /// Symbol for printing + /// The list is necessary ONLY for tests + void Print(char symbol, ref List<((int, int), char)> forTests); + + /// + /// For normal work, it puts the cursor in the console at the specified coordinates, for tests it fixes cursor changes in a special list + /// + /// X coordinate + /// Y coordinates + /// The list is for tests ONLY changes are being made here + void SetCursorPosition(int positionLeft, int PositionTop, ref List<((int, int), char)> forTests); + + /// + /// Different comparison for tests and for a normal run + /// + /// List of commands for tests only + /// Returns a string: left up right down + string Comparison(List listKeys = null); +} \ No newline at end of file diff --git a/Game/Game/InvalidMapException.cs b/Game/Game/InvalidMapException.cs new file mode 100644 index 0000000..bd07809 --- /dev/null +++ b/Game/Game/InvalidMapException.cs @@ -0,0 +1,6 @@ +namespace Game; + +/// +/// Throws exception then incorrect input map +/// +public class InvalidMapException : Exception {} \ No newline at end of file diff --git a/Game/Game/PrintInConsole.cs b/Game/Game/PrintInConsole.cs new file mode 100644 index 0000000..77ec662 --- /dev/null +++ b/Game/Game/PrintInConsole.cs @@ -0,0 +1,34 @@ +namespace Game; + +/// +/// Implements an interface for tests +/// +public class PrintInConsole : WorkWithConsole +{ + public override void Print(char symbol, ref List<((int, int), char)> forTests) + { + Console.Write(symbol); + } + + public override void SetCursorPosition(int positionLeft, int PositionTop, ref List<((int, int), char)> forTests) + { + Console.SetCursorPosition(positionLeft, PositionTop); + } + + public override string Comparison(List listKeys = null) + { + var key = Console.ReadKey(true); + switch (key.Key) + { + case ConsoleKey.LeftArrow: + return "left"; + case ConsoleKey.RightArrow: + return "right"; + case ConsoleKey.UpArrow: + return "up"; + case ConsoleKey.DownArrow: + return "down"; + } + return "another"; + } +} \ No newline at end of file diff --git a/Game/Game/PrintInList.cs b/Game/Game/PrintInList.cs new file mode 100644 index 0000000..886eafd --- /dev/null +++ b/Game/Game/PrintInList.cs @@ -0,0 +1,48 @@ +namespace Game; + +/// +/// Implements the interface for the console +/// +public class PrintInList:WorkWithConsole +{ + public override void Print(char symbol, ref List<((int, int), char)> forTests) + { + if (forTests == null) + { + throw new NullReferenceException(); + } + forTests.Add(((-1, -1), symbol)); + } + + public override void SetCursorPosition(int positionLeft, int PositionTop, ref List<((int, int), char)> forTests) + { + if (forTests == null) + { + throw new NullReferenceException(); + } + forTests.Add(((positionLeft, PositionTop), '\0')); + } + + public override string Comparison(List listKeys = null) + { + if (listKeys == null) + { + throw new NullReferenceException(); + } + var key = listKeys.First(); + listKeys.RemoveAt(0); + switch (key) + { + case '%': + return "left"; + case '&': + return "up"; + case '\'': + return "right"; + case '(': + return "down"; + } + return "another"; + + } +} \ No newline at end of file diff --git a/Game/Game/Program.cs b/Game/Game/Program.cs new file mode 100644 index 0000000..99bfd94 --- /dev/null +++ b/Game/Game/Program.cs @@ -0,0 +1,33 @@ +namespace Game; + +public class Program +{ + public static void Main() + { + char symbol = (char)38; + Console.WriteLine("Input your string with file path"); + var filePath = Console.ReadLine(); + Console.Clear(); + List<((int, int), char)> list = new List<((int, int), char)>(); + try + { + EventLoop.Run( + new ArrowHandler(Game.OnLeft), + new ArrowHandler(Game.OnRight), + new ArrowHandler(Game.OnUp), + new ArrowHandler(Game.OnDown), + filePath, + new PrintInConsole(), + ref list + ); + } + catch (InvalidMapException) + { + Console.WriteLine("Incorrect map"); + } + catch (NullReferenceException) + { + Console.WriteLine("Problems with file or reading lines in file"); + } + } +} \ No newline at end of file diff --git a/Game/Game/WorkWithConsole.cs b/Game/Game/WorkWithConsole.cs new file mode 100644 index 0000000..82b9703 --- /dev/null +++ b/Game/Game/WorkWithConsole.cs @@ -0,0 +1,13 @@ +namespace Game; + +/// +/// Ancestor of two implementation classes one for tests the other for use +/// +abstract public class WorkWithConsole : GameInterface +{ + virtual public void Print(char symbol, ref List<((int, int), char)> forTests) { } + + virtual public void SetCursorPosition(int positionLeft, int PositionTop,ref List<((int, int), char)> forTests) { } + + virtual public string Comparison(List listKeys = null) { return null; } +} \ No newline at end of file diff --git a/Game/TestsForGame/TestsForGame.cs b/Game/TestsForGame/TestsForGame.cs new file mode 100644 index 0000000..67df676 --- /dev/null +++ b/Game/TestsForGame/TestsForGame.cs @@ -0,0 +1,191 @@ +namespace TestsForGame; + +using Game; +using System.Linq; + +public class Tests +{ + [Test] + public void TheIncorrectMapWithIncorrectSymbolShouldThrowException() + { + var forTests = new List<((int, int), char)>(); + Assert.Throws(() => EventLoop.Run(Game.OnLeft, Game.OnRight, Game.OnUp, Game.OnDown, Path.Combine(TestContext.CurrentContext.TestDirectory, "TestsForGame", "IncorrectMapWithIncorrectSymbol.txt"), new PrintInList(), ref forTests)); + } + + [Test] + public void TheIncorrectMapWithTooSmallSizeShouldThrowException() + { + var forTests = new List<((int, int), char)>(); + Assert.Throws(() => EventLoop.Run(Game.OnLeft, Game.OnRight, Game.OnUp, Game.OnDown, Path.Combine(TestContext.CurrentContext.TestDirectory, "TestsForGame", "IncorrectMapWithToSmallSize.txt"), new PrintInList(), ref forTests)); + } + + [Test] + public void TheCharacterMustWalkCorrectlyToTheLeft() + { + var printInList = new PrintInList(); + var forTests = new List<((int, int), char)>(); + var listChar = new List(); + listChar.Add((char)37); + var listCheck = new List<((int, int), char)>(); + listCheck.Add(((8, 3), '\0')); + listCheck.Add(((-1, -1), '@')); + listCheck.Add(((8, 3), '\0')); + listCheck.Add(((-1, -1), ' ')); + listCheck.Add(((7, 3), '\0')); + listCheck.Add(((-1, -1), '@')); + listCheck.Add(((7, 3), '\0')); + EventLoop.Run(Game.OnLeft, Game.OnRight, Game.OnUp, Game.OnDown, + Path.Combine(TestContext.CurrentContext.TestDirectory, "TestsForGame", "NormalMap.txt"), + printInList, ref forTests, listChar); + Assert.True(forTests.SequenceEqual(listCheck)); + } + + [Test] + public void TheCharacterMustWalkCorrectlyToTheUp() + { + var printInList = new PrintInList(); + var forTests = new List<((int, int), char)>(); + var listChar = new List(); + listChar.Add((char)38); + var listCheck = new List<((int, int), char)>(); + listCheck.Add(((8, 3), '\0')); + listCheck.Add(((-1, -1), '@')); + listCheck.Add(((8, 3), '\0')); + listCheck.Add(((-1, -1), ' ')); + listCheck.Add(((8, 2), '\0')); + listCheck.Add(((-1, -1), '@')); + listCheck.Add(((8, 2), '\0')); + EventLoop.Run(Game.OnLeft, Game.OnRight, Game.OnUp, Game.OnDown, + Path.Combine(TestContext.CurrentContext.TestDirectory, "TestsForGame", "NormalMap.txt"), + printInList, ref forTests, listChar); + Assert.True(forTests.SequenceEqual(listCheck)); + } + + [Test] + public void TheCharacterMustWalkCorrectlyToTheRight() + { + var printInList = new PrintInList(); + var forTests = new List<((int, int), char)>(); + var listChar = new List(); + listChar.Add((char)39); + var listCheck = new List<((int, int), char)>(); + listCheck.Add(((8, 3), '\0')); + listCheck.Add(((-1, -1), '@')); + listCheck.Add(((8, 3), '\0')); + listCheck.Add(((-1, -1), ' ')); + listCheck.Add(((9, 3), '\0')); + listCheck.Add(((-1, -1), '@')); + listCheck.Add(((9, 3), '\0')); + EventLoop.Run(Game.OnLeft, Game.OnRight, Game.OnUp, Game.OnDown, + Path.Combine(TestContext.CurrentContext.TestDirectory, "TestsForGame", "NormalMap.txt"), + printInList, ref forTests, listChar); + Assert.True(forTests.SequenceEqual(listCheck)); + } + + [Test] + public void TheCharacterMustWalkCorrectlyToTheDown() + { + var printInList = new PrintInList(); + var forTests = new List<((int, int), char)>(); + var listChar = new List(); + listChar.Add((char)40); + var listCheck = new List<((int, int), char)>(); + listCheck.Add(((8, 3), '\0')); + listCheck.Add(((-1, -1), '@')); + listCheck.Add(((8, 3), '\0')); + listCheck.Add(((-1, -1), ' ')); + listCheck.Add(((8, 4), '\0')); + listCheck.Add(((-1, -1), '@')); + listCheck.Add(((8, 4), '\0')); + EventLoop.Run(Game.OnLeft, Game.OnRight, Game.OnUp, Game.OnDown, + Path.Combine(TestContext.CurrentContext.TestDirectory, "TestsForGame", "NormalMap.txt"), + printInList, ref forTests, listChar); + Assert.True(forTests.SequenceEqual(listCheck)); + } + + [Test] + public void TheCharacterMustNotWalkIfPressedIncorrectKey() + { + var printInList = new PrintInList(); + var forTests = new List<((int, int), char)>(); + var listChar = new List(); + listChar.Add('b'); + var listCheck = new List<((int, int), char)>(); + listCheck.Add(((8, 3), '\0')); + listCheck.Add(((-1, -1), '@')); + listCheck.Add(((8, 3), '\0')); + EventLoop.Run(Game.OnLeft, Game.OnRight, Game.OnUp, Game.OnDown, + Path.Combine(TestContext.CurrentContext.TestDirectory, "TestsForGame", "NormalMap.txt"), + printInList, ref forTests, listChar); + Assert.True(forTests.SequenceEqual(listCheck)); + } + + [Test] + public void TheCharacterMustNotWalkIfItRestsAgainstTheWallWhenWalkingToTheLeft() + { + var printInList = new PrintInList(); + var forTests = new List<((int, int), char)>(); + var listChar = new List(); + listChar.Add((char)37); + var listCheck = new List<((int, int), char)>(); + listCheck.Add(((1, 1), '\0')); + listCheck.Add(((-1, -1), '@')); + listCheck.Add(((1, 1), '\0')); + EventLoop.Run(Game.OnLeft, Game.OnRight, Game.OnUp, Game.OnDown, + Path.Combine(TestContext.CurrentContext.TestDirectory, "TestsForGame", "MapWithCloseWalls.txt"), + printInList, ref forTests, listChar); + Assert.True(forTests.SequenceEqual(listCheck)); + } + + [Test] + public void TheCharacterMustNotWalkIfItRestsAgainstTheWallWhenWalkingToTheUp() + { + var printInList = new PrintInList(); + var forTests = new List<((int, int), char)>(); + var listChar = new List(); + listChar.Add((char)38); + var listCheck = new List<((int, int), char)>(); + listCheck.Add(((1, 1), '\0')); + listCheck.Add(((-1, -1), '@')); + listCheck.Add(((1, 1), '\0')); + EventLoop.Run(Game.OnLeft, Game.OnRight, Game.OnUp, Game.OnDown, + Path.Combine(TestContext.CurrentContext.TestDirectory, "TestsForGame", "MapWithCloseWalls.txt"), + printInList, ref forTests, listChar); + Assert.True(forTests.SequenceEqual(listCheck)); + } + + [Test] + public void TheCharacterMustNotWalkIfItRestsAgainstTheWallWhenWalkingToTheRight() + { + var printInList = new PrintInList(); + var forTests = new List<((int, int), char)>(); + var listChar = new List(); + listChar.Add((char)39); + var listCheck = new List<((int, int), char)>(); + listCheck.Add(((1, 1), '\0')); + listCheck.Add(((-1, -1), '@')); + listCheck.Add(((1, 1), '\0')); + EventLoop.Run(Game.OnLeft, Game.OnRight, Game.OnUp, Game.OnDown, + Path.Combine(TestContext.CurrentContext.TestDirectory, "TestsForGame", "MapWithCloseWalls.txt"), + printInList, ref forTests, listChar); + Assert.True(forTests.SequenceEqual(listCheck)); + } + + + [Test] + public void TheCharacterMustNotWalkIfItRestsAgainstTheWallWhenWalkingToTheDown() + { + var printInList = new PrintInList(); + var forTests = new List<((int, int), char)>(); + var listChar = new List(); + listChar.Add((char)40); + var listCheck = new List<((int, int), char)>(); + listCheck.Add(((1, 1), '\0')); + listCheck.Add(((-1, -1), '@')); + listCheck.Add(((1, 1), '\0')); + EventLoop.Run(Game.OnLeft, Game.OnRight, Game.OnUp, Game.OnDown, + Path.Combine(TestContext.CurrentContext.TestDirectory, "TestsForGame", "MapWithCloseWalls.txt"), + printInList, ref forTests, listChar); + Assert.True(forTests.SequenceEqual(listCheck)); + } +} \ No newline at end of file diff --git a/Game/TestsForGame/TestsForGame.csproj b/Game/TestsForGame/TestsForGame.csproj new file mode 100644 index 0000000..98dc0cf --- /dev/null +++ b/Game/TestsForGame/TestsForGame.csproj @@ -0,0 +1,23 @@ + + + + net7.0 + enable + enable + + false + + + + + + + + + + + + + + + diff --git a/Game/TestsForGame/Usings.cs b/Game/TestsForGame/Usings.cs new file mode 100644 index 0000000..cefced4 --- /dev/null +++ b/Game/TestsForGame/Usings.cs @@ -0,0 +1 @@ +global using NUnit.Framework; \ No newline at end of file diff --git a/Game/TestsForGame/bin/Debug/net7.0/TestsForGame/IncorrectMapWithIncorrectSymbol.txt b/Game/TestsForGame/bin/Debug/net7.0/TestsForGame/IncorrectMapWithIncorrectSymbol.txt new file mode 100644 index 0000000..9e73731 --- /dev/null +++ b/Game/TestsForGame/bin/Debug/net7.0/TestsForGame/IncorrectMapWithIncorrectSymbol.txt @@ -0,0 +1,3 @@ +@@@@@ +@ d @ +@@@@@ \ No newline at end of file diff --git a/Game/TestsForGame/bin/Debug/net7.0/TestsForGame/IncorrectMapWithToSmallSize.txt b/Game/TestsForGame/bin/Debug/net7.0/TestsForGame/IncorrectMapWithToSmallSize.txt new file mode 100644 index 0000000..c13cf5f --- /dev/null +++ b/Game/TestsForGame/bin/Debug/net7.0/TestsForGame/IncorrectMapWithToSmallSize.txt @@ -0,0 +1,2 @@ +@@ +@@ \ No newline at end of file diff --git a/Game/TestsForGame/bin/Debug/net7.0/TestsForGame/MapWithCloseWalls.txt b/Game/TestsForGame/bin/Debug/net7.0/TestsForGame/MapWithCloseWalls.txt new file mode 100644 index 0000000..10af905 --- /dev/null +++ b/Game/TestsForGame/bin/Debug/net7.0/TestsForGame/MapWithCloseWalls.txt @@ -0,0 +1,3 @@ +@@@ +@ @ +@@@ \ No newline at end of file diff --git a/Game/TestsForGame/bin/Debug/net7.0/TestsForGame/NormalMap.txt b/Game/TestsForGame/bin/Debug/net7.0/TestsForGame/NormalMap.txt new file mode 100644 index 0000000..7befade --- /dev/null +++ b/Game/TestsForGame/bin/Debug/net7.0/TestsForGame/NormalMap.txt @@ -0,0 +1,7 @@ +@@@@@@@@@@@@@@@@@ +@ @ +@ @ +@ @ +@ @ +@ @ +@@@@@@@@@@@@@@@@@ \ No newline at end of file