Skip to content

Commit

Permalink
Merge pull request #183 from samsmithnz/feature/AIdebugging
Browse files Browse the repository at this point in the history
Improving the AI based on a known bad situation
  • Loading branch information
samsmithnz committed Oct 31, 2021
2 parents c2c131c + 4d630c3 commit 442a628
Show file tree
Hide file tree
Showing 10 changed files with 267 additions and 193 deletions.
30 changes: 12 additions & 18 deletions src/Battle.Logic/Characters/CharacterAI.cs
Original file line number Diff line number Diff line change
Expand Up @@ -103,11 +103,6 @@ public AIAction CalculateAIAction(string[,,] map, Character character, Team sour
//int moveThenHunkerScore = 0;
//int shootFromCurrentLocationScore = 0;

//if (location == new Vector3(5, 0, 4))
//{
// int j = 123;
//}

//Create a temp FOV map to simulate the board for this situation
string[,,] fovMap = (string[,,])map.Clone();
fovMap[(int)sourceCharacter.Location.X, (int)sourceCharacter.Location.Y, (int)sourceCharacter.Location.Z] = "";
Expand All @@ -117,15 +112,15 @@ public AIAction CalculateAIAction(string[,,] map, Character character, Team sour
CoverState coverStateResult = CharacterCover.CalculateCover(fovMap, location, opponentLocations);
if (coverStateResult.IsFlanked)
{
baseScore -= 1;
baseScore -= 5;
}
else if (coverStateResult.InFullCover)
{
baseScore += 2;
baseScore += 8;
}
else if (coverStateResult.InHalfCover)
{
baseScore += 1;
baseScore += 4;
}

//Upgrade positions that would flank opponents
Expand All @@ -136,7 +131,7 @@ public AIAction CalculateAIAction(string[,,] map, Character character, Team sour
if (coverStateResultOpponent.IsFlanked)
{
//Position flanks enemy
baseScore += 2;
baseScore += 5;
}

//Do a reverse FOV from the perspective of the character
Expand Down Expand Up @@ -169,23 +164,22 @@ public AIAction CalculateAIAction(string[,,] map, Character character, Team sour
TargetName = targetName,
TargetLocation = targetLocation
});

}
else
{
moveThenShootScore = baseScore;

//if (location == new Vector3(15,0,5))
//{
// int hj = 234;
//}

//Calculate chance to hit
//List<Vector3> fov = FieldOfView.GetFieldOfView(map, location, character.ShootingRange);
List<Character> characters = FieldOfView.GetCharactersInView(fovMap, location, sourceCharacter.ShootingRange, opponentTeam.Characters);
List<Character> characters = FieldOfView.GetCharactersInView(fovMap, location, sourceCharacter.ShootingRange, opponentTeam.Characters);
if (characters.Count == 0)
{
//No characters in view, record a score of 0 - this move achieves nothing
moveThenShootScore = 0;
//No characters in view, deduct some more points - this move achieves very little
moveThenShootScore -= 2;
if (moveThenShootScore < 0)
{
moveThenShootScore = 0;
}
possibleOptions.Add(new AIAction(ActionTypeEnum.MoveThenAttack)
{
Score = moveThenShootScore,
Expand Down
18 changes: 18 additions & 0 deletions src/Battle.PerformanceProfiling/Battle.PerformanceProfiling.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\Battle.Logic\Battle.Logic.csproj" />
</ItemGroup>

<ItemGroup>
<None Update="Saves\Save019.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>

</Project>
43 changes: 43 additions & 0 deletions src/Battle.PerformanceProfiling/Program.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
using Battle.Logic.Characters;
using Battle.Logic.Encounters;
using Battle.Logic.Game;
using Battle.Logic.SaveGames;
using System;
using System.IO;
using System.Reflection;

namespace Battle.PerformanceProfiling
{
internal class Program
{
static void Main(string[] args)
{
string _rootPath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) + @"/Saves/";

//Arrange
string path = _rootPath + "Save019.json";

//Act
string fileContents;
using (var streamReader = new StreamReader(path))
{
fileContents = streamReader.ReadToEnd();
}
Mission mission = GameSerialization.LoadGame(fileContents);
mission.StartMission();
Character fred = mission.Teams[0].GetCharacter("Fred");
Character enemy1 = mission.Teams[1].Characters[0];
Character enemy2 = mission.Teams[1].Characters[1];
Team team1 = mission.Teams[0];
Team team2 = mission.Teams[1];
//Assert.IsTrue(enemy1.HitpointsCurrent <= 0);

//Move to enemy turn
mission.MoveToNextTurn();

AIAction aIAction = mission.CalculateAIAction(enemy2, team2, team1);

//Console.WriteLine(enemy1.HitpointsCurrent);
}
}
}
1 change: 1 addition & 0 deletions src/Battle.PerformanceProfiling/Saves/Save019.json

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions src/Battle.Tests/Battle.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@
<None Update="SaveGames\Saves\Save017.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="SaveGames\Saves\Save019.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>

</Project>
124 changes: 62 additions & 62 deletions src/Battle.Tests/Characters/CharacterAITests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
namespace Battle.Tests.Characters
{
[TestClass]
[TestCategory("L0")]
[TestCategory("L1")]
public class CharacterAITests
{

Expand Down Expand Up @@ -49,48 +49,48 @@ public void CharacterJethroAIMovesIntoFullCoverNoOpponentsTest()

//Assert
string mapStringExpected = @"
. . . . . . . . . . . . . . . 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . . . . . .
. . . . 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . . . . .
. . . 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . . . .
. . . 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . . . .
. . 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . . .
. . 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 4 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . . .
. . 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 54 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . . .
. 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 4 2 5 2 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . .
. 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 44 2 2 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . .
1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 4 2 2 2 2 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . .
1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . .
1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 P 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . .
1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . .
1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . .
. 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . .
. 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . .
. . 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . . .
. . 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . . .
. . 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . . .
. . . 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . . . .
. . . 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . . . .
. . . . 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . . . . .
. . . . 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . . . . .
. . . . 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . . . .
. . . 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . . .
. . . 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . . .
. . 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . .
. . 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . .
. . 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1110 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . .
. 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 0 11 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . .
. 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . .
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . .
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . .
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 P 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . .
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . .
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . .
. 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . .
. 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . .
. . 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . .
. . 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . .
. . 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . .
. . . 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . . .
. . . 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . . .
. . . . 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . . . .
. . . . 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
";
Assert.AreEqual(mapStringExpected, mapString);
string log1 = @"
Jethro is processing AI, with intelligence 25
Failed intelligence check: 25, (dice roll: 8)
";
Assert.AreEqual(log1, actionResult1.LogString);
Assert.AreEqual(4, actionResult1.Score);
Assert.AreEqual(10, actionResult1.Score);
Assert.AreEqual(new Vector3(15, 0, 15), actionResult1.StartLocation);
Assert.AreEqual(new Vector3(17, 0, 18), actionResult1.EndLocation);
Assert.AreEqual(new Vector3(20, 0, 21), actionResult1.EndLocation);
Assert.AreEqual(ActionTypeEnum.DoubleMove, actionResult1.ActionType);

string log2 = @"
Expand Down Expand Up @@ -147,33 +147,33 @@ public void CharacterJethroAIMovesIntoFullCoverWithOpponentTest()

//Assert
string mapStringExpected = @"
. . . . . . . . . . . . . . . 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . 1 1 0 0 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . 1 1 1 1 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . . . .
. . . . . 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . . . .
. . . . . 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . . .
. . . . 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . . .
. . . . 1 1 1 1 1 1 0 0 0 0 2 0 0 0 0 0 0 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . . .
. . . . 1 1 1 1 1 1 0 0 0 0 ■ 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . .
. . . . . 1 1 1 1 0 0 0 0 0 ■ 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . .
. . . . . 1 1 1 1 0 0 0 0 0 ■ 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 . . . . . . . . . . . . . . . . . . .
. . . . . . 1 1 0 0 0 0 0 . ■ 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 . . . . . . . . . . . . . . . . . . .
. . . . . . 1 1 0 0 0 0 0 . ■ P 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . .
. . . . . . . 0 0 0 0 0 0 . ■ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . .
. . . . . . . 0 0 0 0 0 0 . ■ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . .
. . . . . . 0 0 0 0 0 0 0 0 □ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . .
. . . . . ■ 1 1 1 1 1 1 1 13 1 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . .
. . . . . P 1 1 1 1 1 1 1 13 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . . .
. . . . . 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . . .
. . . . . 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . . .
. . . . . . 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . . . .
. . . . . . 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . . .
. . . . . 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . . .
. . . . . 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . .
. . . . 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . .
. . . . 0 0 0 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . .
. . . . 0 0 0 0 0 0 0 0 0 0 ■ 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . .
. . . . . 0 0 0 0 0 0 0 0 0 ■ 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . .
. . . . . 0 0 0 0 0 0 0 0 0 ■ 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . .
. . . . . . 0 0 0 0 0 0 0 . ■ 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . .
. . . . . . 0 0 0 0 0 0 0 . ■ P 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . .
. . . . . . . 0 0 0 0 0 0 . ■ 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . .
. . . . . . . 0 0 0 0 0 0 . ■ 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . .
. . . . . . 0 0 0 0 0 0 0 0 □ 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . .
. . . . . ■ 0 0 0 0 0 0 0 09 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . .
. . . . . P 0 0 0 0 0 0 0 09 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . .
. . . . . 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . .
. . . . . 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . .
. . . . . . 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . . .
. . . . . . 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . . . . . . . . .
";
Assert.AreEqual(mapStringExpected, mapString);
string log1 = @"
Expand Down
1 change: 1 addition & 0 deletions src/Battle.Tests/SaveGames/Saves/Save019.json

Large diffs are not rendered by default.

Loading

0 comments on commit 442a628

Please sign in to comment.