├── __init__.py
├── CityContestor.py
├── base
├── __init__.py
├── client
│ └── __init__.py
└── Colors.py
├── Benchmarks
└── __init__.py
├── Utils
├── __init__.py
└── ScaleUtils.py
├── img.png
├── .idea
├── .gitignore
├── codeStyles
│ └── codeStyleConfig.xml
├── vcs.xml
├── inspectionProfiles
│ ├── profiles_settings.xml
│ └── Project_Default.xml
├── modules.xml
├── misc.xml
└── generals-bot.iml
├── sample.gif
├── Tests
├── Defense
│ ├── tiny_empty_test_map.txtmap
│ ├── FogArmyDefenseDeath
│ │ ├── 75.png
│ │ ├── 76.png
│ │ ├── 75.txtmap
│ │ └── 76.txtmap
│ ├── FailedToExecuteValidDefenseGather_Turn291
│ │ ├── 291.png
│ │ ├── 292.png
│ │ ├── 293.png
│ │ ├── 294.png
│ │ ├── 290.txtmap
│ │ ├── 291.txtmap
│ │ ├── 292.txtmap
│ │ └── 293.txtmap
│ ├── FailedToFindPlannedDefensePathForNoReason_Turn243
│ │ ├── 242.png
│ │ ├── 243.png
│ │ ├── 242.txtmap
│ │ └── 243.txtmap
│ └── GatherScenarios
│ │ ├── ExplodesNextToGeneral.txtmap
│ │ ├── ManySingleMovesToPath.txtmap
│ │ ├── ManySingleMovesToPath__KnapsackGatherBreaks.txtmap
│ │ ├── ManySingleMovesToPath__Smaller_final_move.txtmap
│ │ ├── ManySingleMovesToPath__KnapsackGatherBreaks_Simpler.txtmap
│ │ ├── ManySingleMovesToPath__KnapsackGatherBreaks_Simpler_WithEnemy.txtmap
│ │ ├── ManySingleMovesToPath_WithLongerStart.txtmap
│ │ ├── ManySingleMovesToPath_WithLongerStart_no_20.txtmap
│ │ └── ManySingleMovesToPath_WithLongerStart_MultiKnapsackFailed.txtmap
├── EarlyExpandUtilsTestMaps
│ ├── forced_corner_combo.giomap
│ ├── corner.txtmap
│ ├── forced_corner_combo.txtmap
│ ├── cramped_from_St418__1.txtmap
│ ├── forced_corner_combo__7.txtmap
│ ├── cramped_from_St418__2.txtmap
│ ├── SampleTurn25MapsToTryToBeat
│ │ ├── ethryn_hack_6_15__rx07Ek732.txtmap
│ │ ├── ethryn_hack_4_10__rx07Ek732.txtmap
│ │ ├── SgK4X1Xh3.txtmap
│ │ ├── SexDZkX3n.txtmap
│ │ ├── reDFESS23.txtmap
│ │ ├── rlo0eJXnh.txtmap
│ │ ├── rxrfCyQhn.txtmap
│ │ ├── He1G1kX33.txtmap
│ │ ├── SlmUVUSh2.txtmap
│ │ ├── Hg4b0SBnn.txtmap
│ │ ├── HlfOpuNhn.txtmap
│ │ ├── SlIacHHnh.txtmap
│ │ ├── rePkW8Sn3.txtmap
│ │ ├── SxlKfy72h.txtmap
│ │ ├── HxBwTGBhh.txtmap
│ │ ├── BgFvXQBhh-2.txtmap
│ │ ├── SgqGZBS22.txtmap
│ │ ├── He2s-k7hn.txtmap
│ │ ├── HxMIUIr22.txtmap
│ │ ├── HgwhkJ7n3.txtmap
│ │ ├── HlETnAGnh.txtmap
│ │ ├── Se0L3QB2h.txtmap
│ │ ├── SeD8j0G2n.txtmap
│ │ ├── Sg4vSXS22.txtmap
│ │ ├── BgFvXQBhh.txtmap
│ │ ├── HgD_-ON23.txtmap
│ │ ├── HlP2aMB22.txtmap
│ │ ├── Sgx9eiuE3n.txtmap
│ │ ├── rgdB4LH33.txtmap
│ │ ├── HlIwySr23.txtmap
│ │ ├── HlzMJrSn2.txtmap
│ │ ├── SlptbLrn2.txtmap
│ │ ├── SgRvX_Vh2.txtmap
│ │ ├── rxG_xQr2n.txtmap
│ │ ├── rlPnL_V3h.txtmap
│ │ ├── HeoR4BH32.txtmap
│ │ ├── BgSJZd4hh.txtmap
│ │ ├── Bl-KgQH3n.txtmap
│ │ ├── BlumhyQ22.txtmap
│ │ ├── redaEIShh.txtmap
│ │ ├── rgf5JVr23.txtmap
│ │ ├── BxLPSUB33.txtmap
│ │ ├── SeirZLS33.txtmap
│ │ ├── Bg3razBn3.txtmap
│ │ ├── Hxw4hwNn3.txtmap
│ │ ├── Hlel5QBn2.txtmap
│ │ ├── rgHFQ8Bhh.txtmap
│ │ ├── Bly3eEH3h.txtmap
│ │ ├── HegGvmHhn.txtmap
│ │ ├── rgFOnJX32.txtmap
│ │ ├── HljfIQB33.txtmap
│ │ ├── SlHhaQSh3.txtmap
│ │ ├── HeHkLSS2h.txtmap
│ │ ├── rg80UIr22.txtmap
│ │ ├── BezNrON2n.txtmap
│ │ ├── BgJTiGrhh.txtmap
│ │ ├── Hej7Uy7hh.txtmap
│ │ ├── SgUaZNrhn.txtmap
│ │ ├── reWN0_N3n.txtmap
│ │ ├── SggmLNS23.txtmap
│ │ ├── BlTlBXHhh.txtmap
│ │ ├── HxHtxSH33.txtmap
│ │ ├── SgHhXISh3.txtmap
│ │ ├── Hx93YGrhh.txtmap
│ │ ├── SexP7Xrnh.txtmap
│ │ ├── Sx5edQSh3.txtmap
│ │ ├── rxH5fSrnn.txtmap
│ │ ├── rxndAk7nh.txtmap
│ │ ├── HeSDjQS3h.txtmap
│ │ ├── rgvtA4Bh2.txtmap
│ │ ├── BxfoIQB3h.txtmap
│ │ ├── SxfUErHn2.txtmap
│ │ ├── rxqO5BHn3.txtmap
│ │ ├── BxWpRtqa3.txtmap
│ │ ├── SgnskXHn2.txtmap
│ │ ├── HxpebyX32.txtmap
│ │ ├── rgK-zXr3h.txtmap
│ │ ├── refiPJQ2n.txtmap
│ │ ├── Hga27Jmnh.txtmap
│ │ ├── HlGJ04Bh3.txtmap
│ │ ├── SlcYAHr33.txtmap
│ │ ├── SxLhzIS3n.txtmap
│ │ ├── rgMWP8Hhn.txtmap
│ │ └── BeaCFkX3h.txtmap
│ ├── only_got_24_when_seems_easy_25__V1__turn50.txtmap
│ ├── suboptimal_cramped_spawn.txtmap
│ └── produced_invalid_plan_01.txtmap
├── SymmetricTestMaps
│ ├── even_playground_map_small__left_right.txtmap
│ ├── even_playground_map_small__top_right_bot_left.txtmap
│ ├── even_playground_map_small__top_left_bot_right.txtmap
│ └── even_playground_map_small_short_spawns__top_left_bot_right.txtmap
└── ExpandUtilsTestMaps
│ └── did_not_find_2_move_cap__turn34.txtmap
├── Images
└── MaxFlowMinCost_PreCompute.png
├── StrategyModels
├── __init__.py
└── ExpansionPotential.py
├── Interfaces
└── __init__.py
├── BenchmarkTools
└── __init__.py
├── DebugHelper.py
├── Strategy
└── __init__.py
├── Communication
├── CommunicationConstants.py
├── __init__.py
├── TeammateCommunication.py
└── TileCompressor.py
├── Debug_BotHost.py
├── Dockerfile
├── Algorithms
└── __init__.py
├── Models
├── __init__.py
└── Move.py
├── requirements.txt
├── GeneralPredictor.py
├── Gather
├── GatherDebug.py
└── KruskalsSpanningGather.py
├── linecounter.ps1
├── generals-bot.sln
├── License.txt
├── setup.py
├── MainTodo2.txt
├── UnitTests
└── test_MapMatrix.py
├── GatherAnalyzer.py
└── .gitignore
/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/CityContestor.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/base/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Benchmarks/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/base/client/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Utils/__init__.py:
--------------------------------------------------------------------------------
1 | from .ScaleUtils import *
--------------------------------------------------------------------------------
/img.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EklipZgit/generals-bot/HEAD/img.png
--------------------------------------------------------------------------------
/.idea/.gitignore:
--------------------------------------------------------------------------------
1 | # Default ignored files
2 | /shelf/
3 | /workspace.xml
4 |
--------------------------------------------------------------------------------
/sample.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EklipZgit/generals-bot/HEAD/sample.gif
--------------------------------------------------------------------------------
/Tests/Defense/tiny_empty_test_map.txtmap:
--------------------------------------------------------------------------------
1 | | | | |
2 | aG1
3 |
4 |
5 | bG1
6 | | | | |
--------------------------------------------------------------------------------
/Images/MaxFlowMinCost_PreCompute.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EklipZgit/generals-bot/HEAD/Images/MaxFlowMinCost_PreCompute.png
--------------------------------------------------------------------------------
/StrategyModels/__init__.py:
--------------------------------------------------------------------------------
1 | from .OpponentTrackerModels import CycleStatsData, PlayerMoveCategory
2 | from .ExpansionPotential import *
3 |
--------------------------------------------------------------------------------
/Tests/Defense/FogArmyDefenseDeath/75.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EklipZgit/generals-bot/HEAD/Tests/Defense/FogArmyDefenseDeath/75.png
--------------------------------------------------------------------------------
/Tests/Defense/FogArmyDefenseDeath/76.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EklipZgit/generals-bot/HEAD/Tests/Defense/FogArmyDefenseDeath/76.png
--------------------------------------------------------------------------------
/Interfaces/__init__.py:
--------------------------------------------------------------------------------
1 | from .TilePlanInterface import TilePlanInterface
2 | from .MapMatrixInterface import MapMatrixInterface, TileSet, MetaTileSet
3 |
--------------------------------------------------------------------------------
/BenchmarkTools/__init__.py:
--------------------------------------------------------------------------------
1 | from .GatherBenchmarker import GatherBenchmarkResult, GatherSort, GatherAggregateResults, GatherBenchmarker, GatherBenchScope
2 |
--------------------------------------------------------------------------------
/DebugHelper.py:
--------------------------------------------------------------------------------
1 | import sys
2 |
3 | IS_DEBUGGING: bool = sys.gettrace() is not None
4 | """This will be true when a debugger is attached, false otherwise."""
--------------------------------------------------------------------------------
/Tests/Defense/FailedToExecuteValidDefenseGather_Turn291/291.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EklipZgit/generals-bot/HEAD/Tests/Defense/FailedToExecuteValidDefenseGather_Turn291/291.png
--------------------------------------------------------------------------------
/Tests/Defense/FailedToExecuteValidDefenseGather_Turn291/292.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EklipZgit/generals-bot/HEAD/Tests/Defense/FailedToExecuteValidDefenseGather_Turn291/292.png
--------------------------------------------------------------------------------
/Tests/Defense/FailedToExecuteValidDefenseGather_Turn291/293.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EklipZgit/generals-bot/HEAD/Tests/Defense/FailedToExecuteValidDefenseGather_Turn291/293.png
--------------------------------------------------------------------------------
/Tests/Defense/FailedToExecuteValidDefenseGather_Turn291/294.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EklipZgit/generals-bot/HEAD/Tests/Defense/FailedToExecuteValidDefenseGather_Turn291/294.png
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/forced_corner_combo.giomap:
--------------------------------------------------------------------------------
1 | U2FsdGVkX19R14BKLbZd6VNaGgY8sueJC6UzNqrN4MP54YhIUpd1nxGQs8i29WeDyF8bciqxe5qg33BGDkswYA77W3lsRRXKDxbzEaHAUnkDvAhlbZD6rEBQ7VO+3RtA
--------------------------------------------------------------------------------
/.idea/codeStyles/codeStyleConfig.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/Tests/Defense/FailedToFindPlannedDefensePathForNoReason_Turn243/242.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EklipZgit/generals-bot/HEAD/Tests/Defense/FailedToFindPlannedDefensePathForNoReason_Turn243/242.png
--------------------------------------------------------------------------------
/Tests/Defense/FailedToFindPlannedDefensePathForNoReason_Turn243/243.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EklipZgit/generals-bot/HEAD/Tests/Defense/FailedToFindPlannedDefensePathForNoReason_Turn243/243.png
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/corner.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | |
2 | aG1
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 | | | | | | | |
--------------------------------------------------------------------------------
/Strategy/__init__.py:
--------------------------------------------------------------------------------
1 | from .OpponentTracker import OpponentTracker, TeamAttackData
2 | from .WinConditionAnalyzer import WinConditionAnalyzer
3 | from .CaptureLineTracker import CaptureLineOption, CaptureLineTracker
4 |
--------------------------------------------------------------------------------
/Communication/CommunicationConstants.py:
--------------------------------------------------------------------------------
1 | TEAM_CHAT_CHARACTER_LIMIT = 251 # might include stuff like [team] or the username, though, so maybe cut earlier...?
2 | CHAT_MESSAGES_PER_TURN_LIMIT = 2 # pretty sure it's actually 1...?
3 |
--------------------------------------------------------------------------------
/Debug_BotHost.py:
--------------------------------------------------------------------------------
1 |
2 |
3 | if __name__ == '__main__':
4 | import BotHost
5 |
6 | BotHost.run_bothost('EklipZ_ai', 'private', roomId='testing', userId='efgEklipZ_ai', isPublic=False, noUi=False, alignBottom=True, alignRight=True, noLog=False)
--------------------------------------------------------------------------------
/Communication/__init__.py:
--------------------------------------------------------------------------------
1 | from .TileCompressor import TileCompressor, ServerTileCompressor
2 | from .TeammateCommunication import TeammateCommunication
3 | from .CoordinatedDefense import DefensePlan, CoordinatedDefense
4 | from .TeammateCommunicator import TeammateCommunicator
5 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM python:3.6.1
2 |
3 | WORKDIR /usr/src/app
4 | ADD requirements.txt /usr/src/app/requirements.txt
5 | RUN pip install -U websocket-client
6 |
7 | ADD base/ /usr/src/app/base/
8 | ADD *.py /usr/src/app/
9 |
10 | CMD ["python", "bot_blob.py", "--no-ui"]
11 |
--------------------------------------------------------------------------------
/.idea/inspectionProfiles/profiles_settings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/Algorithms/__init__.py:
--------------------------------------------------------------------------------
1 | from .TileIslandBuilder import TileIslandBuilder, TileIsland
2 | from .MapSpanningUtils import TileGraph, TileNode # , get_map_as_graph_from_tiles, get_map_as_graph
3 | from .FastDisjointSet import FastDisjointSet
4 | # from .KruskalsSpanningGather import gath_set_quick
5 |
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/forced_corner_combo.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | |
2 | aG1
3 | M M M M M M M
4 | M M M M M M M
5 | M M M M M M M M
6 | M M M M M M M M M
7 | M M M M M M M M M M
8 | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/cramped_from_St418__1.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | | | | |
2 | M M M M M
3 |
4 | M M M
5 | aG1 M M M
6 | M M M
7 | M M
8 |
9 |
10 |
11 | | | | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/Defense/GatherScenarios/ExplodesNextToGeneral.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | |
2 | b2 b1 M
3 | b1 b5 M
4 | bG7 M
5 | M a7 M M M M M
6 | M a1 b1 b1 b1 b20 b1
7 | b1 a1 M M M M M
8 | M a1 b1 M M M M
9 | b1 a1 M M M M M
10 | M a1 b9 b1 b1 b1 b1
11 | M a1 a1 a1 a1 a1 aG42
12 | | | | | | | |
13 | player_index=1
14 | loadAsIs=True
--------------------------------------------------------------------------------
/Tests/Defense/GatherScenarios/ManySingleMovesToPath.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | |
2 | b5 b1 M
3 | b5 b5 M
4 | bG5 M
5 | M b1 M M M M M
6 | M b1 b10 b1 b1 b20 b1
7 | b10 b1 M M M M M
8 | M b1 b10 M M M M
9 | b10 b1 M M M M M
10 | M b1 b10 b1 b1 b1 b1
11 | M a69 a1 a1 a1 a1 aG40
12 | | | | | | | |
13 | player_index=1
14 | loadAsIs=True
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/Models/__init__.py:
--------------------------------------------------------------------------------
1 | from .GatherTreeNode import *
2 | from .Move import *
3 |
4 |
5 | class ContestData(object):
6 | def __init__(self, tile: Tile):
7 | self.tile: Tile = tile
8 | self.last_attacked_turn: int = 0
9 | self.attacked_count: int = 0
10 |
11 | def __str__(self) -> str:
12 | return f'Contested {str(self.tile)}: last{self.last_attacked_turn} atk#{self.attacked_count}'
13 |
14 | def __repr__(self) -> str:
15 | return str(self)
--------------------------------------------------------------------------------
/Tests/Defense/GatherScenarios/ManySingleMovesToPath__KnapsackGatherBreaks.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | |
2 | b5 b1 M
3 | b5 b5 M
4 | bG7 M
5 | M b1 M M M M M
6 | M b1 b10 b1 b1 b20 b1
7 | b1 a25 M M M M M
8 | M a1 b1 M M M M
9 | b1 a1 M M M M M
10 | M a1 b9 b1 b1 b1 b1
11 | M a1 a1 a1 a1 a1 aG42
12 | | | | | | | |
13 | player_index=1
14 | loadAsIs=True
--------------------------------------------------------------------------------
/Tests/Defense/GatherScenarios/ManySingleMovesToPath__Smaller_final_move.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | |
2 | b5 b1 M
3 | b5 b5 M
4 | bG5 M
5 | M b1 M M M M M
6 | M b1 b10 b1 b1 b20 b1
7 | b10 b1 M M M M M
8 | M b1 b10 M M M M
9 | b10 b1 M M M M M
10 | M b1 b10 b1 b1 b1 b1
11 | M a69 a1 a1 a1 a1 aG40
12 | | | | | | | |
13 | player_index=1
14 | loadAsIs=True
--------------------------------------------------------------------------------
/Tests/Defense/GatherScenarios/ManySingleMovesToPath__KnapsackGatherBreaks_Simpler.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | |
2 | b5 b1 M
3 | b5 b5 M
4 | bG1 M
5 | M b1 M M M M M
6 | M b1 b10 b1 b1 b20 b1
7 | b1 a18 M M M M M
8 | M a1 b1 M M M M
9 | b1 a1 M M M M M
10 | M a1 b9 b1 b1 b1 b1
11 | M a1 a1 a1 a1 a1 aG42
12 | | | | | | | |
13 | player_index=1
14 | loadAsIs=True
--------------------------------------------------------------------------------
/Tests/Defense/GatherScenarios/ManySingleMovesToPath__KnapsackGatherBreaks_Simpler_WithEnemy.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | |
2 | b2 b1 M
3 | b1 b5 M
4 | bG1 M
5 | M b1 M M M M M
6 | M b1 a2 b12 b1 b20 b1
7 | b1 a1 M M M M M
8 | M a18 b1 M M M M
9 | b1 a1 M M M M M
10 | M a1 b9 b1 b1 b1 b1
11 | M a1 a1 a1 a1 a1 aG42
12 | | | | | | | |
13 | player_index=1
14 | loadAsIs=True
--------------------------------------------------------------------------------
/Tests/Defense/GatherScenarios/ManySingleMovesToPath_WithLongerStart.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | |
2 | b7 b1 M
3 | b5 b3 M
4 | bG5 M
5 | M b1 b10 b1 b1 b20 b1
6 | b10 b1 M M M M M
7 | M b1 b10 M M M M
8 | b10 b1 M M M M M
9 | M b1 b10 M M M M
10 | M b1 b1 b10 M M M
11 | M b1 b1 b1 b1 b1 b1
12 | M a77 a1 a1 a1 a1 aG40
13 | | | | | | | |
14 | player_index=1
15 | loadAsIs=True
--------------------------------------------------------------------------------
/Tests/Defense/GatherScenarios/ManySingleMovesToPath_WithLongerStart_no_20.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | |
2 | b7 b1 M
3 | b5 b3 M
4 | bG5 M
5 | M b1 b10 b1 b1 b10 b1
6 | b10 b1 M M M M M
7 | M b1 b10 M M M M
8 | b10 b1 M M M M M
9 | M b1 b10 M M M M
10 | M b1 b1 b10 M M M
11 | M b1 b1 b1 b1 b1 b1
12 | M a77 a1 a1 a1 a1 aG40
13 | | | | | | | |
14 | player_index=1
15 | loadAsIs=True
--------------------------------------------------------------------------------
/Tests/Defense/GatherScenarios/ManySingleMovesToPath_WithLongerStart_MultiKnapsackFailed.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | |
2 | b7 b1 M
3 | b5 b3 M
4 | bG7 M
5 | M b1 b10 b1 b1 b20 b1
6 | b1 b10 M M M M M
7 | M b10 b1 M M M M
8 | b1 b10 M M M M M
9 | M a71 b10 M M M M
10 | M a1 b1 b10 M M M
11 | M a1 b1 b1 b1 b1 b1
12 | M a1 a1 a1 a1 a1 aG42
13 | | | | | | | |
14 | player_index=1
15 | loadAsIs=True
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/forced_corner_combo__7.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | |
2 | M M M M M M M M M
3 | M aG1 M
4 | M M M
5 | M M M
6 | M M M M
7 | M M M M M
8 | M M M M M M
9 | M M M M M M M
10 | M M M M M M M M
11 | | | | | | | | | |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | websocket-client
2 | pygame
3 | certifi
4 | requests
5 | nashpy
6 | numpy==1.24.0 # after numba update let this upgrade? Numba being stupid.
7 | numba
8 | scipy
9 | Logbook
10 | pyzmq
11 | pcst_fast
12 | networkx
13 | matplotlib
14 | heapq_max
15 | # heap-class this performed poorly
16 | # dill
17 | # if ever need fast dict for int:int or str:str or int:str -> https://github.com/touqir14/Microdict?tab=readme-ov-file
18 |
19 | disjoint-set
20 | unionfind
21 | logbook
22 | certifi
23 |
24 | cppimport
25 | cython
26 | pandas
27 | tqdm
28 | setuptools
29 |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/cramped_from_St418__2.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | | | | |
2 | M
3 |
4 | M M M
5 | M M
6 | M M M
7 | M M M
8 | M M
9 | M M
10 | aG1 M
11 | M M M M M
12 | M M
13 |
14 | M M
15 |
16 | | | | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/.idea/generals-bot.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/Communication/TeammateCommunication.py:
--------------------------------------------------------------------------------
1 | from base.client.tile import Tile
2 |
3 |
4 | class TeammateCommunication(object):
5 | def __init__(self, message: str, pingTile: Tile | None = None, cooldown: int = 10, detectOnMessageAlone: bool = False, cooldownDetectionKey: str | None = None):
6 | self.message: str = message
7 |
8 | self.ping_tile: Tile | None = pingTile
9 |
10 | self.cooldown: int = cooldown
11 |
12 | self.cooldown_detection_on_message_alone: bool = detectOnMessageAlone
13 | """If true, the pinged tile will not be used as part of duplicate message cooldown determination."""
14 |
15 | self.cooldown_key: str | None = cooldownDetectionKey
16 |
17 |
--------------------------------------------------------------------------------
/GeneralPredictor.py:
--------------------------------------------------------------------------------
1 | """
2 | @ Travis Drake (EklipZ) eklipz.io - tdrake0x45 at gmail)
3 | April 2017
4 | Generals.io Automated Client - https://github.com/harrischristiansen/generals-bot
5 | EklipZ bot - Tries to play generals lol
6 | """
7 |
8 | from SearchUtils import *
9 | from Models import *
10 | from enum import Enum
11 |
12 |
13 | class ThreatType(Enum):
14 | Kill = 1
15 | Vision = 2
16 |
17 |
18 | class GeneralPredictor(object):
19 | def __init__(self, map: MapBase):
20 | self.is_2v2 = map.is_2v2
21 | self.map: MapBase = map
22 | self.eliminated_by_player: typing.List[MapMatrixInterface[bool]] = [MapMatrix(map, False) for player in map.players]
23 | self.teams: typing.List[int] = MapBase.get_teams_array(map)
24 |
25 |
--------------------------------------------------------------------------------
/Gather/GatherDebug.py:
--------------------------------------------------------------------------------
1 | import typing
2 | from collections import deque
3 |
4 | import logbook
5 |
6 | from base.client.tile import Tile
7 |
8 | USE_DEBUG_ASSERTS = False
9 | USE_DEBUG_LOGGING = False
10 |
11 |
12 | def assertConnected(tiles: typing.Set[Tile]):
13 | seedTile = next(iter(tiles))
14 |
15 | visited = set()
16 |
17 | q = deque()
18 | q.append(seedTile)
19 |
20 | while q:
21 | tile = q.pop()
22 | if tile in visited:
23 | continue
24 |
25 | visited.add(tile)
26 |
27 | for mv in tile.movable:
28 | if mv in tiles:
29 | q.append(mv)
30 |
31 | if len(visited) != len(tiles):
32 | raise Exception(f'tiles were not connected to seed tile {seedTile}. Disconnected tiles:\r\n {" | ".join([str(t) for t in tiles.difference(visited)])}')
--------------------------------------------------------------------------------
/linecounter.ps1:
--------------------------------------------------------------------------------
1 | push-location
2 | $testFiles = foreach ($folder in "Tests", "UnitTests") {
3 | cd $psscriptroot/$folder
4 | gci *.py
5 | }
6 |
7 | $files = foreach ($folder in "Sim", "Engine", "base", "base/client", "Algorithms", "Behavior", "BehaviorAlgorithms", "Benchmarks", "BenchmarkTools", "Communication", "Gather", "Interfaces", "Models", "Strategy", "StrategyModels", "Viewer", "Utils") {
8 | cd $psscriptroot/$folder
9 | gci -recurse *.py
10 | }
11 |
12 | cd $psscriptroot
13 | $files += gci *.py
14 | $lines = $files | get-content
15 | $realLines = @($lines |?{$_.trim() -and -not $_.trim().startswith("#") })
16 |
17 | $testLines = $testFiles | get-content
18 | $testLines = @($testLines |?{$_.trim() -and -not $_.trim().startswith("#") })
19 |
20 | $files
21 | "main lines: $($realLines.count)"
22 | "test lines: $($testLines.count)"
23 | pop-location
--------------------------------------------------------------------------------
/generals-bot.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio 14
4 | VisualStudioVersion = 14.0.25123.0
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{888888A0-9F3D-457C-B088-3A5042F75D52}") = "generals-bot", "generals-bot.pyproj", "{085C9085-D9F9-4851-9787-FD22BFC57947}"
7 | EndProject
8 | Global
9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
10 | Debug|Any CPU = Debug|Any CPU
11 | Release|Any CPU = Release|Any CPU
12 | EndGlobalSection
13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
14 | {085C9085-D9F9-4851-9787-FD22BFC57947}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
15 | {085C9085-D9F9-4851-9787-FD22BFC57947}.Release|Any CPU.ActiveCfg = Release|Any CPU
16 | EndGlobalSection
17 | GlobalSection(SolutionProperties) = preSolution
18 | HideSolutionNode = FALSE
19 | EndGlobalSection
20 | EndGlobal
21 |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/ethryn_hack_6_15__rx07Ek732.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | | | |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 | b2 b2
14 | b2 b2
15 | b2 b2
16 | b2 b2
17 | b2 b2
18 | b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 bG3 b2 b2 b2
19 | b2
20 |
21 |
22 |
23 | | | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/.idea/inspectionProfiles/Project_Default.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/ethryn_hack_4_10__rx07Ek732.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | | | |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 | b2
15 | b2
16 | b2
17 | b2
18 | b2 b2 b2 b2 b2 b2 b2 b2 bG3 b2
19 | b2 b2 b2
20 | b2 b2 b2
21 | b2 b2 b2
22 | b2 b2
23 | | | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Gather/KruskalsSpanningGather.py:
--------------------------------------------------------------------------------
1 | import time
2 | import typing
3 | from collections import deque
4 |
5 | import logbook
6 |
7 | import DebugHelper
8 | import Gather
9 | # from Algorithms import MapSpanningUtils, FastDisjointSet
10 | from Interfaces import TileSet, MapMatrixInterface
11 | from MapMatrix import MapMatrix, MapMatrixSet
12 | from ViewInfo import ViewInfo
13 | from base.client.map import MapBase
14 | from base.client.tile import Tile
15 | import heapq
16 |
17 |
18 | # def kruskals_gather(map: MapBase, targetTurns: int, rootTiles: typing.List[Tile], tilesToIncludeIfPossible: typing.Iterable[Tile], negativeTiles: TileSet, gatherRewardMatrix: MapMatrixInterface[float] | None = None):
19 | # connectedTiles, missing = MapSpanningUtils.get_spanning_tree_from_tile_lists(map, rootTiles, negativeTiles)
20 | #
21 | # q = []
22 | # for tile in map.reachable_tiles:
23 | # down = map.GetTile(tile.x, tile.y + 1)
24 | # right = map.GetTile(tile.x + 1, tile.y)
25 | #
26 | # if down in map.reachable_tiles:
27 | # heapq.heappush()
28 |
29 |
--------------------------------------------------------------------------------
/License.txt:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2017 Harris Christiansen
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/Tests/SymmetricTestMaps/even_playground_map_small__left_right.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | |
2 | M M
3 | M C39 C39 M
4 | M M M
5 | aG1 M M M M bG1
6 | M
7 | C43 M M C43
8 | M M
9 | M M
10 | M M
11 | C41 C41
12 | C45 C45
13 | | | | | | | | | | | | | | | |
14 | turn=383
15 | player_index=1
16 | aTiles=55
17 | aScore=148
18 | aStandingArmy=93
19 | aStars=55
20 | aCityCount=1
21 | aGeneral=13,1
22 | aKnowsKingLocation=True
23 | aDead=False
24 | aLeftGame=False
25 | aLeftGameTurn=-1
26 | bTiles=71
27 | bScore=159
28 | bStandingArmy=88
29 | bStars=57
30 | bCityCount=1
31 | bGeneral=6,13
32 | bKnowsKingLocation=False
33 | bDead=False
34 | bLeftGame=False
35 | bLeftGameTurn=-1
36 | bot_target_player=0
--------------------------------------------------------------------------------
/setup.py:
--------------------------------------------------------------------------------
1 | # Available at setup time due to pyproject.toml
2 | from pybind11.setup_helpers import Pybind11Extension, build_ext
3 | from Cython.Build import cythonize
4 | from setuptools import setup, Extension
5 | import pathlib
6 |
7 | __version__ = "0.0.1"
8 |
9 |
10 | # ext_modules = [
11 | # Pybind11Extension(
12 | # "Knap",
13 | # ["cpp/KnapsackUtilsCpp.cpp"],
14 | # # Example: passing in the version to the compiled code
15 | # define_macros=[("VERSION_INFO", __version__)],
16 | # ),
17 | # ]
18 |
19 |
20 | cython_extensions = [
21 | Extension(str(file).removesuffix(".pyx"), [file],
22 | extra_compile_args=["-ggdb3"]
23 | )
24 | for file in pathlib.Path('.').glob('*pyx')
25 | ]
26 |
27 | setup(
28 | name="CythonModules",
29 | ext_modules=cythonize(cython_extensions, compiler_directives={'language_level': 3},
30 | language="c++"),
31 | )
32 |
33 | pybind11_extensions = [
34 | Pybind11Extension(str(file).removesuffix(".cpp"), [file],
35 | extra_compile_args=["-ggdb3"]
36 | )
37 | for file in pathlib.Path('.').glob('*.cpp')
38 | if '.rendered' not in str(file)
39 | ]
40 |
41 | setup(
42 | name="PyBind11Modules",
43 | ext_modules=pybind11_extensions,
44 | )
--------------------------------------------------------------------------------
/Utils/ScaleUtils.py:
--------------------------------------------------------------------------------
1 | import typing
2 |
3 |
4 | def rescale_color(
5 | valToScale: float,
6 | valueMin: float,
7 | valueMax: float,
8 | colorMin: typing.Tuple[int, int, int],
9 | colorMax: typing.Tuple[int, int, int]
10 | ) -> typing.Tuple[int, int, int]:
11 | rMin, gMin, bMin = colorMin
12 | rMax, gMax, bMax = colorMax
13 |
14 | r = min(255, int(rescale_value(valToScale, valueMin, valueMax, rMin, rMax)))
15 | g = min(255, int(rescale_value(valToScale, valueMin, valueMax, gMin, gMax)))
16 | b = min(255, int(rescale_value(valToScale, valueMin, valueMax, bMin, bMax)))
17 |
18 | return r, g, b
19 |
20 |
21 | def rescale_value(
22 | valToScale: float,
23 | valueMin: float,
24 | valueMax: float,
25 | newScaleMin: float,
26 | newScaleMax: float,
27 | ) -> float:
28 | # Figure out how 'wide' each range is
29 | leftSpan = valueMax - valueMin
30 | rightSpan = newScaleMax - newScaleMin
31 |
32 | if leftSpan == 0:
33 | leftSpan = 1
34 |
35 | # Convert the left range into a 0-1 range (float)
36 | valueScaled = float(valToScale - valueMin) / float(leftSpan)
37 |
38 | # Convert the 0-1 range into a value in the right range.
39 | return newScaleMin + (valueScaled * rightSpan)
40 |
--------------------------------------------------------------------------------
/MainTodo2.txt:
--------------------------------------------------------------------------------
1 | MAIN TODO:
2 | Fix MST gather, either stop gathering shit leaves somehow or just prune all shit leaves and then path-gather back up to desired.
3 |
4 | Expansion continuation. (Leftover army gets re-expanded.)
5 | general / city gets re-added back in with smaller army.
6 | Splitting army as option?
7 | Expansion should switch search order from largest tiles first to closest tiles to enemy territory first.
8 | - If not for full expansion, then at least for last 10-15 turns of it or so...
9 | Expansion should prioritize enemy tiles further from enemy army sources first (general cities), as they are least likely to be retaken. Balance this with defense. (Same with enemy tiles on quickexpand)
10 |
11 | Switch path targeting from breadth_first_kill to dynamic_bfs_max (like greedy gather). Stop using tiny armies instead of large armies 1 or 2 moves longer to kill these....
12 | stop attacking running away armies before army bonus. Kill stuff instead and let them run.
13 |
14 |
15 |
16 | Combine gather + expansion at the same time (so that we don't gather already good expansion tiles away from good spots etc)
17 | interlace expansion with gather at some points, particularly where it reveals fog and doesn't use cities?
18 |
19 | When winning on army but not economy, use move-halfs to leave some army behind while continuing to take tiles and attack
20 |
21 |
--------------------------------------------------------------------------------
/StrategyModels/ExpansionPotential.py:
--------------------------------------------------------------------------------
1 | import typing
2 |
3 | from Behavior.ArmyInterceptor import InterceptionOptionInfo
4 | from Interfaces import TilePlanInterface
5 | from base.client.tile import Tile
6 |
7 |
8 | class ExpansionPotential(object):
9 | def __init__(
10 | self,
11 | turnsUsed: int,
12 | enTilesCaptured: int,
13 | neutTilesCaptured: int,
14 | selectedOption: TilePlanInterface | None,
15 | allOptions: typing.List[TilePlanInterface],
16 | cumulativeEconVal: float
17 | ):
18 | self.turns_used: int = turnsUsed
19 | self.en_tiles_captured: int = enTilesCaptured
20 | self.neut_tiles_captured: int = neutTilesCaptured
21 | self.selected_option: TilePlanInterface = selectedOption
22 | self.all_paths: typing.List[TilePlanInterface] = allOptions
23 | self.plan_tiles: typing.Set[Tile] = set()
24 | self.preferred_tiles: typing.Set[Tile] = set()
25 | self.blocking_tiles: typing.Set[Tile] = set()
26 | self.intercept_waiting: typing.List[InterceptionOptionInfo] = []
27 | """Tiles who are part of the required plan, but which have a required delay on them."""
28 |
29 | self.includes_intercept: bool = False
30 | for selectedOption in allOptions:
31 | self.plan_tiles.update(selectedOption.tileSet)
32 |
33 | self.cumulative_econ_value: float = cumulativeEconVal
34 |
--------------------------------------------------------------------------------
/UnitTests/test_MapMatrix.py:
--------------------------------------------------------------------------------
1 | from MapMatrix import MapMatrixSet
2 | from Sim.GameSimulator import GameSimulatorHost
3 | from TestBase import TestBase
4 | from base.client.map import MapBase
5 | from bot_ek0x45 import EklipZBot
6 |
7 |
8 | class MapMatrixUnitTests(TestBase):
9 | def __init__(self, methodName: str = ...):
10 | super().__init__(methodName)
11 |
12 | def get_debug_render_bot(self, simHost: GameSimulatorHost, player: int = -2) -> EklipZBot:
13 | bot = super().get_debug_render_bot(simHost, player)
14 |
15 | # bot.info_render_tile_deltas = True
16 | # bot.info_render_army_emergence_values = True
17 | # bot.info_render_general_undiscovered_prediction_values = True
18 |
19 | return bot
20 |
21 | def test_map_matrix_set_iterator(self):
22 | mapFile = 'GameContinuationEntries/should_recognize_army_collision_from_fog___BlpaDuBT2---b--136.txtmap'
23 |
24 | map, general, enemyGeneral = self.load_map_and_generals(mapFile, 136)
25 |
26 | matrix = MapMatrixSet(map)
27 | tileIn1 = map.GetTile(1, 3)
28 | tileIn2 = map.GetTile(6, 9)
29 |
30 | matrix.add(tileIn1)
31 | matrix.add(tileIn2)
32 |
33 | self.assertIn(tileIn1, matrix)
34 | self.assertIn(tileIn2, matrix)
35 |
36 | tilesIn = [t for t in matrix]
37 | self.assertEqual(2, len(tilesIn))
38 | for t in tilesIn:
39 | self.assertTrue(t == tileIn1 or t == tileIn2)
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/SgK4X1Xh3.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M M M M M
3 | M M M M
4 | M M
5 | M M M M
6 | M b2 b2 b2 b2 b2 b2 C48 M M M
7 | M b2 M C47 M M M M
8 | bG4 b2 M C44 C43 M
9 | b2 b2 b2 b2 b2 b2 M M M M M M
10 | b2 M M b2 M M M M M
11 | b2 b2 M b2 M M
12 | b2 M
13 | M b2 b2 M M
14 | M M C47 b2 M
15 | M M M
16 | M M M M
17 | M M M M M M
18 | M M M M M M
19 | M M M M
20 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/Defense/FogArmyDefenseDeath/75.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M M M M M M
3 | M
4 | M M M M M M M M M
5 | M M M M M M
6 | M M M M M M
7 | b1 b1
8 | b1 bG2 b1 M a27 M M
9 | b1 b1 b27 b2 b2 b2 a1 a1 M
10 | b1 b1 M C43 a2 b1 a1 M
11 | M b1 b1 b1 b1 b1 b2 b1 M M
12 | M b1 b1 b1 M
13 | M M M b1 b1 b1 M M M
14 | M M M M C48 M
15 | M M M M M M
16 | M M M M M
17 | M M M M
18 | M M M M
19 | M M M M M M
20 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/Defense/FogArmyDefenseDeath/76.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M M M M M M
3 | M
4 | M M M M M M M M M
5 | M M M M M M
6 | M M M M M M
7 | b1 a25
8 | b1 bG3 b1 M a1 M M
9 | b1 b1 b1 b28 b2 b2 a1 a1 M
10 | b1 b1 M C43 a2 b1 a1 M
11 | M b1 b1 b1 b1 b1 b2 b1 M M
12 | M b1 b1 b1 M
13 | M M M b1 b1 b1 M M M
14 | M M M M C48 M
15 | M M M M M M
16 | M M M M M
17 | M M M M
18 | M M M M
19 | M M M M M M
20 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/SexDZkX3n.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M
3 | M M M M M
4 | M b2 b2 M M C46 M
5 | M b2 bG3 b2 b2 b2 b2 b2 b2 b2 b2 M
6 | M b2 M b2 b2 b2 b2 b2 M
7 | b2 b2 M M b2 b2 M
8 | M M b2 b2 M M
9 | M b2
10 | M M M M M
11 | M M M M
12 | M
13 | M M M M M
14 | M M M
15 | M M M M M
16 | M M M M M M M
17 | M M M M M M M M
18 | M M M
19 | M M M M M M M
20 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/reDFESS23.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | |
2 | M M M M M M M
3 | M M
4 | M M M
5 | M M M M
6 | M C48 b2 b2 M M M
7 | b2 bG3 b2 b2 b2 b2 M M M
8 | b2 b2 b2 b2 C50 b2 b2 b2 b2 M M
9 | M M b2 b2 M b2 M M
10 | M M M b2 b2 b2 b2 b2 b2 M
11 | M M M C42 M M M
12 | M M M M
13 | M M M
14 | M M M M M M
15 | M M M M
16 | M M M M M M M
17 | M M M
18 | M M M M M
19 | M M M
20 | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/rlo0eJXnh.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M M M M
3 | M M M M M M
4 | M M M
5 | M M M M M M
6 | M M M M
7 | M M M M
8 | M M M
9 | M M M M
10 | M M M b2 M M M
11 | M M b2 b2 b2 M M M M
12 | b2 M
13 | M b2 M M
14 | M b2 b2 b2 M M M
15 | M M b2 M b2 M
16 | M b2 b2 C47 M
17 | M M M M b2 M b2 M M
18 | M M b2 b2 b2 b2 b2 M M
19 | M bG5 M b2 b2 M M
20 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/rxrfCyQhn.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | |
2 | M
3 | M M M M M
4 | M
5 | M M M M
6 | M M
7 | M C43 M b2 b2 M M
8 | b2 b2 b2 M M M
9 | b2 M M M M b2 M M M M
10 | b2 M M b2 M M M M M
11 | bG3 b2 b2 b2 b2 b2 b2 b2 M M M
12 | b2 b2 b2 b2 b2 M M
13 | M M b2 b2 b2 M
14 | M M
15 | M M M M M M
16 | M M M
17 | M M M M M M M
18 | M M M M M M
19 | M M M
20 | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/He1G1kX33.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M M b2 b2 b2 bG4 M
3 | M M b2 b2 b2 b2 b2 b2 M b2 M M M
4 | C41 b2 M b2 M b2 M M
5 | M M M M b2 b2 b2 M b2 b3
6 | b2 b2 b2 b2 M M M M
7 | M M M
8 | M M M M M M
9 | M M M M M M M
10 | M M M M M M M M
11 | M M M M M M
12 | M M M M M
13 | M M M
14 | M M M M M M
15 | M M M M M M
16 | M M M M
17 | M M M M
18 | M M
19 | M M
20 | M M M M
21 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/SlmUVUSh2.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M M M M M
3 | M M M M
4 | a2 a2 a2 a2 M M a2 M M M M
5 | C45 M aG4 a2 a2 a2 M M M M M
6 | M a2 M M M M
7 | M a2 a2 a2 a2 a2 a2
8 | M C45 a2 a2 C45 M a2 M M
9 | C42 a2 M M a2
10 | M a2 M M M
11 | a2 a2 M M
12 | M M M M M
13 | M M M M M
14 | M M M M M
15 | M M M M M M
16 | M M M M M M
17 | M M M M M M
18 | M M
19 | M M M M
20 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/GatherAnalyzer.py:
--------------------------------------------------------------------------------
1 | import SearchUtils
2 | from Interfaces import MapMatrixInterface
3 | from base.client.map import MapBase, Tile
4 | from MapMatrix import MapMatrix
5 |
6 |
7 | class GatherAnalyzer(object):
8 | def __init__(self, map: MapBase):
9 | self.gather_locality_map: MapMatrixInterface[int] = MapMatrix(map, 0)
10 | self.map = map
11 |
12 | def __getstate__(self):
13 | state = self.__dict__.copy()
14 | if "map" in state:
15 | del state["map"]
16 | return state
17 |
18 | def __setstate__(self, state):
19 | self.__dict__.update(state)
20 | self.map = None
21 |
22 | def scan(self):
23 | """
24 | Look for pockets of far away army and put weights on them
25 |
26 | @return:
27 | """
28 |
29 | self.gather_locality_map: MapMatrixInterface[int] = MapMatrix(self.map, 0)
30 | for tile in self.map.pathable_tiles:
31 | if tile.player != self.map.player_index:
32 | continue
33 |
34 | def counter(nearbyTile: Tile):
35 | if nearbyTile.isObstacle:
36 | return True
37 | if nearbyTile.isCity or nearbyTile.isGeneral:
38 | # Skip cities because we want to gather TILES not CITIES :|
39 | return
40 | if nearbyTile.player == self.map.player_index:
41 | self.gather_locality_map[tile] += nearbyTile.army - 1
42 |
43 | SearchUtils.breadth_first_foreach(self.map, [tile], maxDepth=4, foreachFunc=counter, noLog=True)
44 |
45 |
46 |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/Hg4b0SBnn.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M M M M M M
3 | M M M M M M M M
4 | M M M
5 | M M M M M M
6 | M M M M M M M
7 | M M M M
8 | M M M M
9 | M M M b2 M M
10 | M M M b2 b2 M M M M
11 | M b3 M C47 b2 M
12 | bG3 b2 b2 b2 b2 b2 b2 b2 b2 M M M
13 | b2 b2 b2 M M M
14 | b2 b2 M M M M
15 | b2 b2 M M M
16 | b2 M M M
17 | M b2 C49 M M M M M M M
18 | b2 C47 M M
19 | M M M M M M
20 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/HlfOpuNhn.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | |
2 | M M M M M
3 | M M M M M
4 | M
5 | M M M M M M
6 | M M M M M M M
7 | M M
8 | M M
9 | M M M M M
10 | M M M M M
11 | M M M
12 | M M C50 b2 b2 b2 b2 M M
13 | M b2 b2 b2 M M M
14 | b2 b2 M M M M M
15 | C48 b2 b2 b2 M M
16 | b2 b2 b2 M b2 M M M M M
17 | b2 bG3 b2 b2 b2 b2 M M
18 | b2 b2 b2 M M
19 | M C48 M M M M M M M
20 | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Communication/TileCompressor.py:
--------------------------------------------------------------------------------
1 | import typing
2 |
3 | from base.client.map import MapBase, Tile
4 |
5 |
6 | class TileCompressor(object):
7 | def __init__(self, map: MapBase):
8 | self.map: MapBase = map
9 |
10 | def compress_tile(self, tile: Tile) -> str:
11 | return str(tile)
12 |
13 | def compress_tile_list(self, tiles: typing.List[Tile], charsLeft: int) -> str:
14 | compressed = []
15 | for tile in tiles:
16 | if charsLeft < 5:
17 | break
18 |
19 | charsLeft -= 1 # separator
20 | c = self.compress_tile(tile)
21 | compressed.append(c)
22 | charsLeft -= len(c)
23 |
24 | return '|'.join(compressed)
25 |
26 | def decompress_tile(self, tileStr: str) -> Tile | None:
27 | try:
28 | xStr, yStr = tileStr.split(',')
29 | return self.map.GetTile(int(xStr), int(yStr))
30 | except:
31 | return None
32 |
33 | def decompress_tile_list(self, tiles_str) -> typing.List[Tile]:
34 | individual = tiles_str.split('|')
35 | return [self.decompress_tile(s) for s in individual if self.decompress_tile(s) is not None]
36 |
37 |
38 | class ServerTileCompressor(TileCompressor):
39 | def __init__(self, map: MapBase):
40 | super().__init__(map)
41 |
42 | def compress_tile(self, tile: Tile) -> str:
43 | return str(tile.tile_index)
44 |
45 | def decompress_tile(self, tileStr: str) -> Tile | None:
46 | try:
47 | return self.map.get_tile_by_tile_index(int(tileStr))
48 | except:
49 | return None
50 |
51 |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/SlIacHHnh.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M bG5 b2 M M M
3 | M b2 b2 b2 b2 b2 M M
4 | M b2 b2 M M b2 M M
5 | b2 b2 b2 b2 b2 b2 M M M M
6 | C43 b3 M M b2 b2 M M M M
7 | M b2
8 | M b2 M
9 | M M b2 M M M M M
10 | M M M M M
11 | M M M M M M M
12 | M M M M
13 | M M M M M M
14 | M M
15 | M M M M M M M
16 | M M
17 | M M M M M M
18 | M M M M
19 | M M M M M
20 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/rePkW8Sn3.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M M M M M M
3 | M M M M M M M
4 | M M M
5 | a2 a2 a2 M M M M
6 | M C44 aG3 a2 a2 M
7 | M a2 a2 M a2 M M
8 | a2 a2 a2 M M M M
9 | M M a2 a2 a2 a2 M M M
10 | C47 a2 a2 M
11 | M M a2 M M M M
12 | M M M a2 M M M M
13 | M M a2 a2 a2 M M
14 | M M a2 M M M M M
15 | M M a2 M M
16 | M M M
17 | M M M M M
18 | M M M M M M M M
19 | M M M M
20 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/SxlKfy72h.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | |
2 | M M M M M
3 | M M M M M M M
4 | M M M M M M
5 | M M M M M M M
6 | M M M
7 | M M M M
8 | M M M M M M M
9 | M
10 | M
11 | a2 a2 M M M M
12 | a2 M M M M
13 | M M a2 a2 a2 a2 a2 M M a2 M M M
14 | M C46 M M a2 a2 a2 M
15 | M M a2 C46 a2 M M
16 | M M a2 a2 a2 aG3 a2 a2 M
17 | M M M a2 M M M M
18 | M M M M a2 M M M M M M
19 | M M M a2 a2 a2 M
20 | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/HxBwTGBhh.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M M M b2 b2 bG7 M
3 | M M b2 b2 b2 M M
4 | M b2 b2 M M
5 | M M M b2 b2 M
6 | M M M b2 b2 M
7 | M M M M M b2 b2 C48 M
8 | M M M M M b2 b2 b2 M
9 | M M M M M M M b2 M M M
10 | M M C46 b2 b2 M
11 | M M M M M b2
12 | M M M M
13 | M M M M M
14 | M M M M M M
15 | M M M M
16 | M M M M M
17 | M M M M
18 | M M M
19 | M M
20 | M M M M M
21 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/BgFvXQBhh-2.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M b2 b2 M M M M M
3 | b2 b2 bG4 M M M M M M
4 | b2 M b2 b2 b2 b2 M M
5 | b2 b2 b2 M M
6 | b2 b2 M M M
7 | M b2 M M M M M M M
8 | b2 b2 b2 M
9 | M b2 M M M
10 | b2 b2 b2 b2 M M M M
11 | M M M M
12 | M M M M M
13 | M M M M M
14 | M M M M
15 | M M M M M M
16 | M M M M
17 | M M M M M
18 | M M M M M
19 | M M M M
20 | M M M M
21 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/SgqGZBS22.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M
3 | M M M M
4 | M M M M
5 | M M M
6 | M M M M M M M
7 | M M M M M M
8 | M M
9 | M M M M
10 | b2 b2 b2 b2 M
11 | b2 bG3 M M M
12 | b2 b2 b2 M M M M M M M
13 | b2 b2 b2 M M M M
14 | M b2 b2 b2 b2 M M C42 M M M
15 | b2 b2 b2 b2 b2 b2 b2 b2 b2
16 | M M M M M M
17 | M M M M
18 | M M M M
19 | M M M
20 | M M M M
21 | M M M M M
22 | M M
23 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/He2s-k7hn.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | |
2 | M M M M M
3 | M M M M M M M b2 b2 b2 b2
4 | M M M b2 M bG3 b2
5 | M M b2
6 | M M b2 b2 b2 b2 b2 b2 b2 b2 b2
7 | M M M b2 M M b2 C44
8 | M b2 M M b2 b2 b2 b2
9 | M M M b2
10 | M M M
11 | M M M M M M
12 | M M M M M M
13 | M M M M
14 | M M M M M M
15 | M M M M
16 | M M M M
17 | M M M
18 | M M M M M
19 | M M M M M M
20 | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/HxMIUIr22.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | |
2 | M M M M M C43 M M
3 | M M M b2 b2 bG3 b2 M
4 | M M C43 b2 b2 b2 b2 b2 b2
5 | M b2 b2 b2 b2 M b2 M
6 | M M M M M M M b2 M
7 | M M b2
8 | M M C43 M b2 M
9 | M M b2 b2 b2 b2 b2 b2
10 | b2 M
11 | M M M
12 | M M M M M M
13 | M M M M M M M M
14 | M M M M
15 | M M M M
16 | M M M M M M M
17 | M M M M
18 | M M
19 | M M
20 | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/HgwhkJ7n3.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M M M
3 | M M M
4 | M M M M
5 | M M M M M
6 | M M M M M M M
7 | M M M M M M M
8 | M M M M M M
9 | M M M M M M M
10 | M M a2 M M M M
11 | M M M a2 M M
12 | a2 M M M
13 | M M a2 M M M M M M
14 | M M a2 M M M
15 | a2 a2 a2 a2 a2 M M M
16 | a2 M a2 a2 a2
17 | M a2 a2 a2 a2 M M M M
18 | aG3 a2 a2 a2 a2 M
19 | M a2 M M M M M M M
20 | a2
21 | C42 M M M M
22 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/HlETnAGnh.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M M M
3 | M M M M M
4 | M a2 M M
5 | a2 aG3 a2 M M M
6 | a2 a2 M M M M M M
7 | a2 a2 a2 a2 a2 a2 a2 a2 a2 M M M
8 | a2 a2 M M M M a2 M M M M M M
9 | a2 a2 a2 M a2 M M
10 | C40 a2 a2 M a2
11 | M M C40 M M
12 | M M
13 | M M
14 | M M M M
15 | M M M M M M M
16 | M M M M
17 | M M M M M
18 | M M M M M
19 | M M M M M
20 | M M M M
21 | M M M M M M
22 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/Se0L3QB2h.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | |
2 | M
3 | M M M M M
4 | M M M M M
5 | M M M M M M
6 | M M
7 | M M M M M M M M
8 | a2 a2 a2 M M M M M
9 | a2 a2 C41 M M M M M
10 | a2 C42 a2 a2 a2 a2 M M M
11 | a2 a2 a2 a2 a2 a2 a2 M M
12 | a2 a2 M M M M M M M
13 | M aG3 a2 M M M M M
14 | a2 a2 M M M M
15 | M M a2 a2
16 | M M M M M M M
17 | M M
18 | M M M M M
19 | M M M M M
20 | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/only_got_24_when_seems_easy_25__V1__turn50.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | | |
2 | M M M M
3 | M M M M M
4 |
5 | M M M M M
6 | M M M M M
7 | M C41 M a2 M
8 | C45 a2 a2 a2 M M M
9 | M M a2 a2 M M
10 | M M M a2 M M M M M
11 | a2 M a2 M M M M M M M
12 | a2 M M a2 M M M M M M M M M
13 | a2 a2 aG4 a2 a2 a2 M M M
14 | M a2 M M M M M
15 | M a2 M M M M M
16 | a2 a2 a2 a2 a2 M M
17 | M M C42
18 | M M
19 | M M M M M
20 | | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/SeD8j0G2n.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M M M M M M M
3 | M M M M M M
4 | M M M
5 | M M M M M M
6 | M M M
7 | M M M M M
8 | M M M M
9 | M M M
10 | M M M M M M b2
11 | M M M M M M M b2
12 | M M M b2 b2 b2
13 | M M M M M C46 b2 b2 b2
14 | M M M M b2 b2 b2 M
15 | M M M b2 b2 M M
16 | M M M M b2 b2 b2 M
17 | M M b2 b2 b2 b2 b2
18 | M M b2 bG3 b2 b2
19 | M M M M
20 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/Sg4vSXS22.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M M M
3 | M M M M M M
4 | M b2 M
5 | M M M b2 bG3 b2
6 | M b2 b2 b2 b2 b2 M
7 | M M M M b2 b2 b2 b2
8 | M M M b2 b2 b2 M M
9 | M M M b2 M b2 M M M
10 | M M M b2 M
11 | M M M M b2
12 | M M M C47 b2
13 | M M M M M b2 b2 M M
14 | M M M M M M b2 M M M
15 | M M M b2
16 | M M
17 | M M M
18 | M
19 | M M M M M M M
20 | M M M
21 | M M M
22 | M M M M
23 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/BgFvXQBhh.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M M M M M M
3 | M M M M M M
4 | M M M
5 | M M
6 | M M M b2
7 | M M M M M M b2 M M
8 | M b2 b2 b2 b2 b2 b2 b2 b2 b2
9 | M M M bG4 b2 M
10 | M M b2 M M
11 | M b2 b2 b2 b2 b2 M M M
12 | M M M b2 b2 b2 M M
13 | M M b2 b2 M M M
14 | M M M M
15 | M M M M M M
16 | M M M M
17 | M M M M M
18 | M M M M M
19 | M M M M
20 | M M M M
21 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/HgD_-ON23.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | |
2 | M M M M M
3 | M M M
4 | M M M
5 | M M M M
6 | M M M M M M
7 | M M M M
8 | M M M
9 | M
10 | M M M M M M M
11 | M M M M M M
12 | M M M b2 M M
13 | b2 M b2 b2 b2 b2 M M
14 | b2 b2 b2 b2 b2 b2 b2 b2 b2 M
15 | M M b2 bG3 b2 b2 M b2 b2 M M M
16 | M M b2 b2 b2 b2 M M
17 | M M M M M M
18 | M M
19 | M M M M M M M M M M
20 | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/HlP2aMB22.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | |
2 | M M a2 aG4 a2 a2 a2 a2 M M
3 | M M M a2 a2 M M a2 C49
4 | a2 a2 a2 a2 M M M
5 | M M a2 a2 M M
6 | M a2 a2 a2 M
7 | M a2 M M
8 | M a2 a2 M M M
9 | M M M M a2 M M
10 | M a2 M M M M M
11 | M M a2 M
12 | M M M M M M M M
13 | M M M M M M
14 | M M M M M M M
15 | M M M M M M
16 | M M M
17 | M M M
18 | M M M M M M M
19 | M M
20 | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/Sgx9eiuE3n.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | C48 bG4 b2 b2 M M M M
3 | M b2 b2 M M M
4 | b2 b4 M M M M M
5 | M M M M b2 b2 b2 b2 b2 M
6 | M M b2 M b2 b2 M
7 | M b2 M M M M M M M
8 | M b2 b2 M
9 | C45 M b2 b2 M
10 | M b2 M M M
11 | M b2 M
12 | C41 M
13 | M M M M
14 | M M M M M M M M
15 | M M M M M M
16 | M M M M M
17 | M M M M
18 | M M
19 | M M M M M M M
20 | M M
21 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/rgdB4LH33.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M M M M
3 | M M M M M M M M
4 | M M M M
5 | M M M M M
6 | M M M M M M
7 | M M M M M
8 | M M M M M M
9 | M M M M M
10 | M M M M M
11 | M b2 M M
12 | M M M b2 M
13 | M b2 b2 b2 M
14 | M C43 b2 M M
15 | M M M M b2 b2 M
16 | M M M b2 b2 M
17 | M b2 b2 b2 b2
18 | M M b2 b2 b2 b2 M
19 | M M b2 b2 b2 M
20 | M C44 b2 b2 bG3 b2
21 | M M M M M
22 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/SymmetricTestMaps/even_playground_map_small__top_right_bot_left.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | |
2 | M C45 M
3 | M C41 M
4 | M M
5 | M M M bG1 M
6 | M M M
7 | M M M M
8 | M C43
9 | M C47 M C39
10 |
11 | C39 M C47 M
12 | C43 M
13 | M M M M
14 | M M M
15 | M aG1 M M M
16 | M M
17 | M C41 M
18 | M C45 M
19 | | | | | | | | | | | | | | | |
20 | turn=383
21 | player_index=1
22 | aTiles=55
23 | aScore=148
24 | aStandingArmy=93
25 | aStars=55
26 | aCityCount=1
27 | aGeneral=13,1
28 | aKnowsKingLocation=True
29 | aDead=False
30 | aLeftGame=False
31 | aLeftGameTurn=-1
32 | bTiles=71
33 | bScore=159
34 | bStandingArmy=88
35 | bStars=57
36 | bCityCount=1
37 | bGeneral=6,13
38 | bKnowsKingLocation=False
39 | bDead=False
40 | bLeftGame=False
41 | bLeftGameTurn=-1
42 | bot_target_player=0
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/HlIwySr23.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M a2 a2
3 | M a2 a2 a2 a2 aG3 a2 a2 a2 a2 M
4 | M a2 a2 M M
5 | M M M M a2 a2 M M M
6 | M M a2 M a2 a2 C45 M
7 | M M a2 a2 M a2 M M M
8 | M a2 a2 M
9 | M M M M a2 M
10 | M M a2 M M
11 | M M M M M
12 | M M
13 | M M M
14 | M M M M M M
15 | M M M
16 | M M M M M M
17 | M M M M M
18 | M M M M M
19 | M M M M M
20 | M M
21 | M
22 | M M M M M
23 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/HlzMJrSn2.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | |
2 | M M M
3 | M M M M
4 | M M M M
5 | M M M
6 | M M M M M M M
7 | M M M M M M
8 | M M M M C40 b2
9 | M M M M M M M b2 M M
10 | M M M M M M b2
11 | M M M C48 b2 b2 b2 b2
12 | M M M M M b2 M b2 M
13 | M M M M M b2 M b2
14 | M M b2 M b2
15 | M M b2 b2 M M b2 b2 b2 b2
16 | M M b2 b2 bG3 b2 M M M
17 | M M b2 b2 M M
18 | M M M M M
19 | M M M M
20 | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/SlptbLrn2.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M M M M
3 | M M M M
4 | M M M M b2 b2 b2
5 | C50 b2 b2 bG4 b2 b2 b2 M
6 | b2 b2 b2 M C47 C42 b2 M
7 | M M M M b2 M b2 b2
8 | M M b2 b2 b2 M M M
9 | M M M M M b2 M M
10 | M M b2 M
11 | M M b2 M M
12 | M M M M M b2 M
13 | M b2 M
14 | M M M
15 | M M M
16 | M M M M
17 | M M
18 | M M M M M
19 | M M M M M
20 | M M M M M
21 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/ExpandUtilsTestMaps/did_not_find_2_move_cap__turn34.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M M M M M
3 | M M M M M
4 | M M M M
5 | M M M M M
6 | M M M M M M M M
7 |
8 | M M
9 | M M M M M M
10 | C49 b1 M M M M
11 | M C40 a2 b1 M M
12 | a1 M M M M M
13 | a1 a1 a1 M M M
14 | M a1 a1 M M M
15 | a1 C44 M M M M
16 | aG6 a1 a1 M M M M
17 | M M M
18 | M M M
19 | M M M M M M
20 | | | | | | | | | | | | | | | | | | |
21 | targetPlayerExpectedGeneralLocation=9,6
22 | player_index=0
23 | bot_target_player=1
24 | aScore=17
25 | aTiles=11
26 | bScore=17
27 | bTiles=10
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/SgRvX_Vh2.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M M M
3 | M M M
4 | M M M M M M M
5 | M M M M M
6 | M M M M M M
7 | M M M M M M
8 | M M
9 | M M M
10 | M M
11 | M M M M M M M M M
12 | M
13 | M M M M M M M
14 | M M M M M
15 | a2 M M M a2 a2 M a2
16 | a2 a2 a2 a2 a2 a2 a2 a2 a2 a2 a2 a2 a2
17 | M M M M M M a2 aG4 M
18 | M M M M a2 M a2
19 | M M M M a2 a2 a2
20 | M M M M M C45
21 | M M M
22 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/rxG_xQr2n.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M M M M M
3 | M M M M M
4 | M M M M
5 | M M M b2 M M
6 | M M b2 M M
7 | M M M b2 b2 M
8 | M M M M b2
9 | M M M b2 M M M M
10 | M M M M b2 M b2
11 | M M M M M M b2 M b2 M
12 | M M M b2 M b2 b2
13 | M M M M M b2 b2 b2 bG3 M
14 | M M M b2 b2 b2
15 | M M M M M b2 b2 M
16 | M M b2 b2 b2 M M
17 | M M M M
18 | M M M M M
19 | M
20 | M M M M M
21 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/rlPnL_V3h.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M M M M
3 | M M M M M M
4 | M M M M
5 | M M M M
6 | M
7 | M M M M
8 | M M M M M
9 | M M M M
10 | M M M M M
11 | M C49 M
12 | M b2 b2 M
13 | M M b2 M C41 b2 M
14 | M M b2 M b2 M M
15 | b2 M b2 M b2
16 | b2 M b2 M M b2
17 | b2 b2 b2 b2 M M
18 | b2 b2 bG3 b2 b2 b2 b2 b2 b2 M
19 | M M C43 C50
20 | M M M M M M M M M M
21 | M M M M M
22 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/HeoR4BH32.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M M a2 a2 M M
3 | M M M a2 a2 a2 a2 a2 a2
4 | M M M M M M a2 a2 aG3 C42
5 | M M M a2 a2 a2 M a2
6 | M M a2 M a2 a2 a2 M M M
7 | a2 C41
8 | M M M a2 M M
9 | M M M a2 M M
10 | a2 C45 M M
11 | M C42 a2 M M
12 | a2 M M
13 | M M
14 | M M M M M M
15 | M M M M M M M
16 | M M M
17 | M M
18 | M M M M
19 | M M M M
20 | M M M M M M
21 | M M M M
22 | M M M M
23 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/BgSJZd4hh.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M M M
3 | M M M
4 | M M M M
5 | M
6 | M M M
7 | M M M M
8 | M M M M M
9 | M M
10 | M M b2 b2 b2 b2 M
11 | M M b2 b2 b2 M b2 b2
12 | b2 M b2 b2 M M
13 | M C41 b2 b2 M M
14 | M M M M b2
15 | M M M M b2 b2 b2 bG4 M
16 | M M M b2 M b2 M M M
17 | M M M M b2 b2
18 | M M M M b2 M
19 | M M M M
20 | M M M M M
21 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/Bl-KgQH3n.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M M M M
3 | M M M M M M M M
4 | M M M M M M
5 | M M M M M
6 | M M M M M
7 | M M
8 | M M M M M
9 | M M M M M M
10 | M M M M
11 | M M
12 | M M M
13 | M M M C43 b2 M M M M
14 | M M M b2 M M
15 | b2 M M M b2
16 | b2 M M M M C45 M b2 M M
17 | M b2 b2 bG3 b2 b2 M b2 b2 M M M
18 | M b2 b2 b2 b2 b2 b2 M M
19 | b2 b2 M M M M M
20 | b2 b2 b2 b2 M M M M M
21 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/BlumhyQ22.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | |
2 |
3 | M M M M M
4 | C41 a2 a2 M
5 | M a2 aG3 a2 a2 a2
6 | a2 a2 a2 a2 M a2 C41 M M M M
7 | M M a2 a2 M a2 a2 M M
8 | M a2 M a2 a2 M
9 | M a2 M M a2 M M
10 | M M M a2 M
11 | M M M M M M M a2 M M M M
12 | M M a2 M
13 | M a2 M M M
14 | M M M M M
15 | M M M
16 | M M M M M M M
17 | M M
18 | M M M M M
19 | M M M M M
20 | M M M M
21 | M M M M
22 | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/redaEIShh.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M M M M
3 | M M a2 a2 M
4 | M M a2 a2 M
5 | M M a2 a2 M M M
6 | M a2 M M M M
7 | a2 aG4 a2 M M M M M M
8 | a2 C43 a2 a2 a2 a2 a2 M M M
9 | M a2 a2 M a2 M M
10 | M M a2 a2 M M
11 | M M M M a2 M M
12 | M M M a2 M M M
13 | M M M a2 M M M
14 | M M M M M M
15 | M M M M M M M
16 | M M M M
17 | M M M M M
18 | M M M M
19 | M M
20 | M
21 | M M M M M
22 | M M M M M
23 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/rgf5JVr23.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M M M
3 | M M M M M
4 | M M
5 | M M
6 | M M M M M
7 | M
8 | M M M
9 | M M M
10 | M M M M M
11 | M M M M M
12 | M M
13 | M M M M M
14 | b2 b2 M M M M
15 | M M b2 M M M M M
16 | M b2 b2 b2 M
17 | M M b2 M M M M M M
18 | M b2 b2 M M M
19 | b2 M M b2 b2 M M M
20 | b2 b2 M M b2 M M M
21 | M b2 b2 b2 b2 M M M M
22 | M M bG4 b2 b2 b3 M
23 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/BxLPSUB33.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M M M C45 b2 b2 M
3 | M M M M M b2 b2 b2 b2 bG3 M
4 | M M M b2 b2 M b2 M
5 | M b2 b2 b2 M b2 M
6 | M C43 b2 b2 M b2 b2 b2
7 | M b2 b2 b2 b2 b2 C44
8 | M b2 M M M M
9 | M M M
10 | M M M M
11 | M M M M
12 | M M M
13 | M M M M
14 | M M M M M
15 | M M M M M M
16 | M M
17 | M M M
18 | M M M M M M
19 | M M M M M M
20 | M M M M
21 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Models/Move.py:
--------------------------------------------------------------------------------
1 | from base.client.tile import Tile
2 |
3 |
4 | class MoveBase(object):
5 | def __init__(self, source: Tile, dest: Tile, move_half=False):
6 | self.source: Tile = source
7 | self.dest: Tile = dest
8 | self.move_half = move_half
9 |
10 | def __gt__(self, other):
11 | if other is None:
12 | return True
13 | return self.source.army - self.dest.army > other.source.army - other.dest.army
14 |
15 | def __lt__(self, other):
16 | if other is None:
17 | return False
18 | return self.source.army - self.dest.army < other.source.army - other.dest.army
19 |
20 | def __str__(self):
21 | moveHalfString = ""
22 | if self.move_half:
23 | moveHalfString = 'z'
24 | return f"{self.source.x},{self.source.y} -{moveHalfString}> {self.dest.x},{self.dest.y}"
25 |
26 | def __repr__(self):
27 | return str(self)
28 |
29 | def __hash__(self):
30 | return self.source.tile_index ^ (self.dest.tile_index << (2 if self.move_half else 5))
31 |
32 | def __eq__(self, other):
33 | if isinstance(other, MoveBase):
34 | return self.source.tile_index == other.source.tile_index and self.dest.tile_index == other.dest.tile_index and self.move_half == other.move_half
35 |
36 | return False
37 |
38 | def toString(self) -> str:
39 | return str(self)
40 |
41 |
42 | class Move(MoveBase):
43 | def __init__(self, source: Tile, dest: Tile, move_half=False):
44 | super().__init__(source, dest, move_half)
45 | self.army_moved: int = source.army - 1
46 | if self.move_half:
47 | self.army_moved = (source.army - 1) // 2
48 | self.non_friendly = self.source.player != self.dest.player
49 |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/SeirZLS33.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | | |
2 | M M M M
3 | M M M M M M
4 | M M M M
5 | M M M M M M M M
6 | M M M M M M M M
7 | M M M M M M M
8 | M M M M M
9 | M M M M
10 | M b2 b2 M M M M
11 | M b2 b2 b2 b2 b2 b2 b2 b2 b2 M M
12 | b2 bG3 b2 b2 b2 M b2 b2 b2
13 | b2 b2 b2 b2 b2 b2 M C44 M
14 | M C44 M M M
15 | M M M M M M M M M M M M
16 | M M M
17 | M M
18 | M M M M M
19 | M M M
20 | | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # cppimport temp files
2 |
3 | .rendered.*.cpp
4 | *.pyd
5 |
6 |
7 | # Mac DS Store
8 | .DS_Store
9 |
10 | # Byte-compiled / optimized / DLL files
11 | __pycache__/
12 | *.py[cod]
13 | *$py.class
14 |
15 | # C extensions
16 | *.so
17 |
18 | # Stupid vs stuff
19 | *.suo
20 |
21 | # Distribution / packaging
22 | .Python
23 | env/
24 | build/
25 | develop-eggs/
26 | dist/
27 | downloads/
28 | eggs/
29 | .eggs/
30 | lib/
31 | lib64/
32 | parts/
33 | sdist/
34 | var/
35 | *.egg-info/
36 | .installed.cfg
37 | *.egg
38 |
39 | # PyInstaller
40 | # Usually these files are written by a python script from a template
41 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
42 | *.manifest
43 | *.spec
44 |
45 | # Installer logs
46 | pip-log.txt
47 | pip-delete-this-directory.txt
48 |
49 | # Unit test / coverage reports
50 | htmlcov/
51 | .tox/
52 | .coverage
53 | .coverage.*
54 | .cache
55 | nosetests.xml
56 | coverage.xml
57 | *,cover
58 | .hypothesis/
59 |
60 | # Translations
61 | *.mo
62 | *.pot
63 |
64 | # Django stuff:
65 | *.log
66 | local_settings.py
67 |
68 | # Flask stuff:
69 | instance/
70 | .webassets-cache
71 |
72 | # Scrapy stuff:
73 | .scrapy
74 |
75 | # Sphinx documentation
76 | docs/_build/
77 |
78 | # PyBuilder
79 | target/
80 |
81 | # IPython Notebook
82 | .ipynb_checkpoints
83 |
84 | # pyenv
85 | .python-version
86 |
87 | # celery beat schedule file
88 | celerybeat-schedule
89 |
90 | # dotenv
91 | .env
92 |
93 | # virtualenv
94 | venv/
95 | ENV/
96 |
97 | # Spyder project settings
98 | .spyderproject
99 |
100 | # Rope project settings
101 | .ropeproject
102 |
103 | # Wildcard Ignore
104 | *_ignore.*
105 |
106 | # VsCode
107 | .vscode/
108 |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/Bg3razBn3.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M M M
3 | M b2 b2 M M M
4 | M M bG3 b2 b2 b2 b2 M
5 | b2 b2 b2 M b2 M M
6 | b2 b2 b2 b2 b2 b2 M
7 | b2 C44 b2 b2 M M M M M
8 | M M M b2 b2 M M M M M
9 | M M b2 b2
10 | M M M C47 b2 M M M M M
11 | M M M
12 | M M
13 | M M M M M M M
14 | M M M M M M
15 | M M M M
16 | M M M M M M
17 | M M M
18 | M M M M
19 | M M M M M
20 | M M M M M
21 | M M M
22 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/Hxw4hwNn3.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M
3 | M M b2 bG3 b2 b2 M M
4 | M M b2 b2 M b2 M M
5 | M M M b2 b2 M b2 M
6 | M b2 b2 b2 b2 b2 M
7 | M M b2 M M b2 M M M
8 | M M b2 M M M
9 | M M b2 M
10 | M M b2 b2 M M
11 | M M b2 M M
12 | M b2 M M M
13 | M M b2 C43 M
14 | M M b2 M
15 | M M M M
16 | M M M M M
17 | M M M M
18 | M M M
19 | M M M
20 | M M M
21 | M M M M
22 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/Hlel5QBn2.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | | |
2 | M M M M M M
3 | M M M M M
4 | M M M M
5 | M M M
6 | M M M b2
7 | M M M b2 b2 bG3 b2
8 | M M M b2 M b2 b2
9 | M M M b2 b2 b2 b2 b2 M M
10 | M M M M M M M b2 b2 b2 M
11 | M M b2 M b2 M
12 | M M C41 b2 M M
13 | M M b2 b2 b2 b2 b2 b2
14 | M M M M M
15 | M M M M M M
16 | M M M M
17 | M M M M M
18 | M M M M
19 | M M M M M
20 | | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/rgHFQ8Bhh.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | |
2 | M M M C45 a2 a2 M
3 | M M M M M M aG3 a2
4 | M M a2 a2 a2 a2 a2 a2 a2 a2 a2
5 | M M M a2 a2 a2 M a2 a2 a2 a2 M
6 | M M M M a2 M a2 a2 M M M
7 | M a2 a2 M
8 | M M M
9 | M M M M M M M
10 | M M M M M M
11 | M M M M M M
12 | M M M M M M M M
13 | M M M M
14 | M
15 | M M M M M
16 | M
17 | M M M
18 | M M M M M M
19 | M M M M
20 | M M M
21 | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/suboptimal_cramped_spawn.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | |
2 | M M M M
3 | M M M M M
4 | M M M M M M
5 | M M M M
6 | M M M M
7 | M M M M M
8 | M M M
9 | M
10 | M M M M M
11 | M M M M M M M
12 | M M M M
13 | M M M M
14 | M M
15 | M M M M M aG1
16 | M M
17 | M M M M
18 | M M M M
19 | M M M M M
20 | M M M
21 | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/Bly3eEH3h.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | |
2 | M M M M M
3 | M M M b2 b2 b2 b2
4 | M M M bG4 b2 b2
5 | M M M b2 b2
6 | M b2 b2 C49
7 | M M M M M b2 b2 b2
8 | M M M M b2 b2
9 | M M M M M M b2 b2 b2 C47 b2
10 | M M M b2 M
11 | M M M M M b2 M M
12 | M M b2 M M
13 | M M M M b2
14 | M M M
15 | M M M M M
16 | M M M M M M
17 | M M
18 | M M M M M
19 | M M M M M
20 | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/HegGvmHhn.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M M M M
3 | M M M
4 | M M M M
5 | M M C43
6 | M M M M a2
7 | M M M a2 M
8 | M M a2 a2
9 | M M M M M M M M M a3 aG3
10 | M a2 a2 M M M a2
11 | M M M M M a2 a2 a2 a2 M a2 a2
12 | M M M a2 a2 a2 a2
13 | M M M M M M M a2 M
14 | M M M M a2 a2 a2
15 | M M a2 M
16 | M M M
17 | M M M M M M
18 | M M M M M
19 | M M M
20 | M M M M M M M
21 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/base/Colors.py:
--------------------------------------------------------------------------------
1 | BLACK = (0, 0, 0)
2 | GRAY_DARK = (52, 52, 52)
3 | UNDISCOVERED_GRAY = (110, 110, 110)
4 | NEUT_CITY_GRAY = (90, 90, 90)
5 | GRAY = (160, 160, 160)
6 | LIGHT_GRAY = (200, 195, 190)
7 | WHITE = (255, 255, 255)
8 | RED = (200, 40, 40)
9 | ORANGE = (220, 150, 40)
10 | LIGHT_BLUE = (4, 160, 200)
11 | LIGHT_PINK = (170, 138, 141)
12 | PURPLE = (190, 30, 210)
13 | DARK_PURPLE = (140, 0, 180)
14 | CHOKE_PURPLE = (93, 0, 111)
15 | GOLD = (218, 165, 32)
16 |
17 | DARK_GREEN = (5, 75, 45)
18 | DARK_RED = (100, 5, 35)
19 |
20 | OFF_BLACK = (40, 40, 40)
21 | WHITE_PURPLE = (255, 230, 240)
22 |
23 | P_RED = (255, 0, 0)
24 | P_LIGHTBLUE = (39, 146, 255)
25 | P_GREEN = (0, 128, 0)
26 | P_TEAL = (0, 128, 128)
27 | P_ORANGE = (255, 117, 21)
28 | P_PINK = (240, 50, 230)
29 | P_PURPLE = (128, 0, 128)
30 | P_MAROON = (155, 1, 1)
31 | P_YELLOW = (179, 172, 50)
32 | P_BROWN = (154, 94, 36)
33 | P_BLUE = (16, 49, 255)
34 | P_PURPLEBLUE = (89, 76, 165)
35 | P_YELLOWGREEN = (133, 169, 28)
36 | P_LIGHTRED = (248, 115, 117)
37 | P_LIGHTPURPLE = (180, 127, 202)
38 | P_LIGHTBROWN = (180, 153, 113)
39 |
40 | # P_BRIGHT_GREEN = (10,225,90)
41 | PLAYER_COLORS = [
42 | P_RED,
43 | P_LIGHTBLUE,
44 | P_GREEN,
45 | P_TEAL,
46 | P_ORANGE,
47 | P_PINK,
48 | P_PURPLE,
49 | P_MAROON,
50 | P_YELLOW,
51 | P_BROWN,
52 | P_BLUE,
53 | P_PURPLEBLUE,
54 | P_YELLOWGREEN,
55 | P_LIGHTRED,
56 | P_LIGHTPURPLE,
57 | P_LIGHTBROWN,
58 | ]
59 |
60 | TWO_VS_TWO_PLAYER_COLORS = [
61 | P_RED,
62 | P_PURPLE,
63 | P_LIGHTBLUE,
64 | P_GREEN,
65 | P_TEAL,
66 | P_ORANGE,
67 | P_PINK,
68 | P_MAROON,
69 | P_YELLOW,
70 | P_BROWN,
71 | P_BLUE,
72 | P_PURPLEBLUE,
73 | P_YELLOWGREEN,
74 | P_LIGHTRED,
75 | P_LIGHTPURPLE,
76 | P_LIGHTBROWN,
77 | ]
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/rgFOnJX32.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | |
2 | M M
3 | M M M b2 b2 b2 b2 M
4 | M M M b2 b2 bG3
5 | M M M M b2 b2 b2
6 | M M M M b2 M b2
7 | M M M b2 b2 b2 b2 b2 b2
8 | M M M M b2 M C41
9 | M M M b2 M M
10 | b2 b2 b2 b2 b2 M
11 | M C49 C42 M
12 | M M M M
13 | M M M M
14 | M M M
15 | M M M M M M
16 | M M M M M
17 | M M M M M M M M M M
18 | M M M M M M M M
19 | M M M M
20 | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/SymmetricTestMaps/even_playground_map_small__top_left_bot_right.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | |
2 | M C45 M
3 | M C29
4 | M M
5 | M aG1 M C41 M
6 | M M M M
7 | M M M
8 | M M M M
9 | C39 M M M
10 | C43 M M M C43
11 | M M M C39
12 | M M M M
13 | M M M
14 | M M M M
15 | M C41 M bG1 M
16 | M M
17 | C29 M
18 | M C45 M
19 | | | | | | | | | | | | | | | |
20 | turn=383
21 | player_index=1
22 | aTiles=55
23 | aScore=148
24 | aStandingArmy=93
25 | aStars=55
26 | aCityCount=1
27 | aGeneral=13,1
28 | aKnowsKingLocation=True
29 | aDead=False
30 | aLeftGame=False
31 | aLeftGameTurn=-1
32 | bTiles=71
33 | bScore=159
34 | bStandingArmy=88
35 | bStars=57
36 | bCityCount=1
37 | bGeneral=6,13
38 | bKnowsKingLocation=False
39 | bDead=False
40 | bLeftGame=False
41 | bLeftGameTurn=-1
42 | bot_target_player=0
--------------------------------------------------------------------------------
/Tests/Defense/FailedToExecuteValidDefenseGather_Turn291/290.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | b2 b2 b2 b2 b1 b1 b1 b1 M M
3 | b2 b2 b2 M b2 b2 b1 b1 b1 M M M
4 | b2 b2 b2 b1 M b2 b2 b2 b3 b1 a2 M
5 | b1 b1 b1 b1 b1 b3 b1 b1 b1 a1 M
6 | M M M b1 b1 M b1 b5 a1 M M
7 | M b1 M M b3 M a1 M M
8 | M C48 b1 b1 b1 b1 b30 a2 M M
9 | M M b3 b3 b2 b2 b6 M a2 M
10 | M M a1 a1 a1 b3 a1 M
11 | M M a1 a1 a1 b3 a1 M
12 | M M M a2 a1 a1 M a4 a3 C48
13 | M M M a2 a2 C45 M M a4 a4
14 | M M b4 M M a2 a4 a3
15 | M b1 b1 M M M b1 a2 M a4
16 | M C42 b1 b2 b1 b1 b1 M M M
17 | M b1 b1 b1 b1 b1 b2 M C48 M
18 | M M b3 b2 b2 b1 b6 b2 b2 bG28 b1
19 | M M b3 b2 b2 M b2 b2 M b2
20 | M M M b3 b2 b3 b3 b2 b2 C50
21 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/Defense/FailedToExecuteValidDefenseGather_Turn291/291.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | b2 b2 b2 b2 b1 b1 b1 b1 M M
3 | b2 b2 b2 M b2 b2 b1 b1 b1 M M M
4 | b2 b2 b2 b1 M b2 b2 b2 b3 b1 a2 M
5 | b1 b1 b1 b1 b1 b3 b1 b1 b1 a1 M
6 | M M M b1 b1 M b1 b5 a1 M M
7 | M b1 M M b3 M a1 M M
8 | M C48 b1 b1 b1 b1 b1 b27 a2 M M
9 | M M b3 b3 b2 b2 b6 M a2 M
10 | M M a1 a1 a1 b3 a1 M
11 | M M a1 a1 a1 b3 a1 M
12 | M M M a2 a1 a1 M a1 a1 C48
13 | M M M a2 a2 C45 M M a1 a4
14 | M M b4 M M a62 a1 a1
15 | M b1 b1 M M M b1 a2 M a4
16 | M C42 b1 b2 b1 b1 b1 M M M
17 | M b1 b1 b1 b1 b1 b2 M C48 M
18 | M M b3 b2 b2 b1 b6 b2 b2 bG28 b1
19 | M M b3 b2 b2 M b2 b2 M b2
20 | M M M b3 b2 b3 b3 b2 b2 C50
21 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/HljfIQB33.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | |
2 | M M M M M M
3 | M M M M M
4 | M M M M M M M
5 | M M M
6 | M M M M M
7 | M M M M M
8 | M M M M
9 | M M M
10 | M M M M M M M
11 | M M M M M M
12 | M M M M
13 | M
14 | a2 a2 M M M M
15 | a2 M M M M M
16 | M a2 M M M
17 | C47 a2 a2 M M M M M
18 | a2 M a2 M M M M
19 | a2 a2 a2 M M
20 | a2 a2 a2 a2 a2 a2 M M M M M
21 | M M a2 aG3 a2 M M
22 | M M M a2 a2 a4 M M M M
23 | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/SymmetricTestMaps/even_playground_map_small_short_spawns__top_left_bot_right.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | |
2 | M C45 M
3 | M C29
4 | M M
5 | M M C41 M
6 | aG1 M M M
7 | M M M
8 | M M M M
9 | C39 M M M
10 | C43 M M M C43
11 | M M M C39
12 | M M M M
13 | M M M
14 | M M M bG1
15 | M C41 M M
16 | M M
17 | C29 M
18 | M C45 M
19 | | | | | | | | | | | | | | | |
20 | turn=383
21 | player_index=1
22 | aTiles=55
23 | aScore=148
24 | aStandingArmy=93
25 | aStars=55
26 | aCityCount=1
27 | aGeneral=13,1
28 | aKnowsKingLocation=True
29 | aDead=False
30 | aLeftGame=False
31 | aLeftGameTurn=-1
32 | bTiles=71
33 | bScore=159
34 | bStandingArmy=88
35 | bStars=57
36 | bCityCount=1
37 | bGeneral=6,13
38 | bKnowsKingLocation=False
39 | bDead=False
40 | bLeftGame=False
41 | bLeftGameTurn=-1
42 | bot_target_player=0
--------------------------------------------------------------------------------
/Tests/Defense/FailedToExecuteValidDefenseGather_Turn291/292.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | b2 b2 b2 b2 b1 b1 b1 b1 M M
3 | b2 b2 b2 M b2 b2 b1 b1 b1 M M M
4 | b2 b2 b2 b1 M b2 b2 b2 b3 b1 a2 M
5 | b1 b1 b1 b1 b1 b3 b1 b1 b1 a1 M
6 | M M M b1 b1 M b1 b5 a1 M M
7 | M b1 M M b3 M a1 M a1 M
8 | M C48 b1 b1 b1 b1 b1 b1 b24 a1 M M
9 | M M b3 b3 b2 b2 b6 M a2 M a1
10 | M M a1 a1 a1 b3 a1 M
11 | M M a1 a1 a1 b3 a1 M
12 | M M M a2 a1 a1 M a1 a1 C48
13 | M M M a2 a2 C45 M M a1 a4
14 | M M b4 M M a1 a1 a1
15 | M b1 b1 M M M b1 a63 M a4
16 | M C42 b1 b2 b1 b1 b1 M M M
17 | M b1 b1 b1 b1 b1 b2 M C48 M
18 | M M b3 b2 b2 b1 b6 b2 b2 bG29 b1
19 | M M b3 b2 b2 M b2 b2 M b2
20 | M M M b3 b2 b3 b3 b2 b2 C50
21 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/Defense/FailedToExecuteValidDefenseGather_Turn291/293.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | b2 b2 b2 b2 b1 b1 b1 b1 M M
3 | b2 b2 b2 M b2 b2 b1 b1 b1 M M M
4 | b2 b2 b2 b1 M b2 b2 b2 b3 b1 a2 M
5 | b1 b1 b1 b1 b1 b3 b1 b1 b1 a1 M
6 | M M M b1 b1 M b1 b5 a1 M M
7 | M b1 M M b3 M a1 M a1 M
8 | M C48 b1 b1 b1 b1 b1 b1 b24 a1 M M
9 | M M b3 b3 b2 b2 b6 M a2 M a1
10 | M M a1 a1 a1 b3 a1 M
11 | M M a1 a1 a1 b3 a1 M
12 | M M M a2 a1 a1 M a1 a1 C48
13 | M M M a2 a2 C45 M M a1 a4
14 | M M b4 M M a1 a1 a1
15 | M b1 b1 M M M a61 a1 M a4
16 | M C42 b1 b2 b1 b1 b1 M M M
17 | M b1 b1 b1 b1 b1 b2 M C48 M
18 | M M b3 b2 b2 b1 b6 b2 b2 bG29 b1
19 | M M b3 b2 b2 M b2 b2 M b2
20 | M M M b1 b4 b3 b3 b2 b2 C50
21 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/SlHhaQSh3.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M b2 bG3 b2 b2 b2 b2 M M
3 | M M b2 b2 M M M M
4 | C42 b2 b2 b2 M
5 | M M b2 b2 b2 b2 M M M
6 | M b2 C40 M b2 b2 b2 M M
7 | b2 b2 M M b2 b2 M M M M
8 | b2 M b2
9 | M M M M M M M
10 | M M M M M M
11 | M M
12 | M M M M M M
13 | M M M
14 | M M M M M M M
15 | M M M M M M
16 | M M M M M M
17 | M M M M M M
18 | M
19 | M M
20 | M M M M
21 | M M M M M M
22 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/HeHkLSS2h.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | | |
2 | M M M M
3 | M M M M M M
4 | M M
5 | M M M M M M M M
6 | M
7 | M M M M M M M
8 | M M M M M M
9 | M M M M M
10 | M M M M M M
11 | M M M M M M
12 | M M b2 M M M M M M
13 | M M b2 b2 M M M M b2 M
14 | b2 b2 b2 M b2
15 | M M b2 b2 M b2 M
16 | M M M M M b2 b2 b2 M
17 | M M M M b2 b2 b2 b2 b2 M M M
18 | M M M M b2 b2 b2 M M
19 | M M M b2 bG3 b2
20 | | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/rg80UIr22.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | |
2 | C50 aG5 M M M M
3 | M a2 M M M
4 | M M a2 a2 a2 M M
5 | M a2 a2 a2 a2 M M M M M
6 | M a2 a2 a2 a2 a2 M M
7 | M a2 M a2 M M M M
8 | a2 M M M
9 | M M M a2 M M M
10 | M M a2 M M M M M
11 | a2 M M M M M
12 | M M a2 M M M M M M
13 | a2 a2 M M M M M
14 | M M M M M M
15 | M M M
16 | M M M M M M
17 | M M M M
18 | M M M M M M M M
19 | M M M M M M M M
20 | M M
21 | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/BezNrON2n.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | |
2 | M M M M
3 | M M
4 | M
5 | M M M
6 | M M M M M M
7 | M M M M M M
8 | M M M M M M
9 | M M M M M
10 | M M M M M
11 | M M M
12 | M M M M M M
13 | M M M M M M M
14 | M M M M M
15 | M M M M
16 | M M M b2
17 | M C49 b2 M M
18 | b2 b2 M M M M b2 M M
19 | b2 b2 M M b2 b2 M M M M M
20 | b2 b2 M b2 b2 b2 b2 M M M M
21 | b2 M b4 b2 b2 M M M M M
22 | b2 b2 bG3 b2 C40 M M M M
23 | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/BgJTiGrhh.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | | |
2 | C45 M M M M
3 | M M a2 a2 aG3 a2 a2 a2 M
4 | M M a2 a2 a2 a2 a2 M M
5 | M M M a2 M a2 M M
6 | M M a2 a2 M M
7 | M a2 a2 M M
8 | M M M a2 a2 M M
9 | M M M M M a2 M M M M
10 | M a2 a2 M M M M
11 | M M a2 M M
12 | M a2 M M
13 | M M M M a2 M M
14 | M M M M M
15 | M M M M
16 | M
17 | M M M M M
18 | M M M
19 | M M M
20 | M M M
21 | M M M M M M
22 | | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/Hej7Uy7hh.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | |
2 | M M M M
3 | M M M M M M
4 | M M
5 | M
6 | M M M M
7 | M
8 | M M M M
9 | M M M M
10 | M M M M
11 | M M M M M
12 | M M M M M M
13 | M b2 M M
14 | M b2 M b2 b2
15 | M M b2 b2 b2 b2 b2 b2 b2 b2 M M
16 | b2 b2 b2 b2 C41 b2 b2 M M M M
17 | M b2 bG3 b2 b2 b2 b2 M M M M
18 | M b2 M M
19 | M M
20 | M M M M M
21 | M M M M M M
22 | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/SgUaZNrhn.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M M M M
3 | M
4 | M M M M M M M
5 | M M M M M
6 | M M M M
7 | M M M M
8 | M M M M M M
9 | M M M M M
10 | M M M
11 | M M M M M M M
12 | M M M M M M M
13 | M
14 | M M M C48 M
15 | M a2 a2 M
16 | M M M a2 a2 M
17 | M M a2 M M M M M
18 | M a2 M a2 a2 M M
19 | M M M a2 a2 M a2 a2 a2 M M M
20 | M M a2 a2 a2 a2 a2 M M M
21 | M M M a2 a2 a2 a2 M
22 | M M M aG3 a2 a2 M M
23 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/reWN0_N3n.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | | |
2 | M M M M M
3 | M M M
4 | M M M M M M
5 | M M M M M M
6 | M M M M
7 | M M C46 a2 a2 a2 a2 a2
8 | M a2 M M M M
9 | a2 M M M M
10 | M a2 M M M
11 | M a2 M M
12 | a2 a2 M M
13 | M M a2 a2 M M M
14 | M M M a2 a2 M M
15 | a2 aG3 M M
16 | M a2 a2 M M M M M
17 | a2 a2 C50 a2 M M M
18 | M M a2 a2 a2 M M
19 | M M M M M M M M M M
20 | M M M M M
21 | | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/SggmLNS23.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | | | |
2 | M M M M M
3 | M M M M
4 | M M M M C44 b2 b2 M
5 | M M M M M b2 b2 b2 b2 b2 b2 b2 bG3 b2
6 | M M b2 C50 b2 M M b2 b2
7 | b2 M M M b2 M M b2 M
8 | M M b2 b2 b2 b2 b2 b2
9 | M M M b2 M M M
10 | M M M M
11 | M M M M M
12 | M M M
13 | M M M M M M
14 | M M M
15 | M M M M M M M
16 | M M M M M M M
17 | M M M M M
18 | M M M M
19 | M M
20 | M M M
21 | | | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/BlTlBXHhh.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | | | |
2 | M M M
3 | a2 a2 a2 aG3 M M M M
4 | a2 a2 a2 a2 a3 M M M M M M M
5 | M a2 a2 M M M M M M
6 | a2 a2 a2 a2 M M M
7 | a2 a2 M M M M
8 | M a2 M M a2 M M M
9 | M a2 a2 a2 M M M M M M
10 | a2 a2 M
11 | M M M M M M M
12 | M
13 | M M M M M M M M
14 | M M M M
15 | M
16 | M M M M
17 | M M M M M M M M M
18 | M M M M M
19 | M M M M M
20 | M M M M
21 | | | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/HxHtxSH33.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | |
2 | M M M M M
3 | M M M M M M M
4 | M M M
5 | M M
6 | M M M M M M
7 | M M M M
8 | M M M M M M M
9 | M M M M M
10 | M M M M M M M M
11 | M M M M M
12 | M M M c2 c2 c2 c2 c2 c2 M
13 | M M c2 c2 c2 M c2 c2 c2 c2 c2 c2 cG3 c2
14 | M M M c2 c2 c2 c2 c2 c2 c2 c2
15 | M M M M M M M
16 | M M M
17 | M M M M
18 | M M M M
19 | M M M M M M
20 | M M M
21 | | | | | | | | | | | | | | | | | | | |
22 | gTiles=13
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/SgHhXISh3.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | | |
2 | M M M M M M M
3 | M M M M M M M M M M
4 | M M M M
5 | M M M M M M M
6 | M M M M M M
7 | M
8 | M M M
9 | C49 M M
10 | a2 a2 a2 a2 M M M M M
11 | a2 a2 a2 a2 M M C46 M M M M M
12 | a2 M a2 a2 a2 a2 a2 a2 a2
13 | a2 a2 a2 a2 a2 a2 M M M M M
14 | aG5 M M M M M
15 | M M M M M
16 | M M
17 | M M M M M M
18 | M M M M M
19 | M M M M M
20 | M M
21 | | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/Hx93YGrhh.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | | | |
2 | M M M M M
3 | M M M M M M M M M
4 | M M
5 | M M M M M M
6 | M M M
7 | M M M M M
8 | M M M M M M
9 | M M M M
10 | M M M M M M M
11 | M b2 M M
12 | b2 b2 M M M M M M
13 | M M b2 b2 M M M M
14 | M b2 M M M b2 b2 M M
15 | M M b2 b2 b2 M M M b2 M M M M
16 | M M M M b2 M b4 M b2 M M
17 | M M M b2 b2 b2 b2 b2 M
18 | M M M M bG3 b2 M
19 | M M b2 M
20 | | | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/SexP7Xrnh.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M M a2 a2 a2 M
3 | M a2 a2 a2 a2 a2 M M M M
4 | M aG3 a2 a2 a2 a2 M M M M
5 | M M a2 C46 a2 M M
6 | M M M M a2 a2 a2 M a2 M
7 | M M M C48 M M a2 M M
8 | M M M a2 a2 a2 a2 M M
9 | M M a2 M M
10 | M M M M
11 | M M M M M
12 | M M M M M M
13 | M M M M M
14 | M M M M
15 | M M M
16 | M M M
17 | M M
18 | M M M M M M M
19 | M M M M M M
20 | M M M
21 | M M
22 | M M M M
23 | M M M M M
24 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/Sx5edQSh3.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | |
2 | M M M M
3 | M M M M M
4 | M M M M M M
5 | M
6 | M M M M
7 | M M M M M M
8 | M M M M
9 | M M b2 M M M
10 | M M b2 b2 M
11 | M M M M M b2 M M
12 | M M M M M M b2 M M
13 | M M M b2
14 | M b2 M M M M M
15 | M M M b2 M M
16 | M M b2 M M
17 | M M M C44 b2 C43 b2 b2 b2 b2 M
18 | M M M M b2 M b2 b2 b2 M
19 | M M C42 b2 M b2 b2
20 | M M b2 b2 bG3 b2 M M
21 | M M M
22 | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/rxH5fSrnn.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | | |
2 | M M
3 | M M M
4 | M M M M M M
5 | M M
6 | M M M M
7 | M M M M
8 | M M M M M
9 | M M M M
10 | M M M M
11 | M M M M M M
12 | M M M M M M a2 M
13 | M M M M M a2 M
14 | M M M a2 a2 M
15 | M M M a2 a2 a2
16 | M M M M a2 a2 a2
17 | M M C45 a2 a2 a2 M aG4 C49
18 | M a2 M a2 M M M a2 M
19 | M M M a2 a2 a2 a2 M a2
20 | M M M M M M a2
21 | M a2
22 | | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/rxndAk7nh.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M M
3 | M M M M M M
4 | M M M M
5 | M M M M
6 | M M M M M
7 | M M M
8 | M M M
9 | M M M M M M
10 | M M M M M M
11 | M M M M
12 | M M M M M M
13 | M M M
14 | M M M M M M M
15 | b2 b2 b2 b2 b2 M M M
16 | b2 b2 M M b2 b2 M M M M
17 | b2 M M M M M M M M
18 | M b2 b2 b2 C47 M M
19 | M b2 M b2 b2 M
20 | b2 bG5 M M M M
21 | b2 C48 b2 M M M
22 | b2 b2 b2 M M M M M M
23 | M M M M M M M
24 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/HeSDjQS3h.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M M M M M
3 | M M M M
4 | M M M M M
5 | M M M M
6 | M M M M M M M M
7 | M M M M M
8 | M M M
9 | M M M
10 | M M M
11 | M M M M b2 M M
12 | M M b2 C41 M
13 | M M b2 M M M M M
14 | M b2 b2 M M M M M M
15 | M M M b2 M M C44 M M M
16 | b2 M M b2 M M M M M
17 | b2 b2 b2 b2 b2 M M
18 | M M b2 b2 M
19 | M M b2 b2 b2 M M
20 | M b2 bG3 b2 b2 M M
21 | M b3 b2 M M M M
22 | M M M M M
23 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/rgvtA4Bh2.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M M M
3 | M M M M
4 | M M M
5 | M M b2 b2
6 | M M M M b2 bG3 b2
7 | M M M b2 b2 b2
8 | M M b2 b2 b2
9 | b2 b2 M M
10 | M M M M b2 b2 M M M
11 | M M M b2 b2 M
12 | M M M M b2 b2 b2 M
13 | M M M C48 b2 M
14 | M M M M b2 M
15 | M M M b2 M
16 | M M M M M b2
17 | M b2
18 | M M M M C48
19 | M M M
20 | M M M
21 | M M M
22 | M M M M
23 | M M M M M
24 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/produced_invalid_plan_01.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M M M M M
3 | M M M M M
4 | M
5 | M M M M M M M
6 | M M M M M M
7 | M M M
8 | M M
9 | M M M M M
10 | M M M M
11 | M M M M
12 | M M M M M M M
13 | M M M M M M
14 | M M M M M
15 | M
16 | M M M M M M M
17 | M M M M M M
18 | M M M M M
19 | M M M
20 | M aG1
21 | M M M
22 | M M M M M M M M M M M
23 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/BxfoIQB3h.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | | |
2 | M M M M M M
3 | M M M M
4 | M M M M M
5 | M M M
6 | M M M M M
7 | M M M M M M M M M
8 | M M M M M M
9 | M M b2
10 | M M M b2 b2 b2 b2 b2 b2 b2 b2
11 | b2 b2 b2 M
12 | M b2 b2 b2 b2 b2 b2 b2 M M
13 | M M M M C43 b2 C48 M M
14 | M M b2 b2 b2 bG3 b2 M
15 | M M M M M
16 | M M M M M
17 | M M M M M
18 | M M M M
19 | M M M M M M M
20 | | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/SxfUErHn2.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | |
2 | M M M M M M
3 | M M M M M M M M M
4 | M M M M M b2 M M
5 | M M M M b2 bG3 M
6 | M M M b2 b2 b2 b2 M
7 | M M C48 b2 b2 b2 b2
8 | M M b2 b2 b2
9 | M M M M M M b2 b2 b2 b2
10 | M M M M M M M b2 b2 M
11 | M M M M M M b2
12 | M M M b2
13 | M M M b2 b2 M
14 | M M M M b2 M
15 | M M M M
16 | M M M M M
17 | M M M
18 | M M M M
19 | M M
20 | M M M M
21 | M M M M
22 | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/rxqO5BHn3.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | | |
2 | M M M M
3 | M M M M M M M
4 | M M M M C48 b2 b2
5 | M M C49 M b2 b2 b2 b2 b2 bG3 M
6 | M M b2 b2 b2 b2 b2 b2 b2 M b2 b2 b2
7 | M M C41 M M b2 M M b2
8 | M M M M M M b2 b2 b2
9 | M M M b2 b2 M
10 | M M M M M M M
11 | M M M M M
12 | M M M M M M
13 | M M M M M M M
14 | M
15 | M M M M
16 | M M M M M
17 | M M M M
18 | M M M M M M M
19 | M M M M M M
20 | | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/BxWpRtqa3.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M M M M M M M
3 | M M M M
4 | M M M M M M M M M
5 | M M M M
6 | M M M M C43 M M M
7 | M M M M a2
8 | C50 a2 M a2 a2 a2 a2
9 | a2 a2 a2 M M a2 M M
10 | M a2 a2 M C41 a2
11 | M a2 a2 M M a2 C46 M M M M M
12 | M a2 a2 a2 a2 a2 a2
13 | M M aG5 C48 M M M
14 | M M M M M M
15 | M M
16 | M M M
17 | M M M M
18 | M M
19 | M M M
20 | | | | | | | | | | | | | | | | | | |
21 | targetPlayerExpectedGeneralLocation=14,5
22 | turn=50
23 | player_index=0
24 | aTiles=23
25 | aScore=49
26 | aStandingArmy=26
27 | aStars=54
28 | aCityCount=1
29 | aGeneral=4,11
30 | aKnowsKingLocation=False
31 | aDead=False
32 | aLeftGame=False
33 | aLeftGameTurn=-1
34 | bTiles=22
35 | bScore=48
36 | bStandingArmy=26
37 | bStars=51
38 | bCityCount=1
39 | bKnowsKingLocation=False
40 | bDead=False
41 | bLeftGame=False
42 | bLeftGameTurn=-1
43 | bot_target_player=-1
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/SgnskXHn2.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M M
3 | M M M M
4 | M M M M M M
5 | M M M M M M
6 | M M M M M
7 | M M M M M
8 | b2 M M
9 | b2 M b2 b2 b2 M M
10 | b2 M b2 b2 b2 M C40 M M M
11 | M M b2 b2 b2 M b2 b2 b2 M
12 | M M C41 b2 bG3 b2 M b2 b2 b2 M M
13 | M M C48 b2 b2 M C43 b2 b2 M M M
14 | M M M M
15 | M M M M
16 | M M M M
17 | M M M M
18 | M M M M
19 | M M M M M M M
20 | M M M M M M
21 | M
22 | M M M M
23 | M
24 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/Defense/FailedToFindPlannedDefensePathForNoReason_Turn243/242.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M
3 | M M M b1 b1 M M
4 | M M b1 M M M M M
5 | b1 b2 M b1 M
6 | C48 M b1 b1 b1 b1 M
7 | b1 b1 b1 b2 b2 b3 b1 b3 b1 M M M
8 | b1 b1 b1 M b2 b2 b4 b2 b1 b2 M M
9 | C42 M M b1 b2 b1 b2 C41 M M
10 | M C48 M b10 b1 b1 bG15 b1 b2 b2 b2 M M
11 | M b1 b1 b1 b2 b1 b1 M b1 b1 b2 b2
12 | M M M b1 a33 b2 b1 b1 M b2 M
13 | M M b3 b1 a1 b5 b1 b1 M M M
14 | a1 a1 C41 C45 a1 M a1 b2 M M
15 | M a1 b2 a2 a1 a1 a1 a1 b1 b1 M M M
16 | a1 M b2 a0 b2 C43 M a2 a1
17 | M a1 a2 a1 M a1 N3 M M M
18 | a2 a3 a1 a1 a1 M M M M
19 | a2 a3 a3 a3 a3 M M M
20 | C41 a3 a3 a3 M
21 | M
22 | | | | | | | | | | | | | | | | | | |
23 | targetPlayerExpectedGeneralLocation=3,18
24 | bScore=123
25 | aScore=116
26 | bTiles=66
27 | aTiles=61
28 | bCityCount=1
29 | aCityCount=1
30 | bot_target_player=0
31 | player_index=1
--------------------------------------------------------------------------------
/Tests/Defense/FailedToFindPlannedDefensePathForNoReason_Turn243/243.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | M M
3 | M M M b1 b1 M M
4 | M M b1 M M M M M
5 | b1 b2 M b1 M
6 | C48 M b1 b1 b1 b1 M
7 | b1 b1 b1 b2 b2 b3 b1 b3 b1 M M M
8 | b1 b1 b1 M b2 b2 b4 b2 b1 b2 M M
9 | C42 M M b1 b2 b1 b2 C41 M M
10 | M C48 M b11 b1 b1 bG15 b1 b2 b2 b2 M M
11 | M b1 b1 b1 b1 a31 b1 M b1 b1 b2 b2
12 | M M M b1 a1 b2 b1 b1 M b2 M
13 | M M b3 b1 a1 b5 b1 b1 M M M
14 | a1 a1 C41 C45 a1 M a1 b2 M M
15 | M a1 b2 a2 a1 a1 a1 a1 b1 b1 M M M
16 | a1 M b2 a0 b2 C43 M a2 a1
17 | M a1 a2 a1 M a1 N3 M M M
18 | a2 a3 a1 a1 a1 M M M M
19 | aG1 a2 a3 a3 a3 a3 M M M
20 | M a3 a3 a3 M
21 | M
22 | | | | | | | | | | | | | | | | | | |
23 | targetPlayerExpectedGeneralLocation=3,18
24 | bScore=123
25 | aScore=116
26 | bTiles=66
27 | aTiles=61
28 | bCityCount=1
29 | aCityCount=1
30 | bot_target_player=0
31 | player_index=1
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/HxpebyX32.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | | | |
2 | M M M
3 | M M M M
4 | M M M M M
5 | M M M M M M
6 | M M M
7 | M M M M
8 | M M M M M M M
9 | M M M M M M
10 | M M M M M M M C45
11 | M M M M a2 a2 a2 a2 a2 M a2 a2 a2 a2
12 | M M a2 M M a2 a2 a2 a2 a2 aG3
13 | M C43 a2 M M a2 a2 a2
14 | M a2 a2 a2 a2 C40 M M
15 | M M M M a2 M
16 | M M M M M M M M
17 | M M M M M
18 | M M M M M
19 | M M M M
20 | | | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/rgK-zXr3h.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | | |
2 | M M M M M M M
3 | M M M M
4 | M M M M M
5 | M M M
6 | M M M M
7 | M M M M b2 b2 M
8 | M M M M b2 b2 b2 M
9 | M M M M M M b2 b2 b2 b2 bG4
10 | M M M C46 b2 b2 b2 b2 M b2
11 | b2 b2 b2 b2 M b2 b2 b2 b2 b2
12 | M M M M C49 M C43
13 | M M M M M
14 | M M
15 | M M M M M M M
16 | M M M M M M M
17 | M M M M M M
18 | M M M
19 | M M M M M
20 | | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/refiPJQ2n.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | |
2 | M M M
3 | M M M M
4 | M M M M M
5 | M M M M M
6 | M M M M M
7 | M M M M M M b2 b2 M
8 | M M M M M M b2 b2 M
9 | M M b2 M
10 | M M M M M b2
11 | M bG5 b2 M
12 | M M M M M b2 b2
13 | M M b2 b2 b2 b2 b2 b2 b2 M
14 | M b2 b2 b2 b2 M M b2 M
15 | M M M b2
16 | M M M M
17 | M
18 | M M M M M M M M M
19 | M M M M
20 | M M
21 | M M M
22 | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/Hga27Jmnh.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | | | |
2 | M M M M M
3 | M M
4 | M M M
5 | M M M M
6 | M M M M M M M
7 | M M M M M M M
8 | M M M M M
9 | M M M M M M
10 | M M M M M M
11 | M M M M
12 | M b2 b2 b2 M
13 | M M b2 b2 b2 b2 M M M
14 | M b2 M
15 | M M M M M M b2
16 | M M M M b2 b2 M M
17 | M M b2 b2 b2 b2 C46 M
18 | M M M M b2 b2 b2 b2 b2 M M
19 | M M b2 b2 b2 bG4 M M M
20 | | | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/HlGJ04Bh3.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | | | | |
2 | M M a2 a2 M M M
3 | M a2 aG3 M M M
4 | M M M a2 a2 a2 a2 a2 M M
5 | M M a2 a2 M M M M M
6 | M M M M a2 a2 a2 a2 a2 a2 a2 M
7 | M M a2 a2 M M a2
8 | M a2 M M M a2 a2 M M
9 | M M a2 M
10 | M M M M M M M M M
11 | M M M M M
12 | M M M M M M M M
13 | M M
14 | M M M M M M
15 | M M M M M
16 | M M M
17 | M M M M M M M M M
18 | M M M M
19 | M M M M
20 | | | | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/SlcYAHr33.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | |
2 | M M M M M
3 | M M M M
4 | M M M
5 | M M M
6 | M M M M M
7 | M M M M
8 | M M M M M M M M M
9 | M b2 b2 b2 b2 M M
10 | M b2 b2 b2 M M
11 | M M M M b2 b2 b2 b2 M b2
12 | M M M b2 b2 b2 b2
13 | M M M b2 bG4 b2
14 | M M M M M b2
15 | M M C49 b2
16 | M M M M M b2 b2
17 | M M M M b2
18 | M M M
19 | M M M M M M M
20 | M M M M M
21 | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/SxLhzIS3n.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | | |
2 | M M M M M M
3 | M M M M M M
4 | M M M M M M
5 | M M M
6 | M b2 M M
7 | M M b2 M M M M
8 | M b2 b2 M M M M b2 b2
9 | M M M M M b2 M b2 b2 M b2 M M
10 | M b2 b2 b2 b2 b2 b2 b2 M
11 | M M b2 b2 b2 b2 b2 b2 bG4 M M
12 | C44 M M
13 | M M M M M M
14 | M M M M M M M M M
15 | M M M
16 | M M M M M M M M M M
17 | M M M M M
18 | M M M M M M
19 | M M M M
20 | M M M
21 | | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/rgMWP8Hhn.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | | | | | |
2 | M M M
3 | M M M M M M M
4 | M M M M M M M M M
5 | M M M M
6 | M M M M M M
7 | M M M M M
8 | M M M M M
9 | M M M M M M M
10 | M M M M M
11 | M M M M M
12 | M M M M M M M M M
13 | M M M M M M M M
14 | M M M M b2 C49 M
15 | M M M M b2 b2 C44 M b2
16 | M M b2 b2 M M b2 C44 b2 b2
17 | M M b2 b3 C47 M b2 b2 b2 M
18 | M b2 bG3 b2 b2 b2 b2 b2 b2 b2 b2 M M
19 | M M M M M M
20 | | | | | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------
/Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/BeaCFkX3h.txtmap:
--------------------------------------------------------------------------------
1 | | | | | | | | | | | | | | | | | | |
2 | a2 a2 a2 M a2 M
3 | M M M a2 a2 a2 a2 a2 a2 C43 M
4 | M M M M a2 a2 a2 a2 aG3 M M
5 | M M a2 a2 a2 a2 M a2 C48 M M
6 | M a2 M a2 a2 M
7 | M a2 M a2 M
8 | M M C42 M M M
9 | M M M
10 | M M
11 | M M M M
12 | M M
13 | M M M
14 | M M M M M
15 | M M M M M M
16 | M M M
17 | M M M M M
18 | M M M
19 | M M M M M
20 | M M M M
21 | M M M
22 | M
23 | M M M M
24 | | | | | | | | | | | | | | | | | | |
--------------------------------------------------------------------------------