Spaces:
Configuration error
Configuration error
EZTIME2025 commited on
Commit ·
f69033f
1
Parent(s): 21fb2c3
testing prompts
Browse files- .vscode/settings.json +4 -0
- examples/ai_testing/WEB_VIEWER_README.md +83 -0
- examples/ai_testing/generate_prompts_from_state.py +39 -3
- examples/ai_testing/my_games/ai_logs/session_20260104_011246/agent_memories.json +4 -0
- examples/ai_testing/my_games/ai_logs/session_20260104_011246/player_digeo.md +496 -0
- examples/ai_testing/my_games/ai_logs/session_20260104_011246/player_hadar.md +485 -0
- examples/ai_testing/my_games/ai_logs/session_20260104_011246/player_shon.md +359 -0
- examples/ai_testing/my_games/{prompts/prompt_player_b.json → ai_logs/session_20260104_011246/prompts/prompt_player_digeo.json} +4 -4
- examples/ai_testing/my_games/{prompts/prompt_player_c.txt → ai_logs/session_20260104_011246/prompts/prompt_player_digeo.txt} +6 -6
- examples/ai_testing/my_games/{prompts/prompt_player_c.json → ai_logs/session_20260104_011246/prompts/prompt_player_hadar.json} +4 -4
- examples/ai_testing/my_games/{prompts/prompt_player_b.txt → ai_logs/session_20260104_011246/prompts/prompt_player_hadar.txt} +6 -6
- examples/ai_testing/my_games/{prompts/prompt_player_a.json → ai_logs/session_20260104_011246/prompts/prompt_player_shon.json} +7 -8
- examples/ai_testing/my_games/{prompts/prompt_player_a.txt → ai_logs/session_20260104_011246/prompts/prompt_player_shon.txt} +9 -10
- examples/ai_testing/my_games/current_session.txt +1 -0
- examples/ai_testing/my_games/current_state.json +19 -12
- examples/ai_testing/my_games/current_state_optimized.txt +3 -3
- examples/ai_testing/my_games/game_20260103_220835_final.json +0 -890
- examples/ai_testing/my_games/game_20260103_220835_final_optimized.txt +0 -25
- examples/ai_testing/my_games/game_20260103_220835_full.json +0 -2664
- examples/ai_testing/my_games/game_20260103_220835_full_optimized.txt +0 -1965
- examples/ai_testing/my_games/prompts/a +0 -106
- examples/ai_testing/play_with_prompts.py +6 -0
- examples/ai_testing/sample_states/captured_game.json +7 -13
- examples/ai_testing/sample_states/captured_game_optimized.json +0 -7
- examples/ai_testing/sample_states/captured_game_optimized.txt +3 -3
- examples/ai_testing/templates/viewer.html +642 -0
- examples/ai_testing/test_ai_live.py +541 -0
- examples/ai_testing/web_viewer.py +182 -0
- install_web_viewer.bat +12 -0
- pycatan/ai/llm_client.py +349 -0
- start.bat +42 -0
- temp_viz_console.py +1 -1
.vscode/settings.json
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"python-envs.defaultEnvManager": "ms-python.python:system",
|
| 3 |
+
"python-envs.pythonProjects": []
|
| 4 |
+
}
|
examples/ai_testing/WEB_VIEWER_README.md
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# AI Game Web Viewer
|
| 2 |
+
|
| 3 |
+
Real-time web interface for monitoring AI agents playing Catan.
|
| 4 |
+
|
| 5 |
+
## 🌐 Features
|
| 6 |
+
|
| 7 |
+
- **Real-time updates** - Refreshes every second
|
| 8 |
+
- **Player logs** - View each AI agent's thinking and responses
|
| 9 |
+
- **Chat history** - See all player communications
|
| 10 |
+
- **Agent memories** - Monitor what each AI remembers
|
| 11 |
+
- **Session management** - Track multiple game sessions
|
| 12 |
+
- **Clean UI** - Dark theme, easy navigation
|
| 13 |
+
|
| 14 |
+
## 🚀 Quick Start
|
| 15 |
+
|
| 16 |
+
### Automatic (Recommended)
|
| 17 |
+
```bash
|
| 18 |
+
start.bat
|
| 19 |
+
```
|
| 20 |
+
This will automatically open:
|
| 21 |
+
1. AI Tester window
|
| 22 |
+
2. Web Viewer at http://localhost:5000
|
| 23 |
+
3. Game console
|
| 24 |
+
|
| 25 |
+
### Manual
|
| 26 |
+
```bash
|
| 27 |
+
# Terminal 1: Start web viewer
|
| 28 |
+
python examples/ai_testing/web_viewer.py
|
| 29 |
+
|
| 30 |
+
# Terminal 2: Start AI tester
|
| 31 |
+
python examples/ai_testing/test_ai_live.py
|
| 32 |
+
|
| 33 |
+
# Terminal 3: Start game
|
| 34 |
+
python examples/ai_testing/play_with_prompts.py
|
| 35 |
+
```
|
| 36 |
+
|
| 37 |
+
Then open http://localhost:5000 in your browser.
|
| 38 |
+
|
| 39 |
+
## 📦 Requirements
|
| 40 |
+
|
| 41 |
+
```bash
|
| 42 |
+
pip install flask markdown
|
| 43 |
+
```
|
| 44 |
+
|
| 45 |
+
## 🎨 Interface
|
| 46 |
+
|
| 47 |
+
### Sidebar Navigation
|
| 48 |
+
- **Players** - Click to view individual AI agent logs
|
| 49 |
+
- **Chat History** - See all player messages
|
| 50 |
+
- **Agent Memories** - View saved notes
|
| 51 |
+
- **Session Info** - Current session details
|
| 52 |
+
|
| 53 |
+
### Main Content Area
|
| 54 |
+
- Updates automatically every second
|
| 55 |
+
- Shows player logs in formatted markdown
|
| 56 |
+
- Chat messages with timestamps
|
| 57 |
+
- Agent memories organized by player
|
| 58 |
+
|
| 59 |
+
## 🔄 How It Works
|
| 60 |
+
|
| 61 |
+
1. `web_viewer.py` reads from the current session directory
|
| 62 |
+
2. Loads `chat_history.json`, `agent_memories.json`, and `player_*.md` files
|
| 63 |
+
3. Updates the web interface every second via AJAX
|
| 64 |
+
4. No need to refresh - everything updates automatically
|
| 65 |
+
|
| 66 |
+
## 📁 Data Sources
|
| 67 |
+
|
| 68 |
+
All data is read from:
|
| 69 |
+
```
|
| 70 |
+
examples/ai_testing/my_games/ai_logs/session_YYYYMMDD_HHMMSS/
|
| 71 |
+
├── player_a.md # AI logs
|
| 72 |
+
├── player_b.md
|
| 73 |
+
├── player_c.md
|
| 74 |
+
├── chat_history.json # Chat messages
|
| 75 |
+
└── agent_memories.json # AI memories
|
| 76 |
+
```
|
| 77 |
+
|
| 78 |
+
## 🎯 Tips
|
| 79 |
+
|
| 80 |
+
- Leave the viewer open while playing
|
| 81 |
+
- Switch between players to see different strategies
|
| 82 |
+
- Monitor chat for negotiations
|
| 83 |
+
- Check memories to understand AI planning
|
examples/ai_testing/generate_prompts_from_state.py
CHANGED
|
@@ -71,6 +71,36 @@ def load_full_state():
|
|
| 71 |
return None
|
| 72 |
|
| 73 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 74 |
def generate_what_happened_message(full_state, optimized_state, current_player, for_spectator=False):
|
| 75 |
"""
|
| 76 |
Generate a contextual message about what just happened in the game.
|
|
@@ -510,9 +540,15 @@ def main():
|
|
| 510 |
config = AIConfig()
|
| 511 |
prompt_manager = PromptManager(config)
|
| 512 |
|
| 513 |
-
#
|
| 514 |
-
|
| 515 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 516 |
|
| 517 |
print("📝 Generating prompts for each player...\n")
|
| 518 |
|
|
|
|
| 71 |
return None
|
| 72 |
|
| 73 |
|
| 74 |
+
def get_current_session_dir():
|
| 75 |
+
"""
|
| 76 |
+
Get the current active session directory.
|
| 77 |
+
|
| 78 |
+
Returns:
|
| 79 |
+
Path object to session directory, or None if not found
|
| 80 |
+
"""
|
| 81 |
+
session_file = Path('examples/ai_testing/my_games/current_session.txt')
|
| 82 |
+
|
| 83 |
+
print(f" 🔍 Looking for session file: {session_file.absolute()}")
|
| 84 |
+
|
| 85 |
+
if session_file.exists():
|
| 86 |
+
try:
|
| 87 |
+
with open(session_file, 'r', encoding='utf-8') as f:
|
| 88 |
+
session_path = f.read().strip()
|
| 89 |
+
session_dir = Path(session_path)
|
| 90 |
+
print(f" 📂 Found session path: {session_dir}")
|
| 91 |
+
if session_dir.exists():
|
| 92 |
+
print(f" ✅ Session directory exists!")
|
| 93 |
+
return session_dir
|
| 94 |
+
else:
|
| 95 |
+
print(f" ⚠️ Session directory doesn't exist yet")
|
| 96 |
+
except Exception as e:
|
| 97 |
+
print(f"⚠️ Error reading session file: {e}")
|
| 98 |
+
else:
|
| 99 |
+
print(f" ⚠️ Session file not found")
|
| 100 |
+
|
| 101 |
+
return None
|
| 102 |
+
|
| 103 |
+
|
| 104 |
def generate_what_happened_message(full_state, optimized_state, current_player, for_spectator=False):
|
| 105 |
"""
|
| 106 |
Generate a contextual message about what just happened in the game.
|
|
|
|
| 540 |
config = AIConfig()
|
| 541 |
prompt_manager = PromptManager(config)
|
| 542 |
|
| 543 |
+
# Get current session directory and create prompts subdirectory
|
| 544 |
+
session_dir = get_current_session_dir()
|
| 545 |
+
if session_dir:
|
| 546 |
+
output_dir = session_dir / 'prompts'
|
| 547 |
+
output_dir.mkdir(exist_ok=True, parents=True)
|
| 548 |
+
else:
|
| 549 |
+
# Fallback to old location if no session
|
| 550 |
+
output_dir = Path('examples/ai_testing/my_games/prompts')
|
| 551 |
+
output_dir.mkdir(exist_ok=True, parents=True)
|
| 552 |
|
| 553 |
print("📝 Generating prompts for each player...\n")
|
| 554 |
|
examples/ai_testing/my_games/ai_logs/session_20260104_011246/agent_memories.json
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"digeo": "Prioritize nodes with W/B/Wh/S/O and high-probability numbers (6,8,5,9). Evaluate remaining options after shon's placement.",
|
| 3 |
+
"hadar": "My first settlement is at Node 10 (B6, S8, W12). I am waiting for other players to complete their setup moves."
|
| 4 |
+
}
|
examples/ai_testing/my_games/ai_logs/session_20260104_011246/player_digeo.md
ADDED
|
@@ -0,0 +1,496 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# 🤖 AI Agent Log - Player DIGEO
|
| 2 |
+
|
| 3 |
+
---
|
| 4 |
+
|
| 5 |
+
**Session:** `session_20260104_011246`
|
| 6 |
+
|
| 7 |
+
**Model:** `models/gemini-2.5-flash`
|
| 8 |
+
|
| 9 |
+
**Started:** 2026-01-04 01:13:02
|
| 10 |
+
|
| 11 |
+
---
|
| 12 |
+
|
| 13 |
+
|
| 14 |
+
## 🔄 Request #1
|
| 15 |
+
|
| 16 |
+
**Timestamp:** 2026-01-04 01:13:02
|
| 17 |
+
|
| 18 |
+
|
| 19 |
+
<details>
|
| 20 |
+
<summary><strong>📋 Expected Response Schema</strong></summary>
|
| 21 |
+
|
| 22 |
+
```json
|
| 23 |
+
{
|
| 24 |
+
"type": "object",
|
| 25 |
+
"required": [
|
| 26 |
+
"internal_thinking"
|
| 27 |
+
],
|
| 28 |
+
"properties": {
|
| 29 |
+
"internal_thinking": {
|
| 30 |
+
"type": "string",
|
| 31 |
+
"description": "Track what's happening. What are opponents doing? What's your strategy for next turn?",
|
| 32 |
+
"minLength": 30
|
| 33 |
+
},
|
| 34 |
+
"note_to_self": {
|
| 35 |
+
"type": "string",
|
| 36 |
+
"description": "Important facts for when it's your turn. Use only if essential for clarity or direct user query. Omit otherwise.",
|
| 37 |
+
"maxLength": 100
|
| 38 |
+
},
|
| 39 |
+
"say_outloud": {
|
| 40 |
+
"type": "string",
|
| 41 |
+
"description": "Optional message to other players (max 100 chars). Propose trades or negotiate. You pay for this.",
|
| 42 |
+
"maxLength": 100
|
| 43 |
+
}
|
| 44 |
+
},
|
| 45 |
+
"propertyOrdering": [
|
| 46 |
+
"internal_thinking",
|
| 47 |
+
"note_to_self",
|
| 48 |
+
"say_outloud"
|
| 49 |
+
]
|
| 50 |
+
}
|
| 51 |
+
```
|
| 52 |
+
</details>
|
| 53 |
+
|
| 54 |
+
<details>
|
| 55 |
+
<summary><strong>📤 Prompt Sent to Gemini</strong></summary>
|
| 56 |
+
|
| 57 |
+
```json
|
| 58 |
+
{
|
| 59 |
+
"meta_data": {
|
| 60 |
+
"agent_name": "digeo",
|
| 61 |
+
"role": "You are player 'digeo'. Play strategically to win."
|
| 62 |
+
},
|
| 63 |
+
"task_context": {
|
| 64 |
+
"what_just_happened": "Player hadar is placing their first settlement.",
|
| 65 |
+
"instructions": "Analyze the game state and select the optimal move from 'allowed_actions'. If you wish to negotiate or wait for other players, select the 'wait_for_response' action."
|
| 66 |
+
},
|
| 67 |
+
"game_state": "\n 1. LOOKUP TABLES:\n • \"H\" (Hexes): Array where Index = HexID. Value = Resource+Num.\n Example: H[1]=\"W12\" -> Hex 1 is Wood 12.\n • \"N\" (Nodes): Array where Index = NodeID.\n Format: [ [Neighbors], [HexIDs], Port? ]\n Logic: To find yield of Node 10, check N[10]. Get HexIDs (e.g. [1,5]). Look up H[1] and H[5].\n\n2. CODES: W=Wood, B=Brick, S=Sheep, Wh=Wheat, O=Ore, D=Desert.\n ?3=Any 3:1 port, X2=Specific Resource 2:1 port.\n\n3. STATE: \"bld\"=[NodeID, Owner, Type], \"rds\"=[[From,To], Owner].\n\n4. PLAYERS: \"res\"={Resource:Count}, \"dev\"={\"h\":[Hidden Cards], \"r\":[Revealed] (K=Knight)}, \n \"stat\"=[\"LR\" (Longest Road), \"LA\" (Largest Army)].\n\n5. ROBBER: Located at HexID specified in \"meta.robber\". H[id] is blocked.\n\nJSON:\n{\"meta\":{\"curr\":\"hadar\",\"phase\":\"SETUP_FIRST_ROUND\",\"robber\":10,\"dice\":null},\"H\":[\"\",\"W12\",\"S5\",\"W4\",\"S8\",\"B6\",\"W3\",\"Wh8\",\"B10\",\"W11\",\"D\",\"O3\",\"S4\",\"B10\",\"Wh9\",\"Wh6\",\"S11\",\"O5\",\"Wh9\",\"O2\"],\"N\":[null,[[2,9],[1]],[[1,3],[1],\"Wh2\"],[[2,4,11],[2,1],\"Wh2\"],[[3,5],[2]],[[4,6,13],[3,2]],[[5,7],[3],\"B2\"],[[6,15],[3],\"B2\"],[[9,18],[4],\"?3\"],[[8,10,1],[4,1],\"?3\"],[[9,11,20],[5,4,1]],[[10,12,3],[5,2,1]],[[11,13,22],[6,5,2]],[[12,14,5],[6,3,2]],[[13,15,24],[7,6,3]],[[14,16,7],[7,3]],[[15,26],[7],\"O2\"],[[18,28],[8],\"S2\"],[[17,19,8],[8,4]],[[18,20,30],[9,8,4]],[[19,21,10],[9,5,4]],[[20,22,32],[10,9,5]],[[21,23,12],[10,6,5]],[[22,24,34],[11,10,6]],[[23,25,14],[11,7,6]],[[24,26,36],[12,11,7]],[[25,27,16],[12,7],\"O2\"],[[26,38],[12]],[[29,17],[8],\"S2\"],[[28,30,39],[13,8]],[[29,31,19],[13,9,8]],[[30,32,41],[14,13,9]],[[31,33,21],[14,10,9]],[[32,34,43],[15,14,10]],[[33,35,23],[15,11,10]],[[34,36,45],[16,15,11]],[[35,37,25],[16,12,11]],[[36,38,47],[16,12],\"?3\"],[[37,27],[12],\"?3\"],[[40,29],[13]],[[39,41,48],[17,13],\"W2\"],[[40,42,31],[17,14,13]],[[41,43,50],[18,17,14]],[[42,44,33],[18,15,14]],[[43,45,52],[19,18,15]],[[44,46,35],[19,16,15]],[[45,47,54],[19,16]],[[46,37],[16]],[[49,40],[17],\"W2\"],[[48,50],[17]],[[49,51,42],[18,17],\"?3\"],[[50,52],[18],\"?3\"],[[51,53,44],[19,18]],[[52,54],[19],\"?3\"],[[53,46],[19],\"?3\"]],\"state\":{\"bld\":[],\"rds\":[]},\"players\":{\"hadar\":{\"vp\":0,\"res\":{}},\"shon\":{\"vp\":0,\"res\":{}},\"digeo\":{\"vp\":0,\"res\":{}}}}"
|
| 68 |
+
}
|
| 69 |
+
```
|
| 70 |
+
</details>
|
| 71 |
+
|
| 72 |
+
|
| 73 |
+
### ✅ Response Received
|
| 74 |
+
|
| 75 |
+
- **Latency:** 14.56s
|
| 76 |
+
- **Tokens:** 891 (prompt: 688, completion: 203)
|
| 77 |
+
|
| 78 |
+
<details>
|
| 79 |
+
<summary><strong>📥 Raw Response from Gemini</strong></summary>
|
| 80 |
+
|
| 81 |
+
```json
|
| 82 |
+
{"internal_thinking": "Hadar is placing their first settlement. I need to anticipate their move to plan my own. The most attractive nodes for a first settlement offer a good mix of resources (Wood, Brick, Sheep, Wheat, Ore) and high-probability dice rolls (6, 8, 5, 9). Key contenders for Hadar are Node 20 (W11, B6, S8 - numbers 11,6,8) and Node 10 (B6, S8, W12 - numbers 6,8,12), both offering a strong W/B/S base. Other good options include Node 24 (O3, Wh8, W3 - numbers 3,8,3) and Node 25 (S4, O3, Wh8 - numbers 4,3,8) for early Ore/Wheat access. I expect Hadar to pick one of the W/B/S nodes with a 6 or 8. My strategy for my turn will be to secure a balanced resource production, ideally including Ore and Wheat with good numbers, or a strong W/B/S spot if the Ore/Wheat spots are taken by Hadar or Shon."}
|
| 83 |
+
```
|
| 84 |
+
</details>
|
| 85 |
+
|
| 86 |
+
|
| 87 |
+
### ✅ Parse Success
|
| 88 |
+
|
| 89 |
+
|
| 90 |
+
### 🎯 AI Response
|
| 91 |
+
|
| 92 |
+
#### 💭 Internal Thinking
|
| 93 |
+
|
| 94 |
+
> Hadar is placing their first settlement. I need to anticipate their move to plan my own. The most attractive nodes for a first settlement offer a good mix of resources (Wood, Brick, Sheep, Wheat, Ore) and high-probability dice rolls (6, 8, 5, 9). Key contenders for Hadar are Node 20 (W11, B6, S8 - numbers 11,6,8) and Node 10 (B6, S8, W12 - numbers 6,8,12), both offering a strong W/B/S base. Other good options include Node 24 (O3, Wh8, W3 - numbers 3,8,3) and Node 25 (S4, O3, Wh8 - numbers 4,3,8) for early Ore/Wheat access. I expect Hadar to pick one of the W/B/S nodes with a 6 or 8. My strategy for my turn will be to secure a balanced resource production, ideally including Ore and Wheat with good numbers, or a strong W/B/S spot if the Ore/Wheat spots are taken by Hadar or Shon.
|
| 95 |
+
|
| 96 |
+
|
| 97 |
+
<details>
|
| 98 |
+
<summary><strong>🔍 Raw JSON (Debug)</strong></summary>
|
| 99 |
+
|
| 100 |
+
```json
|
| 101 |
+
{
|
| 102 |
+
"internal_thinking": "Hadar is placing their first settlement. I need to anticipate their move to plan my own. The most attractive nodes for a first settlement offer a good mix of resources (Wood, Brick, Sheep, Wheat, Ore) and high-probability dice rolls (6, 8, 5, 9). Key contenders for Hadar are Node 20 (W11, B6, S8 - numbers 11,6,8) and Node 10 (B6, S8, W12 - numbers 6,8,12), both offering a strong W/B/S base. Other good options include Node 24 (O3, Wh8, W3 - numbers 3,8,3) and Node 25 (S4, O3, Wh8 - numbers 4,3,8) for early Ore/Wheat access. I expect Hadar to pick one of the W/B/S nodes with a 6 or 8. My strategy for my turn will be to secure a balanced resource production, ideally including Ore and Wheat with good numbers, or a strong W/B/S spot if the Ore/Wheat spots are taken by Hadar or Shon."
|
| 103 |
+
}
|
| 104 |
+
```
|
| 105 |
+
</details>
|
| 106 |
+
|
| 107 |
+
|
| 108 |
+
## 🔄 Request #2
|
| 109 |
+
|
| 110 |
+
**Timestamp:** 2026-01-04 01:13:51
|
| 111 |
+
|
| 112 |
+
|
| 113 |
+
<details>
|
| 114 |
+
<summary><strong>📋 Expected Response Schema</strong></summary>
|
| 115 |
+
|
| 116 |
+
```json
|
| 117 |
+
{
|
| 118 |
+
"type": "object",
|
| 119 |
+
"required": [
|
| 120 |
+
"internal_thinking"
|
| 121 |
+
],
|
| 122 |
+
"properties": {
|
| 123 |
+
"internal_thinking": {
|
| 124 |
+
"type": "string",
|
| 125 |
+
"description": "Track what's happening. What are opponents doing? What's your strategy for next turn?",
|
| 126 |
+
"minLength": 30
|
| 127 |
+
},
|
| 128 |
+
"note_to_self": {
|
| 129 |
+
"type": "string",
|
| 130 |
+
"description": "Important facts for when it's your turn. Use only if essential for clarity or direct user query. Omit otherwise.",
|
| 131 |
+
"maxLength": 100
|
| 132 |
+
},
|
| 133 |
+
"say_outloud": {
|
| 134 |
+
"type": "string",
|
| 135 |
+
"description": "Optional message to other players (max 100 chars). Propose trades or negotiate. You pay for this.",
|
| 136 |
+
"maxLength": 100
|
| 137 |
+
}
|
| 138 |
+
},
|
| 139 |
+
"propertyOrdering": [
|
| 140 |
+
"internal_thinking",
|
| 141 |
+
"note_to_self",
|
| 142 |
+
"say_outloud"
|
| 143 |
+
]
|
| 144 |
+
}
|
| 145 |
+
```
|
| 146 |
+
</details>
|
| 147 |
+
|
| 148 |
+
<details>
|
| 149 |
+
<summary><strong>📤 Prompt Sent to Gemini</strong></summary>
|
| 150 |
+
|
| 151 |
+
```json
|
| 152 |
+
{
|
| 153 |
+
"meta_data": {
|
| 154 |
+
"agent_name": "digeo",
|
| 155 |
+
"role": "You are player 'digeo'. Play strategically to win."
|
| 156 |
+
},
|
| 157 |
+
"task_context": {
|
| 158 |
+
"what_just_happened": "Player hadar is placing their first settlement.",
|
| 159 |
+
"instructions": "Analyze the game state and select the optimal move from 'allowed_actions'. If you wish to negotiate or wait for other players, select the 'wait_for_response' action."
|
| 160 |
+
},
|
| 161 |
+
"game_state": "\n 1. LOOKUP TABLES:\n • \"H\" (Hexes): Array where Index = HexID. Value = Resource+Num.\n Example: H[1]=\"W12\" -> Hex 1 is Wood 12.\n • \"N\" (Nodes): Array where Index = NodeID.\n Format: [ [Neighbors], [HexIDs], Port? ]\n Logic: To find yield of Node 10, check N[10]. Get HexIDs (e.g. [1,5]). Look up H[1] and H[5].\n\n2. CODES: W=Wood, B=Brick, S=Sheep, Wh=Wheat, O=Ore, D=Desert.\n ?3=Any 3:1 port, X2=Specific Resource 2:1 port.\n\n3. STATE: \"bld\"=[NodeID, Owner, Type], \"rds\"=[[From,To], Owner].\n\n4. PLAYERS: \"res\"={Resource:Count}, \"dev\"={\"h\":[Hidden Cards], \"r\":[Revealed] (K=Knight)}, \n \"stat\"=[\"LR\" (Longest Road), \"LA\" (Largest Army)].\n\n5. ROBBER: Located at HexID specified in \"meta.robber\". H[id] is blocked.\n\nJSON:\n{\"meta\":{\"curr\":\"hadar\",\"phase\":\"SETUP_FIRST_ROUND\",\"robber\":10,\"dice\":null},\"H\":[\"\",\"W12\",\"S5\",\"W4\",\"S8\",\"B6\",\"W3\",\"Wh8\",\"B10\",\"W11\",\"D\",\"O3\",\"S4\",\"B10\",\"Wh9\",\"Wh6\",\"S11\",\"O5\",\"Wh9\",\"O2\"],\"N\":[null,[[2,9],[1]],[[1,3],[1],\"Wh2\"],[[2,4,11],[2,1],\"Wh2\"],[[3,5],[2]],[[4,6,13],[3,2]],[[5,7],[3],\"B2\"],[[6,15],[3],\"B2\"],[[9,18],[4],\"?3\"],[[8,10,1],[4,1],\"?3\"],[[9,11,20],[5,4,1]],[[10,12,3],[5,2,1]],[[11,13,22],[6,5,2]],[[12,14,5],[6,3,2]],[[13,15,24],[7,6,3]],[[14,16,7],[7,3]],[[15,26],[7],\"O2\"],[[18,28],[8],\"S2\"],[[17,19,8],[8,4]],[[18,20,30],[9,8,4]],[[19,21,10],[9,5,4]],[[20,22,32],[10,9,5]],[[21,23,12],[10,6,5]],[[22,24,34],[11,10,6]],[[23,25,14],[11,7,6]],[[24,26,36],[12,11,7]],[[25,27,16],[12,7],\"O2\"],[[26,38],[12]],[[29,17],[8],\"S2\"],[[28,30,39],[13,8]],[[29,31,19],[13,9,8]],[[30,32,41],[14,13,9]],[[31,33,21],[14,10,9]],[[32,34,43],[15,14,10]],[[33,35,23],[15,11,10]],[[34,36,45],[16,15,11]],[[35,37,25],[16,12,11]],[[36,38,47],[16,12],\"?3\"],[[37,27],[12],\"?3\"],[[40,29],[13]],[[39,41,48],[17,13],\"W2\"],[[40,42,31],[17,14,13]],[[41,43,50],[18,17,14]],[[42,44,33],[18,15,14]],[[43,45,52],[19,18,15]],[[44,46,35],[19,16,15]],[[45,47,54],[19,16]],[[46,37],[16]],[[49,40],[17],\"W2\"],[[48,50],[17]],[[49,51,42],[18,17],\"?3\"],[[50,52],[18],\"?3\"],[[51,53,44],[19,18]],[[52,54],[19],\"?3\"],[[53,46],[19],\"?3\"]],\"state\":{\"bld\":[],\"rds\":[]},\"players\":{\"hadar\":{\"vp\":0,\"res\":{}},\"shon\":{\"vp\":0,\"res\":{}},\"digeo\":{\"vp\":0,\"res\":{}}}}"
|
| 162 |
+
}
|
| 163 |
+
```
|
| 164 |
+
</details>
|
| 165 |
+
|
| 166 |
+
|
| 167 |
+
### ✅ Response Received
|
| 168 |
+
|
| 169 |
+
- **Latency:** 6.12s
|
| 170 |
+
- **Tokens:** 765 (prompt: 688, completion: 77)
|
| 171 |
+
|
| 172 |
+
<details>
|
| 173 |
+
<summary><strong>📥 Raw Response from Gemini</strong></summary>
|
| 174 |
+
|
| 175 |
+
```json
|
| 176 |
+
{"internal_thinking": "Hadar is placing their first settlement. I need to observe their choice and Shon's choice. My strategy for my first settlement will be to prioritize a location with strong resource production (good numbers and diverse resources like wood, brick, and wheat) to ensure a balanced start."}
|
| 177 |
+
```
|
| 178 |
+
</details>
|
| 179 |
+
|
| 180 |
+
|
| 181 |
+
### ✅ Parse Success
|
| 182 |
+
|
| 183 |
+
|
| 184 |
+
### 🎯 AI Response
|
| 185 |
+
|
| 186 |
+
#### 💭 Internal Thinking
|
| 187 |
+
|
| 188 |
+
> Hadar is placing their first settlement. I need to observe their choice and Shon's choice. My strategy for my first settlement will be to prioritize a location with strong resource production (good numbers and diverse resources like wood, brick, and wheat) to ensure a balanced start.
|
| 189 |
+
|
| 190 |
+
|
| 191 |
+
<details>
|
| 192 |
+
<summary><strong>🔍 Raw JSON (Debug)</strong></summary>
|
| 193 |
+
|
| 194 |
+
```json
|
| 195 |
+
{
|
| 196 |
+
"internal_thinking": "Hadar is placing their first settlement. I need to observe their choice and Shon's choice. My strategy for my first settlement will be to prioritize a location with strong resource production (good numbers and diverse resources like wood, brick, and wheat) to ensure a balanced start."
|
| 197 |
+
}
|
| 198 |
+
```
|
| 199 |
+
</details>
|
| 200 |
+
|
| 201 |
+
|
| 202 |
+
## 🔄 Request #2
|
| 203 |
+
|
| 204 |
+
**Timestamp:** 2026-01-04 01:14:17
|
| 205 |
+
|
| 206 |
+
|
| 207 |
+
<details>
|
| 208 |
+
<summary><strong>📋 Expected Response Schema</strong></summary>
|
| 209 |
+
|
| 210 |
+
```json
|
| 211 |
+
{
|
| 212 |
+
"type": "object",
|
| 213 |
+
"required": [
|
| 214 |
+
"internal_thinking"
|
| 215 |
+
],
|
| 216 |
+
"properties": {
|
| 217 |
+
"internal_thinking": {
|
| 218 |
+
"type": "string",
|
| 219 |
+
"description": "Track what's happening. What are opponents doing? What's your strategy for next turn?",
|
| 220 |
+
"minLength": 30
|
| 221 |
+
},
|
| 222 |
+
"note_to_self": {
|
| 223 |
+
"type": "string",
|
| 224 |
+
"description": "Important facts for when it's your turn. Use only if essential for clarity or direct user query. Omit otherwise.",
|
| 225 |
+
"maxLength": 100
|
| 226 |
+
},
|
| 227 |
+
"say_outloud": {
|
| 228 |
+
"type": "string",
|
| 229 |
+
"description": "Optional message to other players (max 100 chars). Propose trades or negotiate. You pay for this.",
|
| 230 |
+
"maxLength": 100
|
| 231 |
+
}
|
| 232 |
+
},
|
| 233 |
+
"propertyOrdering": [
|
| 234 |
+
"internal_thinking",
|
| 235 |
+
"note_to_self",
|
| 236 |
+
"say_outloud"
|
| 237 |
+
]
|
| 238 |
+
}
|
| 239 |
+
```
|
| 240 |
+
</details>
|
| 241 |
+
|
| 242 |
+
<details>
|
| 243 |
+
<summary><strong>📤 Prompt Sent to Gemini</strong></summary>
|
| 244 |
+
|
| 245 |
+
```json
|
| 246 |
+
{
|
| 247 |
+
"meta_data": {
|
| 248 |
+
"agent_name": "digeo",
|
| 249 |
+
"role": "You are player 'digeo'. Play strategically to win."
|
| 250 |
+
},
|
| 251 |
+
"task_context": {
|
| 252 |
+
"what_just_happened": "Player hadar placed their first settlement at node 10 and is now choosing where to place their starting road.",
|
| 253 |
+
"instructions": "Analyze the game state and select the optimal move from 'allowed_actions'. If you wish to negotiate or wait for other players, select the 'wait_for_response' action."
|
| 254 |
+
},
|
| 255 |
+
"game_state": "\n 1. LOOKUP TABLES:\n • \"H\" (Hexes): Array where Index = HexID. Value = Resource+Num.\n Example: H[1]=\"W12\" -> Hex 1 is Wood 12.\n • \"N\" (Nodes): Array where Index = NodeID.\n Format: [ [Neighbors], [HexIDs], Port? ]\n Logic: To find yield of Node 10, check N[10]. Get HexIDs (e.g. [1,5]). Look up H[1] and H[5].\n\n2. CODES: W=Wood, B=Brick, S=Sheep, Wh=Wheat, O=Ore, D=Desert.\n ?3=Any 3:1 port, X2=Specific Resource 2:1 port.\n\n3. STATE: \"bld\"=[NodeID, Owner, Type], \"rds\"=[[From,To], Owner].\n\n4. PLAYERS: \"res\"={Resource:Count}, \"dev\"={\"h\":[Hidden Cards], \"r\":[Revealed] (K=Knight)}, \n \"stat\"=[\"LR\" (Longest Road), \"LA\" (Largest Army)].\n\n5. ROBBER: Located at HexID specified in \"meta.robber\". H[id] is blocked.\n\nJSON:\n{\"meta\":{\"curr\":\"hadar\",\"phase\":\"SETUP_FIRST_ROUND\",\"robber\":10,\"dice\":null},\"H\":[\"\",\"W12\",\"S5\",\"W4\",\"S8\",\"B6\",\"W3\",\"Wh8\",\"B10\",\"W11\",\"D\",\"O3\",\"S4\",\"B10\",\"Wh9\",\"Wh6\",\"S11\",\"O5\",\"Wh9\",\"O2\"],\"N\":[null,[[2,9],[1]],[[1,3],[1],\"Wh2\"],[[2,4,11],[2,1],\"Wh2\"],[[3,5],[2]],[[4,6,13],[3,2]],[[5,7],[3],\"B2\"],[[6,15],[3],\"B2\"],[[9,18],[4],\"?3\"],[[8,10,1],[4,1],\"?3\"],[[9,11,20],[5,4,1]],[[10,12,3],[5,2,1]],[[11,13,22],[6,5,2]],[[12,14,5],[6,3,2]],[[13,15,24],[7,6,3]],[[14,16,7],[7,3]],[[15,26],[7],\"O2\"],[[18,28],[8],\"S2\"],[[17,19,8],[8,4]],[[18,20,30],[9,8,4]],[[19,21,10],[9,5,4]],[[20,22,32],[10,9,5]],[[21,23,12],[10,6,5]],[[22,24,34],[11,10,6]],[[23,25,14],[11,7,6]],[[24,26,36],[12,11,7]],[[25,27,16],[12,7],\"O2\"],[[26,38],[12]],[[29,17],[8],\"S2\"],[[28,30,39],[13,8]],[[29,31,19],[13,9,8]],[[30,32,41],[14,13,9]],[[31,33,21],[14,10,9]],[[32,34,43],[15,14,10]],[[33,35,23],[15,11,10]],[[34,36,45],[16,15,11]],[[35,37,25],[16,12,11]],[[36,38,47],[16,12],\"?3\"],[[37,27],[12],\"?3\"],[[40,29],[13]],[[39,41,48],[17,13],\"W2\"],[[40,42,31],[17,14,13]],[[41,43,50],[18,17,14]],[[42,44,33],[18,15,14]],[[43,45,52],[19,18,15]],[[44,46,35],[19,16,15]],[[45,47,54],[19,16]],[[46,37],[16]],[[49,40],[17],\"W2\"],[[48,50],[17]],[[49,51,42],[18,17],\"?3\"],[[50,52],[18],\"?3\"],[[51,53,44],[19,18]],[[52,54],[19],\"?3\"],[[53,46],[19],\"?3\"]],\"state\":{\"bld\":[[10,\"hadar\",\"S\"]],\"rds\":[]},\"players\":{\"hadar\":{\"vp\":1,\"res\":{}},\"shon\":{\"vp\":0,\"res\":{}},\"digeo\":{\"vp\":0,\"res\":{}}}}"
|
| 256 |
+
}
|
| 257 |
+
```
|
| 258 |
+
</details>
|
| 259 |
+
|
| 260 |
+
|
| 261 |
+
### ✅ Response Received
|
| 262 |
+
|
| 263 |
+
- **Latency:** 6.33s
|
| 264 |
+
- **Tokens:** 842 (prompt: 708, completion: 134)
|
| 265 |
+
|
| 266 |
+
<details>
|
| 267 |
+
<summary><strong>📥 Raw Response from Gemini</strong></summary>
|
| 268 |
+
|
| 269 |
+
```json
|
| 270 |
+
{"internal_thinking": "Hadar placed their first settlement at node 10, which yields Brick 6, Sheep 8, and Wood 12. They are now placing their first road. The most strategic move for Hadar would be to connect to node 9 to secure the ?3 port. This gives them good early trading flexibility. I will observe this likely move and plan my own settlement and road placements accordingly, aiming for strong resource production and access to desirable hexes or ports.", "note_to_self": "Hadar likely to take ?3 port at Node 9.", "say_outloud": ""}
|
| 271 |
+
```
|
| 272 |
+
</details>
|
| 273 |
+
|
| 274 |
+
|
| 275 |
+
### ✅ Parse Success
|
| 276 |
+
|
| 277 |
+
|
| 278 |
+
### 🎯 AI Response
|
| 279 |
+
|
| 280 |
+
#### 💭 Internal Thinking
|
| 281 |
+
|
| 282 |
+
> Hadar placed their first settlement at node 10, which yields Brick 6, Sheep 8, and Wood 12. They are now placing their first road. The most strategic move for Hadar would be to connect to node 9 to secure the ?3 port. This gives them good early trading flexibility. I will observe this likely move and plan my own settlement and road placements accordingly, aiming for strong resource production and access to desirable hexes or ports.
|
| 283 |
+
|
| 284 |
+
#### 📝 Note to Self
|
| 285 |
+
|
| 286 |
+
*"Hadar likely to take ?3 port at Node 9."*
|
| 287 |
+
|
| 288 |
+
|
| 289 |
+
<details>
|
| 290 |
+
<summary><strong>🔍 Raw JSON (Debug)</strong></summary>
|
| 291 |
+
|
| 292 |
+
```json
|
| 293 |
+
{
|
| 294 |
+
"internal_thinking": "Hadar placed their first settlement at node 10, which yields Brick 6, Sheep 8, and Wood 12. They are now placing their first road. The most strategic move for Hadar would be to connect to node 9 to secure the ?3 port. This gives them good early trading flexibility. I will observe this likely move and plan my own settlement and road placements accordingly, aiming for strong resource production and access to desirable hexes or ports.",
|
| 295 |
+
"note_to_self": "Hadar likely to take ?3 port at Node 9.",
|
| 296 |
+
"say_outloud": ""
|
| 297 |
+
}
|
| 298 |
+
```
|
| 299 |
+
</details>
|
| 300 |
+
|
| 301 |
+
|
| 302 |
+
## 🔄 Request #2
|
| 303 |
+
|
| 304 |
+
**Timestamp:** 2026-01-04 01:16:07
|
| 305 |
+
|
| 306 |
+
|
| 307 |
+
<details>
|
| 308 |
+
<summary><strong>📋 Expected Response Schema</strong></summary>
|
| 309 |
+
|
| 310 |
+
```json
|
| 311 |
+
{
|
| 312 |
+
"type": "object",
|
| 313 |
+
"required": [
|
| 314 |
+
"internal_thinking"
|
| 315 |
+
],
|
| 316 |
+
"properties": {
|
| 317 |
+
"internal_thinking": {
|
| 318 |
+
"type": "string",
|
| 319 |
+
"description": "Track what's happening. What are opponents doing? What's your strategy for next turn?",
|
| 320 |
+
"minLength": 30
|
| 321 |
+
},
|
| 322 |
+
"note_to_self": {
|
| 323 |
+
"type": "string",
|
| 324 |
+
"description": "Important facts for when it's your turn. Use only if essential for clarity or direct user query. Omit otherwise.",
|
| 325 |
+
"maxLength": 100
|
| 326 |
+
},
|
| 327 |
+
"say_outloud": {
|
| 328 |
+
"type": "string",
|
| 329 |
+
"description": "Optional message to other players (max 100 chars). Propose trades or negotiate. You pay for this.",
|
| 330 |
+
"maxLength": 100
|
| 331 |
+
}
|
| 332 |
+
},
|
| 333 |
+
"propertyOrdering": [
|
| 334 |
+
"internal_thinking",
|
| 335 |
+
"note_to_self",
|
| 336 |
+
"say_outloud"
|
| 337 |
+
]
|
| 338 |
+
}
|
| 339 |
+
```
|
| 340 |
+
</details>
|
| 341 |
+
|
| 342 |
+
<details>
|
| 343 |
+
<summary><strong>📤 Prompt Sent to Gemini</strong></summary>
|
| 344 |
+
|
| 345 |
+
```json
|
| 346 |
+
{
|
| 347 |
+
"meta_data": {
|
| 348 |
+
"agent_name": "digeo",
|
| 349 |
+
"role": "You are player 'digeo'. Play strategically to win."
|
| 350 |
+
},
|
| 351 |
+
"task_context": {
|
| 352 |
+
"what_just_happened": "Player shon is placing their first settlement.",
|
| 353 |
+
"instructions": "Analyze the game state and select the optimal move from 'allowed_actions'. If you wish to negotiate or wait for other players, select the 'wait_for_response' action."
|
| 354 |
+
},
|
| 355 |
+
"game_state": "\n 1. LOOKUP TABLES:\n • \"H\" (Hexes): Array where Index = HexID. Value = Resource+Num.\n Example: H[1]=\"W12\" -> Hex 1 is Wood 12.\n • \"N\" (Nodes): Array where Index = NodeID.\n Format: [ [Neighbors], [HexIDs], Port? ]\n Logic: To find yield of Node 10, check N[10]. Get HexIDs (e.g. [1,5]). Look up H[1] and H[5].\n\n2. CODES: W=Wood, B=Brick, S=Sheep, Wh=Wheat, O=Ore, D=Desert.\n ?3=Any 3:1 port, X2=Specific Resource 2:1 port.\n\n3. STATE: \"bld\"=[NodeID, Owner, Type], \"rds\"=[[From,To], Owner].\n\n4. PLAYERS: \"res\"={Resource:Count}, \"dev\"={\"h\":[Hidden Cards], \"r\":[Revealed] (K=Knight)}, \n \"stat\"=[\"LR\" (Longest Road), \"LA\" (Largest Army)].\n\n5. ROBBER: Located at HexID specified in \"meta.robber\". H[id] is blocked.\n\nJSON:\n{\"meta\":{\"curr\":\"shon\",\"phase\":\"SETUP_FIRST_ROUND\",\"robber\":10,\"dice\":null},\"H\":[\"\",\"W12\",\"S5\",\"W4\",\"S8\",\"B6\",\"W3\",\"Wh8\",\"B10\",\"W11\",\"D\",\"O3\",\"S4\",\"B10\",\"Wh9\",\"Wh6\",\"S11\",\"O5\",\"Wh9\",\"O2\"],\"N\":[null,[[2,9],[1]],[[1,3],[1],\"Wh2\"],[[2,4,11],[2,1],\"Wh2\"],[[3,5],[2]],[[4,6,13],[3,2]],[[5,7],[3],\"B2\"],[[6,15],[3],\"B2\"],[[9,18],[4],\"?3\"],[[8,10,1],[4,1],\"?3\"],[[9,11,20],[5,4,1]],[[10,12,3],[5,2,1]],[[11,13,22],[6,5,2]],[[12,14,5],[6,3,2]],[[13,15,24],[7,6,3]],[[14,16,7],[7,3]],[[15,26],[7],\"O2\"],[[18,28],[8],\"S2\"],[[17,19,8],[8,4]],[[18,20,30],[9,8,4]],[[19,21,10],[9,5,4]],[[20,22,32],[10,9,5]],[[21,23,12],[10,6,5]],[[22,24,34],[11,10,6]],[[23,25,14],[11,7,6]],[[24,26,36],[12,11,7]],[[25,27,16],[12,7],\"O2\"],[[26,38],[12]],[[29,17],[8],\"S2\"],[[28,30,39],[13,8]],[[29,31,19],[13,9,8]],[[30,32,41],[14,13,9]],[[31,33,21],[14,10,9]],[[32,34,43],[15,14,10]],[[33,35,23],[15,11,10]],[[34,36,45],[16,15,11]],[[35,37,25],[16,12,11]],[[36,38,47],[16,12],\"?3\"],[[37,27],[12],\"?3\"],[[40,29],[13]],[[39,41,48],[17,13],\"W2\"],[[40,42,31],[17,14,13]],[[41,43,50],[18,17,14]],[[42,44,33],[18,15,14]],[[43,45,52],[19,18,15]],[[44,46,35],[19,16,15]],[[45,47,54],[19,16]],[[46,37],[16]],[[49,40],[17],\"W2\"],[[48,50],[17]],[[49,51,42],[18,17],\"?3\"],[[50,52],[18],\"?3\"],[[51,53,44],[19,18]],[[52,54],[19],\"?3\"],[[53,46],[19],\"?3\"]],\"state\":{\"bld\":[[10,\"hadar\",\"S\"]],\"rds\":[[[10,9],\"hadar\"]]},\"players\":{\"hadar\":{\"vp\":1,\"res\":{}},\"shon\":{\"vp\":0,\"res\":{}},\"digeo\":{\"vp\":0,\"res\":{}}}}"
|
| 356 |
+
}
|
| 357 |
+
```
|
| 358 |
+
</details>
|
| 359 |
+
|
| 360 |
+
|
| 361 |
+
### ✅ Response Received
|
| 362 |
+
|
| 363 |
+
- **Latency:** 14.56s
|
| 364 |
+
- **Tokens:** 907 (prompt: 697, completion: 210)
|
| 365 |
+
|
| 366 |
+
<details>
|
| 367 |
+
<summary><strong>📥 Raw Response from Gemini</strong></summary>
|
| 368 |
+
|
| 369 |
+
```json
|
| 370 |
+
{
|
| 371 |
+
"internal_thinking": "Player shon is placing their first settlement. Hadar has already secured a strong starting position at Node 10 (W12, S8, B6). My strategy is to observe shon's move and then identify the best remaining spot for my first settlement. I'm looking for a diverse set of resources, ideally including Wood and Brick, combined with high-probability numbers (6s, 8s, 5s, 9s). I've pre-identified several strong nodes: Node 11 (O3, B6, S8), Node 13 (O3, Wh8, W3), Node 14 (B10, Wh8, W3), Node 17 (O5, S11, Wh8), Node 18 (O5, S11, W11 with S2 port), and Node 19 (O5, B10, W11). I expect shon to take one of these prime locations, but I should still have solid options for my turn.",
|
| 372 |
+
"note_to_self": "Prioritize nodes with W/B/Wh/S/O and high-probability numbers (6,8,5,9). Evaluate remaining options after shon's placement."
|
| 373 |
+
}
|
| 374 |
+
```
|
| 375 |
+
</details>
|
| 376 |
+
|
| 377 |
+
|
| 378 |
+
### ✅ Parse Success
|
| 379 |
+
|
| 380 |
+
|
| 381 |
+
### 🎯 AI Response
|
| 382 |
+
|
| 383 |
+
#### 💭 Internal Thinking
|
| 384 |
+
|
| 385 |
+
> Player shon is placing their first settlement. Hadar has already secured a strong starting position at Node 10 (W12, S8, B6). My strategy is to observe shon's move and then identify the best remaining spot for my first settlement. I'm looking for a diverse set of resources, ideally including Wood and Brick, combined with high-probability numbers (6s, 8s, 5s, 9s). I've pre-identified several strong nodes: Node 11 (O3, B6, S8), Node 13 (O3, Wh8, W3), Node 14 (B10, Wh8, W3), Node 17 (O5, S11, Wh8), Node 18 (O5, S11, W11 with S2 port), and Node 19 (O5, B10, W11). I expect shon to take one of these prime locations, but I should still have solid options for my turn.
|
| 386 |
+
|
| 387 |
+
#### 📝 Note to Self
|
| 388 |
+
|
| 389 |
+
*"Prioritize nodes with W/B/Wh/S/O and high-probability numbers (6,8,5,9). Evaluate remaining options after shon's placement."*
|
| 390 |
+
|
| 391 |
+
|
| 392 |
+
<details>
|
| 393 |
+
<summary><strong>🔍 Raw JSON (Debug)</strong></summary>
|
| 394 |
+
|
| 395 |
+
```json
|
| 396 |
+
{
|
| 397 |
+
"internal_thinking": "Player shon is placing their first settlement. Hadar has already secured a strong starting position at Node 10 (W12, S8, B6). My strategy is to observe shon's move and then identify the best remaining spot for my first settlement. I'm looking for a diverse set of resources, ideally including Wood and Brick, combined with high-probability numbers (6s, 8s, 5s, 9s). I've pre-identified several strong nodes: Node 11 (O3, B6, S8), Node 13 (O3, Wh8, W3), Node 14 (B10, Wh8, W3), Node 17 (O5, S11, Wh8), Node 18 (O5, S11, W11 with S2 port), and Node 19 (O5, B10, W11). I expect shon to take one of these prime locations, but I should still have solid options for my turn.",
|
| 398 |
+
"note_to_self": "Prioritize nodes with W/B/Wh/S/O and high-probability numbers (6,8,5,9). Evaluate remaining options after shon's placement."
|
| 399 |
+
}
|
| 400 |
+
```
|
| 401 |
+
</details>
|
| 402 |
+
|
| 403 |
+
|
| 404 |
+
## 🔄 Request #2
|
| 405 |
+
|
| 406 |
+
**Timestamp:** 2026-01-04 01:18:49
|
| 407 |
+
|
| 408 |
+
|
| 409 |
+
<details>
|
| 410 |
+
<summary><strong>📋 Expected Response Schema</strong></summary>
|
| 411 |
+
|
| 412 |
+
```json
|
| 413 |
+
{
|
| 414 |
+
"type": "object",
|
| 415 |
+
"required": [
|
| 416 |
+
"internal_thinking"
|
| 417 |
+
],
|
| 418 |
+
"properties": {
|
| 419 |
+
"internal_thinking": {
|
| 420 |
+
"type": "string",
|
| 421 |
+
"description": "Track what's happening. What are opponents doing? What's your strategy for next turn?",
|
| 422 |
+
"minLength": 30
|
| 423 |
+
},
|
| 424 |
+
"note_to_self": {
|
| 425 |
+
"type": "string",
|
| 426 |
+
"description": "Important facts for when it's your turn. Use only if essential for clarity or direct user query. Omit otherwise.",
|
| 427 |
+
"maxLength": 100
|
| 428 |
+
},
|
| 429 |
+
"say_outloud": {
|
| 430 |
+
"type": "string",
|
| 431 |
+
"description": "Optional message to other players (max 100 chars). Propose trades or negotiate. You pay for this.",
|
| 432 |
+
"maxLength": 100
|
| 433 |
+
}
|
| 434 |
+
},
|
| 435 |
+
"propertyOrdering": [
|
| 436 |
+
"internal_thinking",
|
| 437 |
+
"note_to_self",
|
| 438 |
+
"say_outloud"
|
| 439 |
+
]
|
| 440 |
+
}
|
| 441 |
+
```
|
| 442 |
+
</details>
|
| 443 |
+
|
| 444 |
+
<details>
|
| 445 |
+
<summary><strong>📤 Prompt Sent to Gemini</strong></summary>
|
| 446 |
+
|
| 447 |
+
```json
|
| 448 |
+
{
|
| 449 |
+
"meta_data": {
|
| 450 |
+
"agent_name": "digeo",
|
| 451 |
+
"role": "You are player 'digeo'. Play strategically to win."
|
| 452 |
+
},
|
| 453 |
+
"task_context": {
|
| 454 |
+
"what_just_happened": "Player shon is placing their first settlement.",
|
| 455 |
+
"instructions": "Analyze the game state and select the optimal move from 'allowed_actions'. If you wish to negotiate or wait for other players, select the 'wait_for_response' action."
|
| 456 |
+
},
|
| 457 |
+
"game_state": "\n 1. LOOKUP TABLES:\n • \"H\" (Hexes): Array where Index = HexID. Value = Resource+Num.\n Example: H[1]=\"W12\" -> Hex 1 is Wood 12.\n • \"N\" (Nodes): Array where Index = NodeID.\n Format: [ [Neighbors], [HexIDs], Port? ]\n Logic: To find yield of Node 10, check N[10]. Get HexIDs (e.g. [1,5]). Look up H[1] and H[5].\n\n2. CODES: W=Wood, B=Brick, S=Sheep, Wh=Wheat, O=Ore, D=Desert.\n ?3=Any 3:1 port, X2=Specific Resource 2:1 port.\n\n3. STATE: \"bld\"=[NodeID, Owner, Type], \"rds\"=[[From,To], Owner].\n\n4. PLAYERS: \"res\"={Resource:Count}, \"dev\"={\"h\":[Hidden Cards], \"r\":[Revealed] (K=Knight)}, \n \"stat\"=[\"LR\" (Longest Road), \"LA\" (Largest Army)].\n\n5. ROBBER: Located at HexID specified in \"meta.robber\". H[id] is blocked.\n\nJSON:\n{\"meta\":{\"curr\":\"shon\",\"phase\":\"SETUP_FIRST_ROUND\",\"robber\":10,\"dice\":null},\"H\":[\"\",\"W12\",\"S5\",\"W4\",\"S8\",\"B6\",\"W3\",\"Wh8\",\"B10\",\"W11\",\"D\",\"O3\",\"S4\",\"B10\",\"Wh9\",\"Wh6\",\"S11\",\"O5\",\"Wh9\",\"O2\"],\"N\":[null,[[2,9],[1]],[[1,3],[1],\"Wh2\"],[[2,4,11],[2,1],\"Wh2\"],[[3,5],[2]],[[4,6,13],[3,2]],[[5,7],[3],\"B2\"],[[6,15],[3],\"B2\"],[[9,18],[4],\"?3\"],[[8,10,1],[4,1],\"?3\"],[[9,11,20],[5,4,1]],[[10,12,3],[5,2,1]],[[11,13,22],[6,5,2]],[[12,14,5],[6,3,2]],[[13,15,24],[7,6,3]],[[14,16,7],[7,3]],[[15,26],[7],\"O2\"],[[18,28],[8],\"S2\"],[[17,19,8],[8,4]],[[18,20,30],[9,8,4]],[[19,21,10],[9,5,4]],[[20,22,32],[10,9,5]],[[21,23,12],[10,6,5]],[[22,24,34],[11,10,6]],[[23,25,14],[11,7,6]],[[24,26,36],[12,11,7]],[[25,27,16],[12,7],\"O2\"],[[26,38],[12]],[[29,17],[8],\"S2\"],[[28,30,39],[13,8]],[[29,31,19],[13,9,8]],[[30,32,41],[14,13,9]],[[31,33,21],[14,10,9]],[[32,34,43],[15,14,10]],[[33,35,23],[15,11,10]],[[34,36,45],[16,15,11]],[[35,37,25],[16,12,11]],[[36,38,47],[16,12],\"?3\"],[[37,27],[12],\"?3\"],[[40,29],[13]],[[39,41,48],[17,13],\"W2\"],[[40,42,31],[17,14,13]],[[41,43,50],[18,17,14]],[[42,44,33],[18,15,14]],[[43,45,52],[19,18,15]],[[44,46,35],[19,16,15]],[[45,47,54],[19,16]],[[46,37],[16]],[[49,40],[17],\"W2\"],[[48,50],[17]],[[49,51,42],[18,17],\"?3\"],[[50,52],[18],\"?3\"],[[51,53,44],[19,18]],[[52,54],[19],\"?3\"],[[53,46],[19],\"?3\"]],\"state\":{\"bld\":[[10,\"hadar\",\"S\"]],\"rds\":[[[10,9],\"hadar\"]]},\"players\":{\"hadar\":{\"vp\":1,\"res\":{}},\"shon\":{\"vp\":0,\"res\":{}},\"digeo\":{\"vp\":0,\"res\":{}}}}"
|
| 458 |
+
}
|
| 459 |
+
```
|
| 460 |
+
</details>
|
| 461 |
+
|
| 462 |
+
|
| 463 |
+
### ✅ Response Received
|
| 464 |
+
|
| 465 |
+
- **Latency:** 8.45s
|
| 466 |
+
- **Tokens:** 832 (prompt: 697, completion: 135)
|
| 467 |
+
|
| 468 |
+
<details>
|
| 469 |
+
<summary><strong>📥 Raw Response from Gemini</strong></summary>
|
| 470 |
+
|
| 471 |
+
```json
|
| 472 |
+
{"internal_thinking": "Player 'shon' is placing their first settlement. I am observing the board to see what resources and numbers 'shon' prioritizes. Hadar already took Node 10 (W12, S8, B6), a strong start. I will evaluate the remaining high-value spots for my first settlement, focusing on good resource diversity and high-probability numbers (6, 8, 5, 9). Key spots include Node 5 (B6, S8, W4), Node 12 (W3, B6, S5), and Node 31 (Wh9, B10, W11). My goal is to secure a balanced production for early game expansion and future development."}
|
| 473 |
+
```
|
| 474 |
+
</details>
|
| 475 |
+
|
| 476 |
+
|
| 477 |
+
### ✅ Parse Success
|
| 478 |
+
|
| 479 |
+
|
| 480 |
+
### 🎯 AI Response
|
| 481 |
+
|
| 482 |
+
#### 💭 Internal Thinking
|
| 483 |
+
|
| 484 |
+
> Player 'shon' is placing their first settlement. I am observing the board to see what resources and numbers 'shon' prioritizes. Hadar already took Node 10 (W12, S8, B6), a strong start. I will evaluate the remaining high-value spots for my first settlement, focusing on good resource diversity and high-probability numbers (6, 8, 5, 9). Key spots include Node 5 (B6, S8, W4), Node 12 (W3, B6, S5), and Node 31 (Wh9, B10, W11). My goal is to secure a balanced production for early game expansion and future development.
|
| 485 |
+
|
| 486 |
+
|
| 487 |
+
<details>
|
| 488 |
+
<summary><strong>🔍 Raw JSON (Debug)</strong></summary>
|
| 489 |
+
|
| 490 |
+
```json
|
| 491 |
+
{
|
| 492 |
+
"internal_thinking": "Player 'shon' is placing their first settlement. I am observing the board to see what resources and numbers 'shon' prioritizes. Hadar already took Node 10 (W12, S8, B6), a strong start. I will evaluate the remaining high-value spots for my first settlement, focusing on good resource diversity and high-probability numbers (6, 8, 5, 9). Key spots include Node 5 (B6, S8, W4), Node 12 (W3, B6, S5), and Node 31 (Wh9, B10, W11). My goal is to secure a balanced production for early game expansion and future development."
|
| 493 |
+
}
|
| 494 |
+
```
|
| 495 |
+
</details>
|
| 496 |
+
|
examples/ai_testing/my_games/ai_logs/session_20260104_011246/player_hadar.md
ADDED
|
@@ -0,0 +1,485 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# 🤖 AI Agent Log - Player HADAR
|
| 2 |
+
|
| 3 |
+
---
|
| 4 |
+
|
| 5 |
+
**Session:** `session_20260104_011246`
|
| 6 |
+
|
| 7 |
+
**Model:** `models/gemini-2.5-flash`
|
| 8 |
+
|
| 9 |
+
**Started:** 2026-01-04 01:13:17
|
| 10 |
+
|
| 11 |
+
---
|
| 12 |
+
|
| 13 |
+
|
| 14 |
+
## 🔄 Request #1
|
| 15 |
+
|
| 16 |
+
**Timestamp:** 2026-01-04 01:13:17
|
| 17 |
+
|
| 18 |
+
|
| 19 |
+
<details>
|
| 20 |
+
<summary><strong>📋 Expected Response Schema</strong></summary>
|
| 21 |
+
|
| 22 |
+
```json
|
| 23 |
+
{
|
| 24 |
+
"type": "object",
|
| 25 |
+
"required": [
|
| 26 |
+
"internal_thinking",
|
| 27 |
+
"action"
|
| 28 |
+
],
|
| 29 |
+
"properties": {
|
| 30 |
+
"internal_thinking": {
|
| 31 |
+
"type": "string",
|
| 32 |
+
"description": "Private strategy. What's your plan and why?",
|
| 33 |
+
"minLength": 50
|
| 34 |
+
},
|
| 35 |
+
"note_to_self": {
|
| 36 |
+
"type": "string",
|
| 37 |
+
"description": "Important facts for when it's your turn. Use only if essential for clarity or direct user query. Omit otherwise.",
|
| 38 |
+
"maxLength": 100
|
| 39 |
+
},
|
| 40 |
+
"say_outloud": {
|
| 41 |
+
"type": "string",
|
| 42 |
+
"description": "A short message to other players (max 100 chars). Use for negotiation, threats, or table talk. Keep in mind you pay for speak outload.",
|
| 43 |
+
"maxLength": 100
|
| 44 |
+
},
|
| 45 |
+
"action": {
|
| 46 |
+
"type": "object",
|
| 47 |
+
"required": [
|
| 48 |
+
"type",
|
| 49 |
+
"parameters"
|
| 50 |
+
],
|
| 51 |
+
"properties": {
|
| 52 |
+
"type": {
|
| 53 |
+
"type": "string",
|
| 54 |
+
"description": "The action type (must match one from allowed_actions in constraints)"
|
| 55 |
+
},
|
| 56 |
+
"parameters": {
|
| 57 |
+
"type": "object",
|
| 58 |
+
"description": "Action-specific parameters. If no parameters are needed, provide an empty object.",
|
| 59 |
+
"properties": {
|
| 60 |
+
"target": {
|
| 61 |
+
"type": "string",
|
| 62 |
+
"description": "The target of the action (if applicable)"
|
| 63 |
+
},
|
| 64 |
+
"amount": {
|
| 65 |
+
"type": "number",
|
| 66 |
+
"description": "The amount (if applicable)"
|
| 67 |
+
},
|
| 68 |
+
"location": {
|
| 69 |
+
"type": "string",
|
| 70 |
+
"description": "The location (if applicable)"
|
| 71 |
+
}
|
| 72 |
+
},
|
| 73 |
+
"propertyOrdering": [
|
| 74 |
+
"target",
|
| 75 |
+
"amount",
|
| 76 |
+
"location"
|
| 77 |
+
]
|
| 78 |
+
}
|
| 79 |
+
},
|
| 80 |
+
"propertyOrdering": [
|
| 81 |
+
"type",
|
| 82 |
+
"parameters"
|
| 83 |
+
]
|
| 84 |
+
}
|
| 85 |
+
},
|
| 86 |
+
"propertyOrdering": [
|
| 87 |
+
"internal_thinking",
|
| 88 |
+
"note_to_self",
|
| 89 |
+
"say_outloud",
|
| 90 |
+
"action"
|
| 91 |
+
]
|
| 92 |
+
}
|
| 93 |
+
```
|
| 94 |
+
</details>
|
| 95 |
+
|
| 96 |
+
<details>
|
| 97 |
+
<summary><strong>📤 Prompt Sent to Gemini</strong></summary>
|
| 98 |
+
|
| 99 |
+
```json
|
| 100 |
+
{
|
| 101 |
+
"meta_data": {
|
| 102 |
+
"agent_name": "hadar",
|
| 103 |
+
"role": "You are player 'hadar'. Play strategically to win."
|
| 104 |
+
},
|
| 105 |
+
"task_context": {
|
| 106 |
+
"what_just_happened": "It's your turn in the setup phase. Place your first settlement on a strategic location.",
|
| 107 |
+
"instructions": "Analyze the game state and select the optimal move from 'allowed_actions'. You have 2 possible actions. If you wish to negotiate or wait for other players, select the 'wait_for_response' action."
|
| 108 |
+
},
|
| 109 |
+
"game_state": "\n 1. LOOKUP TABLES:\n • \"H\" (Hexes): Array where Index = HexID. Value = Resource+Num.\n Example: H[1]=\"W12\" -> Hex 1 is Wood 12.\n • \"N\" (Nodes): Array where Index = NodeID.\n Format: [ [Neighbors], [HexIDs], Port? ]\n Logic: To find yield of Node 10, check N[10]. Get HexIDs (e.g. [1,5]). Look up H[1] and H[5].\n\n2. CODES: W=Wood, B=Brick, S=Sheep, Wh=Wheat, O=Ore, D=Desert.\n ?3=Any 3:1 port, X2=Specific Resource 2:1 port.\n\n3. STATE: \"bld\"=[NodeID, Owner, Type], \"rds\"=[[From,To], Owner].\n\n4. PLAYERS: \"res\"={Resource:Count}, \"dev\"={\"h\":[Hidden Cards], \"r\":[Revealed] (K=Knight)}, \n \"stat\"=[\"LR\" (Longest Road), \"LA\" (Largest Army)].\n\n5. ROBBER: Located at HexID specified in \"meta.robber\". H[id] is blocked.\n\nJSON:\n{\"meta\":{\"curr\":\"hadar\",\"phase\":\"SETUP_FIRST_ROUND\",\"robber\":10,\"dice\":null},\"H\":[\"\",\"W12\",\"S5\",\"W4\",\"S8\",\"B6\",\"W3\",\"Wh8\",\"B10\",\"W11\",\"D\",\"O3\",\"S4\",\"B10\",\"Wh9\",\"Wh6\",\"S11\",\"O5\",\"Wh9\",\"O2\"],\"N\":[null,[[2,9],[1]],[[1,3],[1],\"Wh2\"],[[2,4,11],[2,1],\"Wh2\"],[[3,5],[2]],[[4,6,13],[3,2]],[[5,7],[3],\"B2\"],[[6,15],[3],\"B2\"],[[9,18],[4],\"?3\"],[[8,10,1],[4,1],\"?3\"],[[9,11,20],[5,4,1]],[[10,12,3],[5,2,1]],[[11,13,22],[6,5,2]],[[12,14,5],[6,3,2]],[[13,15,24],[7,6,3]],[[14,16,7],[7,3]],[[15,26],[7],\"O2\"],[[18,28],[8],\"S2\"],[[17,19,8],[8,4]],[[18,20,30],[9,8,4]],[[19,21,10],[9,5,4]],[[20,22,32],[10,9,5]],[[21,23,12],[10,6,5]],[[22,24,34],[11,10,6]],[[23,25,14],[11,7,6]],[[24,26,36],[12,11,7]],[[25,27,16],[12,7],\"O2\"],[[26,38],[12]],[[29,17],[8],\"S2\"],[[28,30,39],[13,8]],[[29,31,19],[13,9,8]],[[30,32,41],[14,13,9]],[[31,33,21],[14,10,9]],[[32,34,43],[15,14,10]],[[33,35,23],[15,11,10]],[[34,36,45],[16,15,11]],[[35,37,25],[16,12,11]],[[36,38,47],[16,12],\"?3\"],[[37,27],[12],\"?3\"],[[40,29],[13]],[[39,41,48],[17,13],\"W2\"],[[40,42,31],[17,14,13]],[[41,43,50],[18,17,14]],[[42,44,33],[18,15,14]],[[43,45,52],[19,18,15]],[[44,46,35],[19,16,15]],[[45,47,54],[19,16]],[[46,37],[16]],[[49,40],[17],\"W2\"],[[48,50],[17]],[[49,51,42],[18,17],\"?3\"],[[50,52],[18],\"?3\"],[[51,53,44],[19,18]],[[52,54],[19],\"?3\"],[[53,46],[19],\"?3\"]],\"state\":{\"bld\":[],\"rds\":[]},\"players\":{\"hadar\":{\"vp\":0,\"res\":{}},\"shon\":{\"vp\":0,\"res\":{}},\"digeo\":{\"vp\":0,\"res\":{}}}}",
|
| 110 |
+
"constraints": {
|
| 111 |
+
"usage_instructions": "Choose one action type from the list below. Populate the 'parameters' field in your response strictly according to the 'example_parameters' structure provided.",
|
| 112 |
+
"allowed_actions": [
|
| 113 |
+
{
|
| 114 |
+
"action": "place_settlement",
|
| 115 |
+
"description": "Place your starting settlement on an available node",
|
| 116 |
+
"example_parameters": {
|
| 117 |
+
"location": "20"
|
| 118 |
+
}
|
| 119 |
+
},
|
| 120 |
+
{
|
| 121 |
+
"action": "wait_for_response",
|
| 122 |
+
"description": "Do nothing on the board, just chat or wait for other players",
|
| 123 |
+
"example_parameters": {}
|
| 124 |
+
}
|
| 125 |
+
]
|
| 126 |
+
}
|
| 127 |
+
}
|
| 128 |
+
```
|
| 129 |
+
</details>
|
| 130 |
+
|
| 131 |
+
|
| 132 |
+
### ✅ Response Received
|
| 133 |
+
|
| 134 |
+
- **Latency:** 20.28s
|
| 135 |
+
- **Tokens:** 981 (prompt: 831, completion: 150)
|
| 136 |
+
|
| 137 |
+
<details>
|
| 138 |
+
<summary><strong>📥 Raw Response from Gemini</strong></summary>
|
| 139 |
+
|
| 140 |
+
```json
|
| 141 |
+
{"internal_thinking": "I need to place my first settlement strategically. My priority is high-probability numbers and diverse resources for early expansion (Wood, Brick, Sheep, Wheat). Node 10 offers an excellent combination of resources (Brick, Sheep, Wood) and high-probability numbers (6 and 8), giving it a total of 11 pips. This will allow me to consistently collect the resources needed for roads and additional settlements. While it lacks wheat, the strong production of B, S, and W is crucial for initial development.", "action": {"type": "place_settlement", "parameters": {"location": "10"}}}
|
| 142 |
+
```
|
| 143 |
+
</details>
|
| 144 |
+
|
| 145 |
+
|
| 146 |
+
### ✅ Parse Success
|
| 147 |
+
|
| 148 |
+
|
| 149 |
+
### 🎯 AI Response
|
| 150 |
+
|
| 151 |
+
#### 💭 Internal Thinking
|
| 152 |
+
|
| 153 |
+
> [No reasoning provided] [Response was too brief]
|
| 154 |
+
|
| 155 |
+
|
| 156 |
+
<details>
|
| 157 |
+
<summary><strong>🔍 Raw JSON (Debug)</strong></summary>
|
| 158 |
+
|
| 159 |
+
```json
|
| 160 |
+
{
|
| 161 |
+
"type": "place_settlement",
|
| 162 |
+
"parameters": {
|
| 163 |
+
"location": "10"
|
| 164 |
+
},
|
| 165 |
+
"internal_thinking": "[No reasoning provided] [Response was too brief]"
|
| 166 |
+
}
|
| 167 |
+
```
|
| 168 |
+
</details>
|
| 169 |
+
|
| 170 |
+
|
| 171 |
+
## 🔄 Request #2
|
| 172 |
+
|
| 173 |
+
**Timestamp:** 2026-01-04 01:14:23
|
| 174 |
+
|
| 175 |
+
|
| 176 |
+
<details>
|
| 177 |
+
<summary><strong>📋 Expected Response Schema</strong></summary>
|
| 178 |
+
|
| 179 |
+
```json
|
| 180 |
+
{
|
| 181 |
+
"type": "object",
|
| 182 |
+
"required": [
|
| 183 |
+
"internal_thinking",
|
| 184 |
+
"action"
|
| 185 |
+
],
|
| 186 |
+
"properties": {
|
| 187 |
+
"internal_thinking": {
|
| 188 |
+
"type": "string",
|
| 189 |
+
"description": "Private strategy. What's your plan and why?",
|
| 190 |
+
"minLength": 50
|
| 191 |
+
},
|
| 192 |
+
"note_to_self": {
|
| 193 |
+
"type": "string",
|
| 194 |
+
"description": "Important facts for when it's your turn. Use only if essential for clarity or direct user query. Omit otherwise.",
|
| 195 |
+
"maxLength": 100
|
| 196 |
+
},
|
| 197 |
+
"say_outloud": {
|
| 198 |
+
"type": "string",
|
| 199 |
+
"description": "A short message to other players (max 100 chars). Use for negotiation, threats, or table talk. Keep in mind you pay for speak outload.",
|
| 200 |
+
"maxLength": 100
|
| 201 |
+
},
|
| 202 |
+
"action": {
|
| 203 |
+
"type": "object",
|
| 204 |
+
"required": [
|
| 205 |
+
"type",
|
| 206 |
+
"parameters"
|
| 207 |
+
],
|
| 208 |
+
"properties": {
|
| 209 |
+
"type": {
|
| 210 |
+
"type": "string",
|
| 211 |
+
"description": "The action type (must match one from allowed_actions in constraints)"
|
| 212 |
+
},
|
| 213 |
+
"parameters": {
|
| 214 |
+
"type": "object",
|
| 215 |
+
"description": "Action-specific parameters. If no parameters are needed, provide an empty object.",
|
| 216 |
+
"properties": {
|
| 217 |
+
"target": {
|
| 218 |
+
"type": "string",
|
| 219 |
+
"description": "The target of the action (if applicable)"
|
| 220 |
+
},
|
| 221 |
+
"amount": {
|
| 222 |
+
"type": "number",
|
| 223 |
+
"description": "The amount (if applicable)"
|
| 224 |
+
},
|
| 225 |
+
"location": {
|
| 226 |
+
"type": "string",
|
| 227 |
+
"description": "The location (if applicable)"
|
| 228 |
+
}
|
| 229 |
+
},
|
| 230 |
+
"propertyOrdering": [
|
| 231 |
+
"target",
|
| 232 |
+
"amount",
|
| 233 |
+
"location"
|
| 234 |
+
]
|
| 235 |
+
}
|
| 236 |
+
},
|
| 237 |
+
"propertyOrdering": [
|
| 238 |
+
"type",
|
| 239 |
+
"parameters"
|
| 240 |
+
]
|
| 241 |
+
}
|
| 242 |
+
},
|
| 243 |
+
"propertyOrdering": [
|
| 244 |
+
"internal_thinking",
|
| 245 |
+
"note_to_self",
|
| 246 |
+
"say_outloud",
|
| 247 |
+
"action"
|
| 248 |
+
]
|
| 249 |
+
}
|
| 250 |
+
```
|
| 251 |
+
</details>
|
| 252 |
+
|
| 253 |
+
<details>
|
| 254 |
+
<summary><strong>📤 Prompt Sent to Gemini</strong></summary>
|
| 255 |
+
|
| 256 |
+
```json
|
| 257 |
+
{
|
| 258 |
+
"meta_data": {
|
| 259 |
+
"agent_name": "hadar",
|
| 260 |
+
"role": "You are player 'hadar'. Play strategically to win."
|
| 261 |
+
},
|
| 262 |
+
"task_context": {
|
| 263 |
+
"what_just_happened": "You placed your first settlement at node 10. Now place a road connecting to it.",
|
| 264 |
+
"instructions": "Analyze the game state and select the optimal move from 'allowed_actions'. You have 2 possible actions. If you wish to negotiate or wait for other players, select the 'wait_for_response' action."
|
| 265 |
+
},
|
| 266 |
+
"game_state": "\n 1. LOOKUP TABLES:\n • \"H\" (Hexes): Array where Index = HexID. Value = Resource+Num.\n Example: H[1]=\"W12\" -> Hex 1 is Wood 12.\n • \"N\" (Nodes): Array where Index = NodeID.\n Format: [ [Neighbors], [HexIDs], Port? ]\n Logic: To find yield of Node 10, check N[10]. Get HexIDs (e.g. [1,5]). Look up H[1] and H[5].\n\n2. CODES: W=Wood, B=Brick, S=Sheep, Wh=Wheat, O=Ore, D=Desert.\n ?3=Any 3:1 port, X2=Specific Resource 2:1 port.\n\n3. STATE: \"bld\"=[NodeID, Owner, Type], \"rds\"=[[From,To], Owner].\n\n4. PLAYERS: \"res\"={Resource:Count}, \"dev\"={\"h\":[Hidden Cards], \"r\":[Revealed] (K=Knight)}, \n \"stat\"=[\"LR\" (Longest Road), \"LA\" (Largest Army)].\n\n5. ROBBER: Located at HexID specified in \"meta.robber\". H[id] is blocked.\n\nJSON:\n{\"meta\":{\"curr\":\"hadar\",\"phase\":\"SETUP_FIRST_ROUND\",\"robber\":10,\"dice\":null},\"H\":[\"\",\"W12\",\"S5\",\"W4\",\"S8\",\"B6\",\"W3\",\"Wh8\",\"B10\",\"W11\",\"D\",\"O3\",\"S4\",\"B10\",\"Wh9\",\"Wh6\",\"S11\",\"O5\",\"Wh9\",\"O2\"],\"N\":[null,[[2,9],[1]],[[1,3],[1],\"Wh2\"],[[2,4,11],[2,1],\"Wh2\"],[[3,5],[2]],[[4,6,13],[3,2]],[[5,7],[3],\"B2\"],[[6,15],[3],\"B2\"],[[9,18],[4],\"?3\"],[[8,10,1],[4,1],\"?3\"],[[9,11,20],[5,4,1]],[[10,12,3],[5,2,1]],[[11,13,22],[6,5,2]],[[12,14,5],[6,3,2]],[[13,15,24],[7,6,3]],[[14,16,7],[7,3]],[[15,26],[7],\"O2\"],[[18,28],[8],\"S2\"],[[17,19,8],[8,4]],[[18,20,30],[9,8,4]],[[19,21,10],[9,5,4]],[[20,22,32],[10,9,5]],[[21,23,12],[10,6,5]],[[22,24,34],[11,10,6]],[[23,25,14],[11,7,6]],[[24,26,36],[12,11,7]],[[25,27,16],[12,7],\"O2\"],[[26,38],[12]],[[29,17],[8],\"S2\"],[[28,30,39],[13,8]],[[29,31,19],[13,9,8]],[[30,32,41],[14,13,9]],[[31,33,21],[14,10,9]],[[32,34,43],[15,14,10]],[[33,35,23],[15,11,10]],[[34,36,45],[16,15,11]],[[35,37,25],[16,12,11]],[[36,38,47],[16,12],\"?3\"],[[37,27],[12],\"?3\"],[[40,29],[13]],[[39,41,48],[17,13],\"W2\"],[[40,42,31],[17,14,13]],[[41,43,50],[18,17,14]],[[42,44,33],[18,15,14]],[[43,45,52],[19,18,15]],[[44,46,35],[19,16,15]],[[45,47,54],[19,16]],[[46,37],[16]],[[49,40],[17],\"W2\"],[[48,50],[17]],[[49,51,42],[18,17],\"?3\"],[[50,52],[18],\"?3\"],[[51,53,44],[19,18]],[[52,54],[19],\"?3\"],[[53,46],[19],\"?3\"]],\"state\":{\"bld\":[[10,\"hadar\",\"S\"]],\"rds\":[]},\"players\":{\"hadar\":{\"vp\":1,\"res\":{}},\"shon\":{\"vp\":0,\"res\":{}},\"digeo\":{\"vp\":0,\"res\":{}}}}",
|
| 267 |
+
"constraints": {
|
| 268 |
+
"usage_instructions": "Choose one action type from the list below. Populate the 'parameters' field in your response strictly according to the 'example_parameters' structure provided.",
|
| 269 |
+
"allowed_actions": [
|
| 270 |
+
{
|
| 271 |
+
"action": "build_road",
|
| 272 |
+
"description": "Place your starting road connecting to your settlement",
|
| 273 |
+
"example_parameters": {
|
| 274 |
+
"from": "20",
|
| 275 |
+
"to": "21"
|
| 276 |
+
}
|
| 277 |
+
},
|
| 278 |
+
{
|
| 279 |
+
"action": "wait_for_response",
|
| 280 |
+
"description": "Do nothing on the board, just chat or wait for other players",
|
| 281 |
+
"example_parameters": {}
|
| 282 |
+
}
|
| 283 |
+
]
|
| 284 |
+
}
|
| 285 |
+
}
|
| 286 |
+
```
|
| 287 |
+
</details>
|
| 288 |
+
|
| 289 |
+
|
| 290 |
+
### ✅ Response Received
|
| 291 |
+
|
| 292 |
+
- **Latency:** 5.96s
|
| 293 |
+
- **Tokens:** 943 (prompt: 835, completion: 108)
|
| 294 |
+
|
| 295 |
+
<details>
|
| 296 |
+
<summary><strong>📥 Raw Response from Gemini</strong></summary>
|
| 297 |
+
|
| 298 |
+
```json
|
| 299 |
+
{"internal_thinking":"My settlement is at node 10, which provides Wood, Sheep, and Brick. As it's the first road placement, securing a port early is a strong strategic move for future resource flexibility. Node 9 is a ?3 port and a direct neighbor of node 10. Therefore, I will build a road from 10 to 9 to gain access to this port.","action":{"type":"build_road","parameters":{"target":"hadar_road_1_10-9_0.0_0.0_0.0_0.0_0.0_0.0"}}}
|
| 300 |
+
```
|
| 301 |
+
</details>
|
| 302 |
+
|
| 303 |
+
|
| 304 |
+
### ✅ Parse Success
|
| 305 |
+
|
| 306 |
+
|
| 307 |
+
### 🎯 AI Response
|
| 308 |
+
|
| 309 |
+
#### 💭 Internal Thinking
|
| 310 |
+
|
| 311 |
+
> [No reasoning provided] [Response was too brief]
|
| 312 |
+
|
| 313 |
+
|
| 314 |
+
<details>
|
| 315 |
+
<summary><strong>🔍 Raw JSON (Debug)</strong></summary>
|
| 316 |
+
|
| 317 |
+
```json
|
| 318 |
+
{
|
| 319 |
+
"type": "build_road",
|
| 320 |
+
"parameters": {
|
| 321 |
+
"target": "hadar_road_1_10-9_0.0_0.0_0.0_0.0_0.0_0.0"
|
| 322 |
+
},
|
| 323 |
+
"internal_thinking": "[No reasoning provided] [Response was too brief]"
|
| 324 |
+
}
|
| 325 |
+
```
|
| 326 |
+
</details>
|
| 327 |
+
|
| 328 |
+
|
| 329 |
+
## 🔄 Request #2
|
| 330 |
+
|
| 331 |
+
**Timestamp:** 2026-01-04 01:16:22
|
| 332 |
+
|
| 333 |
+
|
| 334 |
+
<details>
|
| 335 |
+
<summary><strong>📋 Expected Response Schema</strong></summary>
|
| 336 |
+
|
| 337 |
+
```json
|
| 338 |
+
{
|
| 339 |
+
"type": "object",
|
| 340 |
+
"required": [
|
| 341 |
+
"internal_thinking"
|
| 342 |
+
],
|
| 343 |
+
"properties": {
|
| 344 |
+
"internal_thinking": {
|
| 345 |
+
"type": "string",
|
| 346 |
+
"description": "Track what's happening. What are opponents doing? What's your strategy for next turn?",
|
| 347 |
+
"minLength": 30
|
| 348 |
+
},
|
| 349 |
+
"note_to_self": {
|
| 350 |
+
"type": "string",
|
| 351 |
+
"description": "Important facts for when it's your turn. Use only if essential for clarity or direct user query. Omit otherwise.",
|
| 352 |
+
"maxLength": 100
|
| 353 |
+
},
|
| 354 |
+
"say_outloud": {
|
| 355 |
+
"type": "string",
|
| 356 |
+
"description": "Optional message to other players (max 100 chars). Propose trades or negotiate. You pay for this.",
|
| 357 |
+
"maxLength": 100
|
| 358 |
+
}
|
| 359 |
+
},
|
| 360 |
+
"propertyOrdering": [
|
| 361 |
+
"internal_thinking",
|
| 362 |
+
"note_to_self",
|
| 363 |
+
"say_outloud"
|
| 364 |
+
]
|
| 365 |
+
}
|
| 366 |
+
```
|
| 367 |
+
</details>
|
| 368 |
+
|
| 369 |
+
<details>
|
| 370 |
+
<summary><strong>📤 Prompt Sent to Gemini</strong></summary>
|
| 371 |
+
|
| 372 |
+
```json
|
| 373 |
+
{
|
| 374 |
+
"meta_data": {
|
| 375 |
+
"agent_name": "hadar",
|
| 376 |
+
"role": "You are player 'hadar'. Play strategically to win."
|
| 377 |
+
},
|
| 378 |
+
"task_context": {
|
| 379 |
+
"what_just_happened": "Player shon is placing their first settlement.",
|
| 380 |
+
"instructions": "Analyze the game state and select the optimal move from 'allowed_actions'. If you wish to negotiate or wait for other players, select the 'wait_for_response' action."
|
| 381 |
+
},
|
| 382 |
+
"game_state": "\n 1. LOOKUP TABLES:\n • \"H\" (Hexes): Array where Index = HexID. Value = Resource+Num.\n Example: H[1]=\"W12\" -> Hex 1 is Wood 12.\n • \"N\" (Nodes): Array where Index = NodeID.\n Format: [ [Neighbors], [HexIDs], Port? ]\n Logic: To find yield of Node 10, check N[10]. Get HexIDs (e.g. [1,5]). Look up H[1] and H[5].\n\n2. CODES: W=Wood, B=Brick, S=Sheep, Wh=Wheat, O=Ore, D=Desert.\n ?3=Any 3:1 port, X2=Specific Resource 2:1 port.\n\n3. STATE: \"bld\"=[NodeID, Owner, Type], \"rds\"=[[From,To], Owner].\n\n4. PLAYERS: \"res\"={Resource:Count}, \"dev\"={\"h\":[Hidden Cards], \"r\":[Revealed] (K=Knight)}, \n \"stat\"=[\"LR\" (Longest Road), \"LA\" (Largest Army)].\n\n5. ROBBER: Located at HexID specified in \"meta.robber\". H[id] is blocked.\n\nJSON:\n{\"meta\":{\"curr\":\"shon\",\"phase\":\"SETUP_FIRST_ROUND\",\"robber\":10,\"dice\":null},\"H\":[\"\",\"W12\",\"S5\",\"W4\",\"S8\",\"B6\",\"W3\",\"Wh8\",\"B10\",\"W11\",\"D\",\"O3\",\"S4\",\"B10\",\"Wh9\",\"Wh6\",\"S11\",\"O5\",\"Wh9\",\"O2\"],\"N\":[null,[[2,9],[1]],[[1,3],[1],\"Wh2\"],[[2,4,11],[2,1],\"Wh2\"],[[3,5],[2]],[[4,6,13],[3,2]],[[5,7],[3],\"B2\"],[[6,15],[3],\"B2\"],[[9,18],[4],\"?3\"],[[8,10,1],[4,1],\"?3\"],[[9,11,20],[5,4,1]],[[10,12,3],[5,2,1]],[[11,13,22],[6,5,2]],[[12,14,5],[6,3,2]],[[13,15,24],[7,6,3]],[[14,16,7],[7,3]],[[15,26],[7],\"O2\"],[[18,28],[8],\"S2\"],[[17,19,8],[8,4]],[[18,20,30],[9,8,4]],[[19,21,10],[9,5,4]],[[20,22,32],[10,9,5]],[[21,23,12],[10,6,5]],[[22,24,34],[11,10,6]],[[23,25,14],[11,7,6]],[[24,26,36],[12,11,7]],[[25,27,16],[12,7],\"O2\"],[[26,38],[12]],[[29,17],[8],\"S2\"],[[28,30,39],[13,8]],[[29,31,19],[13,9,8]],[[30,32,41],[14,13,9]],[[31,33,21],[14,10,9]],[[32,34,43],[15,14,10]],[[33,35,23],[15,11,10]],[[34,36,45],[16,15,11]],[[35,37,25],[16,12,11]],[[36,38,47],[16,12],\"?3\"],[[37,27],[12],\"?3\"],[[40,29],[13]],[[39,41,48],[17,13],\"W2\"],[[40,42,31],[17,14,13]],[[41,43,50],[18,17,14]],[[42,44,33],[18,15,14]],[[43,45,52],[19,18,15]],[[44,46,35],[19,16,15]],[[45,47,54],[19,16]],[[46,37],[16]],[[49,40],[17],\"W2\"],[[48,50],[17]],[[49,51,42],[18,17],\"?3\"],[[50,52],[18],\"?3\"],[[51,53,44],[19,18]],[[52,54],[19],\"?3\"],[[53,46],[19],\"?3\"]],\"state\":{\"bld\":[[10,\"hadar\",\"S\"]],\"rds\":[[[10,9],\"hadar\"]]},\"players\":{\"hadar\":{\"vp\":1,\"res\":{}},\"shon\":{\"vp\":0,\"res\":{}},\"digeo\":{\"vp\":0,\"res\":{}}}}"
|
| 383 |
+
}
|
| 384 |
+
```
|
| 385 |
+
</details>
|
| 386 |
+
|
| 387 |
+
|
| 388 |
+
### ✅ Response Received
|
| 389 |
+
|
| 390 |
+
- **Latency:** 3.51s
|
| 391 |
+
- **Tokens:** 816 (prompt: 697, completion: 119)
|
| 392 |
+
|
| 393 |
+
<details>
|
| 394 |
+
<summary><strong>📥 Raw Response from Gemini</strong></summary>
|
| 395 |
+
|
| 396 |
+
```json
|
| 397 |
+
{"internal_thinking": "It is currently player shon's turn to place their first settlement. I need to wait for shon, then digeo, then shon again to place their second settlement before it is my turn to place my second settlement and road. I will observe their placements to plan my next move, aiming for complementary resources and good numbers.", "note_to_self": "My first settlement is at Node 10 (B6, S8, W12). I am waiting for other players to complete their setup moves."}
|
| 398 |
+
```
|
| 399 |
+
</details>
|
| 400 |
+
|
| 401 |
+
|
| 402 |
+
### ✅ Parse Success
|
| 403 |
+
|
| 404 |
+
|
| 405 |
+
### 🎯 AI Response
|
| 406 |
+
|
| 407 |
+
#### 💭 Internal Thinking
|
| 408 |
+
|
| 409 |
+
> It is currently player shon's turn to place their first settlement. I need to wait for shon, then digeo, then shon again to place their second settlement before it is my turn to place my second settlement and road. I will observe their placements to plan my next move, aiming for complementary resources and good numbers.
|
| 410 |
+
|
| 411 |
+
#### 📝 Note to Self
|
| 412 |
+
|
| 413 |
+
*"My first settlement is at Node 10 (B6, S8, W12). I am waiting for other players to complete their setup moves."*
|
| 414 |
+
|
| 415 |
+
|
| 416 |
+
<details>
|
| 417 |
+
<summary><strong>🔍 Raw JSON (Debug)</strong></summary>
|
| 418 |
+
|
| 419 |
+
```json
|
| 420 |
+
{
|
| 421 |
+
"internal_thinking": "It is currently player shon's turn to place their first settlement. I need to wait for shon, then digeo, then shon again to place their second settlement before it is my turn to place my second settlement and road. I will observe their placements to plan my next move, aiming for complementary resources and good numbers.",
|
| 422 |
+
"note_to_self": "My first settlement is at Node 10 (B6, S8, W12). I am waiting for other players to complete their setup moves."
|
| 423 |
+
}
|
| 424 |
+
```
|
| 425 |
+
</details>
|
| 426 |
+
|
| 427 |
+
|
| 428 |
+
## 🔄 Request #2
|
| 429 |
+
|
| 430 |
+
**Timestamp:** 2026-01-04 01:18:57
|
| 431 |
+
|
| 432 |
+
|
| 433 |
+
<details>
|
| 434 |
+
<summary><strong>📋 Expected Response Schema</strong></summary>
|
| 435 |
+
|
| 436 |
+
```json
|
| 437 |
+
{
|
| 438 |
+
"type": "object",
|
| 439 |
+
"required": [
|
| 440 |
+
"internal_thinking"
|
| 441 |
+
],
|
| 442 |
+
"properties": {
|
| 443 |
+
"internal_thinking": {
|
| 444 |
+
"type": "string",
|
| 445 |
+
"description": "Track what's happening. What are opponents doing? What's your strategy for next turn?",
|
| 446 |
+
"minLength": 30
|
| 447 |
+
},
|
| 448 |
+
"note_to_self": {
|
| 449 |
+
"type": "string",
|
| 450 |
+
"description": "Important facts for when it's your turn. Use only if essential for clarity or direct user query. Omit otherwise.",
|
| 451 |
+
"maxLength": 100
|
| 452 |
+
},
|
| 453 |
+
"say_outloud": {
|
| 454 |
+
"type": "string",
|
| 455 |
+
"description": "Optional message to other players (max 100 chars). Propose trades or negotiate. You pay for this.",
|
| 456 |
+
"maxLength": 100
|
| 457 |
+
}
|
| 458 |
+
},
|
| 459 |
+
"propertyOrdering": [
|
| 460 |
+
"internal_thinking",
|
| 461 |
+
"note_to_self",
|
| 462 |
+
"say_outloud"
|
| 463 |
+
]
|
| 464 |
+
}
|
| 465 |
+
```
|
| 466 |
+
</details>
|
| 467 |
+
|
| 468 |
+
<details>
|
| 469 |
+
<summary><strong>📤 Prompt Sent to Gemini</strong></summary>
|
| 470 |
+
|
| 471 |
+
```json
|
| 472 |
+
{
|
| 473 |
+
"meta_data": {
|
| 474 |
+
"agent_name": "hadar",
|
| 475 |
+
"role": "You are player 'hadar'. Play strategically to win."
|
| 476 |
+
},
|
| 477 |
+
"task_context": {
|
| 478 |
+
"what_just_happened": "Player shon is placing their first settlement.",
|
| 479 |
+
"instructions": "Analyze the game state and select the optimal move from 'allowed_actions'. If you wish to negotiate or wait for other players, select the 'wait_for_response' action."
|
| 480 |
+
},
|
| 481 |
+
"game_state": "\n 1. LOOKUP TABLES:\n • \"H\" (Hexes): Array where Index = HexID. Value = Resource+Num.\n Example: H[1]=\"W12\" -> Hex 1 is Wood 12.\n • \"N\" (Nodes): Array where Index = NodeID.\n Format: [ [Neighbors], [HexIDs], Port? ]\n Logic: To find yield of Node 10, check N[10]. Get HexIDs (e.g. [1,5]). Look up H[1] and H[5].\n\n2. CODES: W=Wood, B=Brick, S=Sheep, Wh=Wheat, O=Ore, D=Desert.\n ?3=Any 3:1 port, X2=Specific Resource 2:1 port.\n\n3. STATE: \"bld\"=[NodeID, Owner, Type], \"rds\"=[[From,To], Owner].\n\n4. PLAYERS: \"res\"={Resource:Count}, \"dev\"={\"h\":[Hidden Cards], \"r\":[Revealed] (K=Knight)}, \n \"stat\"=[\"LR\" (Longest Road), \"LA\" (Largest Army)].\n\n5. ROBBER: Located at HexID specified in \"meta.robber\". H[id] is blocked.\n\nJSON:\n{\"meta\":{\"curr\":\"shon\",\"phase\":\"SETUP_FIRST_ROUND\",\"robber\":10,\"dice\":null},\"H\":[\"\",\"W12\",\"S5\",\"W4\",\"S8\",\"B6\",\"W3\",\"Wh8\",\"B10\",\"W11\",\"D\",\"O3\",\"S4\",\"B10\",\"Wh9\",\"Wh6\",\"S11\",\"O5\",\"Wh9\",\"O2\"],\"N\":[null,[[2,9],[1]],[[1,3],[1],\"Wh2\"],[[2,4,11],[2,1],\"Wh2\"],[[3,5],[2]],[[4,6,13],[3,2]],[[5,7],[3],\"B2\"],[[6,15],[3],\"B2\"],[[9,18],[4],\"?3\"],[[8,10,1],[4,1],\"?3\"],[[9,11,20],[5,4,1]],[[10,12,3],[5,2,1]],[[11,13,22],[6,5,2]],[[12,14,5],[6,3,2]],[[13,15,24],[7,6,3]],[[14,16,7],[7,3]],[[15,26],[7],\"O2\"],[[18,28],[8],\"S2\"],[[17,19,8],[8,4]],[[18,20,30],[9,8,4]],[[19,21,10],[9,5,4]],[[20,22,32],[10,9,5]],[[21,23,12],[10,6,5]],[[22,24,34],[11,10,6]],[[23,25,14],[11,7,6]],[[24,26,36],[12,11,7]],[[25,27,16],[12,7],\"O2\"],[[26,38],[12]],[[29,17],[8],\"S2\"],[[28,30,39],[13,8]],[[29,31,19],[13,9,8]],[[30,32,41],[14,13,9]],[[31,33,21],[14,10,9]],[[32,34,43],[15,14,10]],[[33,35,23],[15,11,10]],[[34,36,45],[16,15,11]],[[35,37,25],[16,12,11]],[[36,38,47],[16,12],\"?3\"],[[37,27],[12],\"?3\"],[[40,29],[13]],[[39,41,48],[17,13],\"W2\"],[[40,42,31],[17,14,13]],[[41,43,50],[18,17,14]],[[42,44,33],[18,15,14]],[[43,45,52],[19,18,15]],[[44,46,35],[19,16,15]],[[45,47,54],[19,16]],[[46,37],[16]],[[49,40],[17],\"W2\"],[[48,50],[17]],[[49,51,42],[18,17],\"?3\"],[[50,52],[18],\"?3\"],[[51,53,44],[19,18]],[[52,54],[19],\"?3\"],[[53,46],[19],\"?3\"]],\"state\":{\"bld\":[[10,\"hadar\",\"S\"]],\"rds\":[[[10,9],\"hadar\"]]},\"players\":{\"hadar\":{\"vp\":1,\"res\":{}},\"shon\":{\"vp\":0,\"res\":{}},\"digeo\":{\"vp\":0,\"res\":{}}}}"
|
| 482 |
+
}
|
| 483 |
+
```
|
| 484 |
+
</details>
|
| 485 |
+
|
examples/ai_testing/my_games/ai_logs/session_20260104_011246/player_shon.md
ADDED
|
@@ -0,0 +1,359 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# 🤖 AI Agent Log - Player SHON
|
| 2 |
+
|
| 3 |
+
---
|
| 4 |
+
|
| 5 |
+
**Session:** `session_20260104_011246`
|
| 6 |
+
|
| 7 |
+
**Model:** `models/gemini-2.5-flash`
|
| 8 |
+
|
| 9 |
+
**Started:** 2026-01-04 01:13:38
|
| 10 |
+
|
| 11 |
+
---
|
| 12 |
+
|
| 13 |
+
|
| 14 |
+
## 🔄 Request #1
|
| 15 |
+
|
| 16 |
+
**Timestamp:** 2026-01-04 01:13:38
|
| 17 |
+
|
| 18 |
+
|
| 19 |
+
<details>
|
| 20 |
+
<summary><strong>📋 Expected Response Schema</strong></summary>
|
| 21 |
+
|
| 22 |
+
```json
|
| 23 |
+
{
|
| 24 |
+
"type": "object",
|
| 25 |
+
"required": [
|
| 26 |
+
"internal_thinking"
|
| 27 |
+
],
|
| 28 |
+
"properties": {
|
| 29 |
+
"internal_thinking": {
|
| 30 |
+
"type": "string",
|
| 31 |
+
"description": "Track what's happening. What are opponents doing? What's your strategy for next turn?",
|
| 32 |
+
"minLength": 30
|
| 33 |
+
},
|
| 34 |
+
"note_to_self": {
|
| 35 |
+
"type": "string",
|
| 36 |
+
"description": "Important facts for when it's your turn. Use only if essential for clarity or direct user query. Omit otherwise.",
|
| 37 |
+
"maxLength": 100
|
| 38 |
+
},
|
| 39 |
+
"say_outloud": {
|
| 40 |
+
"type": "string",
|
| 41 |
+
"description": "Optional message to other players (max 100 chars). Propose trades or negotiate. You pay for this.",
|
| 42 |
+
"maxLength": 100
|
| 43 |
+
}
|
| 44 |
+
},
|
| 45 |
+
"propertyOrdering": [
|
| 46 |
+
"internal_thinking",
|
| 47 |
+
"note_to_self",
|
| 48 |
+
"say_outloud"
|
| 49 |
+
]
|
| 50 |
+
}
|
| 51 |
+
```
|
| 52 |
+
</details>
|
| 53 |
+
|
| 54 |
+
<details>
|
| 55 |
+
<summary><strong>📤 Prompt Sent to Gemini</strong></summary>
|
| 56 |
+
|
| 57 |
+
```json
|
| 58 |
+
{
|
| 59 |
+
"meta_data": {
|
| 60 |
+
"agent_name": "shon",
|
| 61 |
+
"role": "You are player 'shon'. Play strategically to win."
|
| 62 |
+
},
|
| 63 |
+
"task_context": {
|
| 64 |
+
"what_just_happened": "Player hadar is placing their first settlement.",
|
| 65 |
+
"instructions": "Analyze the game state and select the optimal move from 'allowed_actions'. If you wish to negotiate or wait for other players, select the 'wait_for_response' action."
|
| 66 |
+
},
|
| 67 |
+
"game_state": "\n 1. LOOKUP TABLES:\n • \"H\" (Hexes): Array where Index = HexID. Value = Resource+Num.\n Example: H[1]=\"W12\" -> Hex 1 is Wood 12.\n • \"N\" (Nodes): Array where Index = NodeID.\n Format: [ [Neighbors], [HexIDs], Port? ]\n Logic: To find yield of Node 10, check N[10]. Get HexIDs (e.g. [1,5]). Look up H[1] and H[5].\n\n2. CODES: W=Wood, B=Brick, S=Sheep, Wh=Wheat, O=Ore, D=Desert.\n ?3=Any 3:1 port, X2=Specific Resource 2:1 port.\n\n3. STATE: \"bld\"=[NodeID, Owner, Type], \"rds\"=[[From,To], Owner].\n\n4. PLAYERS: \"res\"={Resource:Count}, \"dev\"={\"h\":[Hidden Cards], \"r\":[Revealed] (K=Knight)}, \n \"stat\"=[\"LR\" (Longest Road), \"LA\" (Largest Army)].\n\n5. ROBBER: Located at HexID specified in \"meta.robber\". H[id] is blocked.\n\nJSON:\n{\"meta\":{\"curr\":\"hadar\",\"phase\":\"SETUP_FIRST_ROUND\",\"robber\":10,\"dice\":null},\"H\":[\"\",\"W12\",\"S5\",\"W4\",\"S8\",\"B6\",\"W3\",\"Wh8\",\"B10\",\"W11\",\"D\",\"O3\",\"S4\",\"B10\",\"Wh9\",\"Wh6\",\"S11\",\"O5\",\"Wh9\",\"O2\"],\"N\":[null,[[2,9],[1]],[[1,3],[1],\"Wh2\"],[[2,4,11],[2,1],\"Wh2\"],[[3,5],[2]],[[4,6,13],[3,2]],[[5,7],[3],\"B2\"],[[6,15],[3],\"B2\"],[[9,18],[4],\"?3\"],[[8,10,1],[4,1],\"?3\"],[[9,11,20],[5,4,1]],[[10,12,3],[5,2,1]],[[11,13,22],[6,5,2]],[[12,14,5],[6,3,2]],[[13,15,24],[7,6,3]],[[14,16,7],[7,3]],[[15,26],[7],\"O2\"],[[18,28],[8],\"S2\"],[[17,19,8],[8,4]],[[18,20,30],[9,8,4]],[[19,21,10],[9,5,4]],[[20,22,32],[10,9,5]],[[21,23,12],[10,6,5]],[[22,24,34],[11,10,6]],[[23,25,14],[11,7,6]],[[24,26,36],[12,11,7]],[[25,27,16],[12,7],\"O2\"],[[26,38],[12]],[[29,17],[8],\"S2\"],[[28,30,39],[13,8]],[[29,31,19],[13,9,8]],[[30,32,41],[14,13,9]],[[31,33,21],[14,10,9]],[[32,34,43],[15,14,10]],[[33,35,23],[15,11,10]],[[34,36,45],[16,15,11]],[[35,37,25],[16,12,11]],[[36,38,47],[16,12],\"?3\"],[[37,27],[12],\"?3\"],[[40,29],[13]],[[39,41,48],[17,13],\"W2\"],[[40,42,31],[17,14,13]],[[41,43,50],[18,17,14]],[[42,44,33],[18,15,14]],[[43,45,52],[19,18,15]],[[44,46,35],[19,16,15]],[[45,47,54],[19,16]],[[46,37],[16]],[[49,40],[17],\"W2\"],[[48,50],[17]],[[49,51,42],[18,17],\"?3\"],[[50,52],[18],\"?3\"],[[51,53,44],[19,18]],[[52,54],[19],\"?3\"],[[53,46],[19],\"?3\"]],\"state\":{\"bld\":[],\"rds\":[]},\"players\":{\"hadar\":{\"vp\":0,\"res\":{}},\"shon\":{\"vp\":0,\"res\":{}},\"digeo\":{\"vp\":0,\"res\":{}}}}"
|
| 68 |
+
}
|
| 69 |
+
```
|
| 70 |
+
</details>
|
| 71 |
+
|
| 72 |
+
|
| 73 |
+
### ✅ Response Received
|
| 74 |
+
|
| 75 |
+
- **Latency:** 12.83s
|
| 76 |
+
- **Tokens:** 821 (prompt: 687, completion: 134)
|
| 77 |
+
|
| 78 |
+
<details>
|
| 79 |
+
<summary><strong>📥 Raw Response from Gemini</strong></summary>
|
| 80 |
+
|
| 81 |
+
```json
|
| 82 |
+
{"internal_thinking": "Player hadar is placing their first settlement. I need to observe their choice to inform my strategy for my own first settlement. My general strategy for the first settlement is to prioritize a good mix of Wheat and Ore for future city and development card production, or strong Wood, Brick, and Sheep production with high-probability numbers if the prime Wheat/Ore spots are taken. I will also consider access to a useful port for my second settlement. Currently, I am waiting for hadar's move.", "say_outloud": ""}
|
| 83 |
+
```
|
| 84 |
+
</details>
|
| 85 |
+
|
| 86 |
+
|
| 87 |
+
### ✅ Parse Success
|
| 88 |
+
|
| 89 |
+
|
| 90 |
+
### 🎯 AI Response
|
| 91 |
+
|
| 92 |
+
#### 💭 Internal Thinking
|
| 93 |
+
|
| 94 |
+
> Player hadar is placing their first settlement. I need to observe their choice to inform my strategy for my own first settlement. My general strategy for the first settlement is to prioritize a good mix of Wheat and Ore for future city and development card production, or strong Wood, Brick, and Sheep production with high-probability numbers if the prime Wheat/Ore spots are taken. I will also consider access to a useful port for my second settlement. Currently, I am waiting for hadar's move.
|
| 95 |
+
|
| 96 |
+
|
| 97 |
+
<details>
|
| 98 |
+
<summary><strong>🔍 Raw JSON (Debug)</strong></summary>
|
| 99 |
+
|
| 100 |
+
```json
|
| 101 |
+
{
|
| 102 |
+
"internal_thinking": "Player hadar is placing their first settlement. I need to observe their choice to inform my strategy for my own first settlement. My general strategy for the first settlement is to prioritize a good mix of Wheat and Ore for future city and development card production, or strong Wood, Brick, and Sheep production with high-probability numbers if the prime Wheat/Ore spots are taken. I will also consider access to a useful port for my second settlement. Currently, I am waiting for hadar's move.",
|
| 103 |
+
"say_outloud": ""
|
| 104 |
+
}
|
| 105 |
+
```
|
| 106 |
+
</details>
|
| 107 |
+
|
| 108 |
+
|
| 109 |
+
## 🔄 Request #2
|
| 110 |
+
|
| 111 |
+
**Timestamp:** 2026-01-04 01:14:29
|
| 112 |
+
|
| 113 |
+
|
| 114 |
+
<details>
|
| 115 |
+
<summary><strong>📋 Expected Response Schema</strong></summary>
|
| 116 |
+
|
| 117 |
+
```json
|
| 118 |
+
{
|
| 119 |
+
"type": "object",
|
| 120 |
+
"required": [
|
| 121 |
+
"internal_thinking"
|
| 122 |
+
],
|
| 123 |
+
"properties": {
|
| 124 |
+
"internal_thinking": {
|
| 125 |
+
"type": "string",
|
| 126 |
+
"description": "Track what's happening. What are opponents doing? What's your strategy for next turn?",
|
| 127 |
+
"minLength": 30
|
| 128 |
+
},
|
| 129 |
+
"note_to_self": {
|
| 130 |
+
"type": "string",
|
| 131 |
+
"description": "Important facts for when it's your turn. Use only if essential for clarity or direct user query. Omit otherwise.",
|
| 132 |
+
"maxLength": 100
|
| 133 |
+
},
|
| 134 |
+
"say_outloud": {
|
| 135 |
+
"type": "string",
|
| 136 |
+
"description": "Optional message to other players (max 100 chars). Propose trades or negotiate. You pay for this.",
|
| 137 |
+
"maxLength": 100
|
| 138 |
+
}
|
| 139 |
+
},
|
| 140 |
+
"propertyOrdering": [
|
| 141 |
+
"internal_thinking",
|
| 142 |
+
"note_to_self",
|
| 143 |
+
"say_outloud"
|
| 144 |
+
]
|
| 145 |
+
}
|
| 146 |
+
```
|
| 147 |
+
</details>
|
| 148 |
+
|
| 149 |
+
<details>
|
| 150 |
+
<summary><strong>📤 Prompt Sent to Gemini</strong></summary>
|
| 151 |
+
|
| 152 |
+
```json
|
| 153 |
+
{
|
| 154 |
+
"meta_data": {
|
| 155 |
+
"agent_name": "shon",
|
| 156 |
+
"role": "You are player 'shon'. Play strategically to win."
|
| 157 |
+
},
|
| 158 |
+
"task_context": {
|
| 159 |
+
"what_just_happened": "Player hadar placed their first settlement at node 10 and is now choosing where to place their starting road.",
|
| 160 |
+
"instructions": "Analyze the game state and select the optimal move from 'allowed_actions'. If you wish to negotiate or wait for other players, select the 'wait_for_response' action."
|
| 161 |
+
},
|
| 162 |
+
"game_state": "\n 1. LOOKUP TABLES:\n • \"H\" (Hexes): Array where Index = HexID. Value = Resource+Num.\n Example: H[1]=\"W12\" -> Hex 1 is Wood 12.\n • \"N\" (Nodes): Array where Index = NodeID.\n Format: [ [Neighbors], [HexIDs], Port? ]\n Logic: To find yield of Node 10, check N[10]. Get HexIDs (e.g. [1,5]). Look up H[1] and H[5].\n\n2. CODES: W=Wood, B=Brick, S=Sheep, Wh=Wheat, O=Ore, D=Desert.\n ?3=Any 3:1 port, X2=Specific Resource 2:1 port.\n\n3. STATE: \"bld\"=[NodeID, Owner, Type], \"rds\"=[[From,To], Owner].\n\n4. PLAYERS: \"res\"={Resource:Count}, \"dev\"={\"h\":[Hidden Cards], \"r\":[Revealed] (K=Knight)}, \n \"stat\"=[\"LR\" (Longest Road), \"LA\" (Largest Army)].\n\n5. ROBBER: Located at HexID specified in \"meta.robber\". H[id] is blocked.\n\nJSON:\n{\"meta\":{\"curr\":\"hadar\",\"phase\":\"SETUP_FIRST_ROUND\",\"robber\":10,\"dice\":null},\"H\":[\"\",\"W12\",\"S5\",\"W4\",\"S8\",\"B6\",\"W3\",\"Wh8\",\"B10\",\"W11\",\"D\",\"O3\",\"S4\",\"B10\",\"Wh9\",\"Wh6\",\"S11\",\"O5\",\"Wh9\",\"O2\"],\"N\":[null,[[2,9],[1]],[[1,3],[1],\"Wh2\"],[[2,4,11],[2,1],\"Wh2\"],[[3,5],[2]],[[4,6,13],[3,2]],[[5,7],[3],\"B2\"],[[6,15],[3],\"B2\"],[[9,18],[4],\"?3\"],[[8,10,1],[4,1],\"?3\"],[[9,11,20],[5,4,1]],[[10,12,3],[5,2,1]],[[11,13,22],[6,5,2]],[[12,14,5],[6,3,2]],[[13,15,24],[7,6,3]],[[14,16,7],[7,3]],[[15,26],[7],\"O2\"],[[18,28],[8],\"S2\"],[[17,19,8],[8,4]],[[18,20,30],[9,8,4]],[[19,21,10],[9,5,4]],[[20,22,32],[10,9,5]],[[21,23,12],[10,6,5]],[[22,24,34],[11,10,6]],[[23,25,14],[11,7,6]],[[24,26,36],[12,11,7]],[[25,27,16],[12,7],\"O2\"],[[26,38],[12]],[[29,17],[8],\"S2\"],[[28,30,39],[13,8]],[[29,31,19],[13,9,8]],[[30,32,41],[14,13,9]],[[31,33,21],[14,10,9]],[[32,34,43],[15,14,10]],[[33,35,23],[15,11,10]],[[34,36,45],[16,15,11]],[[35,37,25],[16,12,11]],[[36,38,47],[16,12],\"?3\"],[[37,27],[12],\"?3\"],[[40,29],[13]],[[39,41,48],[17,13],\"W2\"],[[40,42,31],[17,14,13]],[[41,43,50],[18,17,14]],[[42,44,33],[18,15,14]],[[43,45,52],[19,18,15]],[[44,46,35],[19,16,15]],[[45,47,54],[19,16]],[[46,37],[16]],[[49,40],[17],\"W2\"],[[48,50],[17]],[[49,51,42],[18,17],\"?3\"],[[50,52],[18],\"?3\"],[[51,53,44],[19,18]],[[52,54],[19],\"?3\"],[[53,46],[19],\"?3\"]],\"state\":{\"bld\":[[10,\"hadar\",\"S\"]],\"rds\":[]},\"players\":{\"hadar\":{\"vp\":1,\"res\":{}},\"shon\":{\"vp\":0,\"res\":{}},\"digeo\":{\"vp\":0,\"res\":{}}}}"
|
| 163 |
+
}
|
| 164 |
+
```
|
| 165 |
+
</details>
|
| 166 |
+
|
| 167 |
+
|
| 168 |
+
### ✅ Response Received
|
| 169 |
+
|
| 170 |
+
- **Latency:** 19.89s
|
| 171 |
+
- **Tokens:** 877 (prompt: 708, completion: 169)
|
| 172 |
+
|
| 173 |
+
<details>
|
| 174 |
+
<summary><strong>📥 Raw Response from Gemini</strong></summary>
|
| 175 |
+
|
| 176 |
+
```json
|
| 177 |
+
{"internal_thinking": "Hadar placed their first settlement at Node 10, securing Wood 12, Sheep 8, and Brick 6, which is a strong start for basic resources. I anticipate Hadar might place their road from 10 to 20 to secure Node 20 (B6, S8, W11), which is an excellent spot due to its high-probability numbers and resource diversity. For my first settlement, my primary target is Node 20 if it remains available. If blocked, Node 11 (B6, S5, W12) is a strong alternative for basic resources. I'll also consider Node 41 (O5, Wh9, B10) for a more development-focused start. I will observe Hadar's road placement and Digeo's turn before making my final decision.", "say_outloud": ""}
|
| 178 |
+
```
|
| 179 |
+
</details>
|
| 180 |
+
|
| 181 |
+
|
| 182 |
+
### ✅ Parse Success
|
| 183 |
+
|
| 184 |
+
|
| 185 |
+
### 🎯 AI Response
|
| 186 |
+
|
| 187 |
+
#### 💭 Internal Thinking
|
| 188 |
+
|
| 189 |
+
> Hadar placed their first settlement at Node 10, securing Wood 12, Sheep 8, and Brick 6, which is a strong start for basic resources. I anticipate Hadar might place their road from 10 to 20 to secure Node 20 (B6, S8, W11), which is an excellent spot due to its high-probability numbers and resource diversity. For my first settlement, my primary target is Node 20 if it remains available. If blocked, Node 11 (B6, S5, W12) is a strong alternative for basic resources. I'll also consider Node 41 (O5, Wh9, B10) for a more development-focused start. I will observe Hadar's road placement and Digeo's turn before making my final decision.
|
| 190 |
+
|
| 191 |
+
|
| 192 |
+
<details>
|
| 193 |
+
<summary><strong>🔍 Raw JSON (Debug)</strong></summary>
|
| 194 |
+
|
| 195 |
+
```json
|
| 196 |
+
{
|
| 197 |
+
"internal_thinking": "Hadar placed their first settlement at Node 10, securing Wood 12, Sheep 8, and Brick 6, which is a strong start for basic resources. I anticipate Hadar might place their road from 10 to 20 to secure Node 20 (B6, S8, W11), which is an excellent spot due to its high-probability numbers and resource diversity. For my first settlement, my primary target is Node 20 if it remains available. If blocked, Node 11 (B6, S5, W12) is a strong alternative for basic resources. I'll also consider Node 41 (O5, Wh9, B10) for a more development-focused start. I will observe Hadar's road placement and Digeo's turn before making my final decision.",
|
| 198 |
+
"say_outloud": ""
|
| 199 |
+
}
|
| 200 |
+
```
|
| 201 |
+
</details>
|
| 202 |
+
|
| 203 |
+
|
| 204 |
+
## 🔄 Request #2
|
| 205 |
+
|
| 206 |
+
**Timestamp:** 2026-01-04 01:16:25
|
| 207 |
+
|
| 208 |
+
|
| 209 |
+
<details>
|
| 210 |
+
<summary><strong>📋 Expected Response Schema</strong></summary>
|
| 211 |
+
|
| 212 |
+
```json
|
| 213 |
+
{
|
| 214 |
+
"type": "object",
|
| 215 |
+
"required": [
|
| 216 |
+
"internal_thinking",
|
| 217 |
+
"action"
|
| 218 |
+
],
|
| 219 |
+
"properties": {
|
| 220 |
+
"internal_thinking": {
|
| 221 |
+
"type": "string",
|
| 222 |
+
"description": "Private strategy. What's your plan and why?",
|
| 223 |
+
"minLength": 50
|
| 224 |
+
},
|
| 225 |
+
"note_to_self": {
|
| 226 |
+
"type": "string",
|
| 227 |
+
"description": "Important facts for when it's your turn. Use only if essential for clarity or direct user query. Omit otherwise.",
|
| 228 |
+
"maxLength": 100
|
| 229 |
+
},
|
| 230 |
+
"say_outloud": {
|
| 231 |
+
"type": "string",
|
| 232 |
+
"description": "A short message to other players (max 100 chars). Use for negotiation, threats, or table talk. Keep in mind you pay for speak outload.",
|
| 233 |
+
"maxLength": 100
|
| 234 |
+
},
|
| 235 |
+
"action": {
|
| 236 |
+
"type": "object",
|
| 237 |
+
"required": [
|
| 238 |
+
"type",
|
| 239 |
+
"parameters"
|
| 240 |
+
],
|
| 241 |
+
"properties": {
|
| 242 |
+
"type": {
|
| 243 |
+
"type": "string",
|
| 244 |
+
"description": "The action type (must match one from allowed_actions in constraints)"
|
| 245 |
+
},
|
| 246 |
+
"parameters": {
|
| 247 |
+
"type": "object",
|
| 248 |
+
"description": "Action-specific parameters. If no parameters are needed, provide an empty object.",
|
| 249 |
+
"properties": {
|
| 250 |
+
"target": {
|
| 251 |
+
"type": "string",
|
| 252 |
+
"description": "The target of the action (if applicable)"
|
| 253 |
+
},
|
| 254 |
+
"amount": {
|
| 255 |
+
"type": "number",
|
| 256 |
+
"description": "The amount (if applicable)"
|
| 257 |
+
},
|
| 258 |
+
"location": {
|
| 259 |
+
"type": "string",
|
| 260 |
+
"description": "The location (if applicable)"
|
| 261 |
+
}
|
| 262 |
+
},
|
| 263 |
+
"propertyOrdering": [
|
| 264 |
+
"target",
|
| 265 |
+
"amount",
|
| 266 |
+
"location"
|
| 267 |
+
]
|
| 268 |
+
}
|
| 269 |
+
},
|
| 270 |
+
"propertyOrdering": [
|
| 271 |
+
"type",
|
| 272 |
+
"parameters"
|
| 273 |
+
]
|
| 274 |
+
}
|
| 275 |
+
},
|
| 276 |
+
"propertyOrdering": [
|
| 277 |
+
"internal_thinking",
|
| 278 |
+
"note_to_self",
|
| 279 |
+
"say_outloud",
|
| 280 |
+
"action"
|
| 281 |
+
]
|
| 282 |
+
}
|
| 283 |
+
```
|
| 284 |
+
</details>
|
| 285 |
+
|
| 286 |
+
<details>
|
| 287 |
+
<summary><strong>📤 Prompt Sent to Gemini</strong></summary>
|
| 288 |
+
|
| 289 |
+
```json
|
| 290 |
+
{
|
| 291 |
+
"meta_data": {
|
| 292 |
+
"agent_name": "shon",
|
| 293 |
+
"role": "You are player 'shon'. Play strategically to win."
|
| 294 |
+
},
|
| 295 |
+
"task_context": {
|
| 296 |
+
"what_just_happened": "It's your turn in the setup phase. Place your first settlement on a strategic location.",
|
| 297 |
+
"instructions": "Analyze the game state and select the optimal move from 'allowed_actions'. You have 2 possible actions. If you wish to negotiate or wait for other players, select the 'wait_for_response' action."
|
| 298 |
+
},
|
| 299 |
+
"game_state": "\n 1. LOOKUP TABLES:\n • \"H\" (Hexes): Array where Index = HexID. Value = Resource+Num.\n Example: H[1]=\"W12\" -> Hex 1 is Wood 12.\n • \"N\" (Nodes): Array where Index = NodeID.\n Format: [ [Neighbors], [HexIDs], Port? ]\n Logic: To find yield of Node 10, check N[10]. Get HexIDs (e.g. [1,5]). Look up H[1] and H[5].\n\n2. CODES: W=Wood, B=Brick, S=Sheep, Wh=Wheat, O=Ore, D=Desert.\n ?3=Any 3:1 port, X2=Specific Resource 2:1 port.\n\n3. STATE: \"bld\"=[NodeID, Owner, Type], \"rds\"=[[From,To], Owner].\n\n4. PLAYERS: \"res\"={Resource:Count}, \"dev\"={\"h\":[Hidden Cards], \"r\":[Revealed] (K=Knight)}, \n \"stat\"=[\"LR\" (Longest Road), \"LA\" (Largest Army)].\n\n5. ROBBER: Located at HexID specified in \"meta.robber\". H[id] is blocked.\n\nJSON:\n{\"meta\":{\"curr\":\"shon\",\"phase\":\"SETUP_FIRST_ROUND\",\"robber\":10,\"dice\":null},\"H\":[\"\",\"W12\",\"S5\",\"W4\",\"S8\",\"B6\",\"W3\",\"Wh8\",\"B10\",\"W11\",\"D\",\"O3\",\"S4\",\"B10\",\"Wh9\",\"Wh6\",\"S11\",\"O5\",\"Wh9\",\"O2\"],\"N\":[null,[[2,9],[1]],[[1,3],[1],\"Wh2\"],[[2,4,11],[2,1],\"Wh2\"],[[3,5],[2]],[[4,6,13],[3,2]],[[5,7],[3],\"B2\"],[[6,15],[3],\"B2\"],[[9,18],[4],\"?3\"],[[8,10,1],[4,1],\"?3\"],[[9,11,20],[5,4,1]],[[10,12,3],[5,2,1]],[[11,13,22],[6,5,2]],[[12,14,5],[6,3,2]],[[13,15,24],[7,6,3]],[[14,16,7],[7,3]],[[15,26],[7],\"O2\"],[[18,28],[8],\"S2\"],[[17,19,8],[8,4]],[[18,20,30],[9,8,4]],[[19,21,10],[9,5,4]],[[20,22,32],[10,9,5]],[[21,23,12],[10,6,5]],[[22,24,34],[11,10,6]],[[23,25,14],[11,7,6]],[[24,26,36],[12,11,7]],[[25,27,16],[12,7],\"O2\"],[[26,38],[12]],[[29,17],[8],\"S2\"],[[28,30,39],[13,8]],[[29,31,19],[13,9,8]],[[30,32,41],[14,13,9]],[[31,33,21],[14,10,9]],[[32,34,43],[15,14,10]],[[33,35,23],[15,11,10]],[[34,36,45],[16,15,11]],[[35,37,25],[16,12,11]],[[36,38,47],[16,12],\"?3\"],[[37,27],[12],\"?3\"],[[40,29],[13]],[[39,41,48],[17,13],\"W2\"],[[40,42,31],[17,14,13]],[[41,43,50],[18,17,14]],[[42,44,33],[18,15,14]],[[43,45,52],[19,18,15]],[[44,46,35],[19,16,15]],[[45,47,54],[19,16]],[[46,37],[16]],[[49,40],[17],\"W2\"],[[48,50],[17]],[[49,51,42],[18,17],\"?3\"],[[50,52],[18],\"?3\"],[[51,53,44],[19,18]],[[52,54],[19],\"?3\"],[[53,46],[19],\"?3\"]],\"state\":{\"bld\":[[10,\"hadar\",\"S\"]],\"rds\":[[[10,9],\"hadar\"]]},\"players\":{\"hadar\":{\"vp\":1,\"res\":{}},\"shon\":{\"vp\":0,\"res\":{}},\"digeo\":{\"vp\":0,\"res\":{}}}}",
|
| 300 |
+
"constraints": {
|
| 301 |
+
"usage_instructions": "Choose one action type from the list below. Populate the 'parameters' field in your response strictly according to the 'example_parameters' structure provided.",
|
| 302 |
+
"allowed_actions": [
|
| 303 |
+
{
|
| 304 |
+
"action": "place_settlement",
|
| 305 |
+
"description": "Place your starting settlement on an available node",
|
| 306 |
+
"example_parameters": {
|
| 307 |
+
"location": "20"
|
| 308 |
+
}
|
| 309 |
+
},
|
| 310 |
+
{
|
| 311 |
+
"action": "wait_for_response",
|
| 312 |
+
"description": "Do nothing on the board, just chat or wait for other players",
|
| 313 |
+
"example_parameters": {}
|
| 314 |
+
}
|
| 315 |
+
]
|
| 316 |
+
}
|
| 317 |
+
}
|
| 318 |
+
```
|
| 319 |
+
</details>
|
| 320 |
+
|
| 321 |
+
|
| 322 |
+
### ✅ Response Received
|
| 323 |
+
|
| 324 |
+
- **Latency:** 16.33s
|
| 325 |
+
- **Tokens:** 1000 (prompt: 840, completion: 160)
|
| 326 |
+
|
| 327 |
+
<details>
|
| 328 |
+
<summary><strong>📥 Raw Response from Gemini</strong></summary>
|
| 329 |
+
|
| 330 |
+
```json
|
| 331 |
+
{"internal_thinking": "My goal is to place the first settlement strategically. I will analyze available nodes to find one with high-probability dice rolls and a good mix of essential resources. I prioritize Wood and Brick for early expansion (roads and second settlement), along with Sheep or Wheat. Node 20 (W11, B6, S8) provides Wood, Brick, and Sheep, with high-probability numbers (11, 6, 8) totaling 12 pips. This node offers a strong foundation for resource production and immediate expansion capabilities. Node 10 is occupied by hadar, so Node 20 is available.", "action": {"type": "place_settlement", "parameters": {"location": "20"}}}
|
| 332 |
+
```
|
| 333 |
+
</details>
|
| 334 |
+
|
| 335 |
+
|
| 336 |
+
### ✅ Parse Success
|
| 337 |
+
|
| 338 |
+
|
| 339 |
+
### 🎯 AI Response
|
| 340 |
+
|
| 341 |
+
#### 💭 Internal Thinking
|
| 342 |
+
|
| 343 |
+
> [No reasoning provided] [Response was too brief]
|
| 344 |
+
|
| 345 |
+
|
| 346 |
+
<details>
|
| 347 |
+
<summary><strong>🔍 Raw JSON (Debug)</strong></summary>
|
| 348 |
+
|
| 349 |
+
```json
|
| 350 |
+
{
|
| 351 |
+
"type": "place_settlement",
|
| 352 |
+
"parameters": {
|
| 353 |
+
"location": "20"
|
| 354 |
+
},
|
| 355 |
+
"internal_thinking": "[No reasoning provided] [Response was too brief]"
|
| 356 |
+
}
|
| 357 |
+
```
|
| 358 |
+
</details>
|
| 359 |
+
|
examples/ai_testing/my_games/{prompts/prompt_player_b.json → ai_logs/session_20260104_011246/prompts/prompt_player_digeo.json}
RENAMED
|
@@ -30,13 +30,13 @@
|
|
| 30 |
"system_instruction": "You are observing the game while waiting for your turn. Track what's happening, plan your strategy, and you can communicate with other players.",
|
| 31 |
"prompt": {
|
| 32 |
"meta_data": {
|
| 33 |
-
"agent_name": "
|
| 34 |
-
"role": "You are player '
|
| 35 |
},
|
| 36 |
"task_context": {
|
| 37 |
-
"what_just_happened": "Player
|
| 38 |
"instructions": "Analyze the game state and select the optimal move from 'allowed_actions'. If you wish to negotiate or wait for other players, select the 'wait_for_response' action."
|
| 39 |
},
|
| 40 |
-
"game_state": "\n 1. LOOKUP TABLES:\n • \"H\" (Hexes): Array where Index = HexID. Value = Resource+Num.\n Example: H[1]=\"W12\" -> Hex 1 is Wood 12.\n • \"N\" (Nodes): Array where Index = NodeID.\n Format: [ [Neighbors], [HexIDs], Port? ]\n Logic: To find yield of Node 10, check N[10]. Get HexIDs (e.g. [1,5]). Look up H[1] and H[5].\n\n2. CODES: W=Wood, B=Brick, S=Sheep, Wh=Wheat, O=Ore, D=Desert.\n ?3=Any 3:1 port, X2=Specific Resource 2:1 port.\n\n3. STATE: \"bld\"=[NodeID, Owner, Type], \"rds\"=[[From,To], Owner].\n\n4. PLAYERS: \"res\"={Resource:Count}, \"dev\"={\"h\":[Hidden Cards], \"r\":[Revealed] (K=Knight)}, \n \"stat\"=[\"LR\" (Longest Road), \"LA\" (Largest Army)].\n\n5. ROBBER: Located at HexID specified in \"meta.robber\". H[id] is blocked.\n\nJSON:\n{\"meta\":{\"curr\":\"
|
| 41 |
}
|
| 42 |
}
|
|
|
|
| 30 |
"system_instruction": "You are observing the game while waiting for your turn. Track what's happening, plan your strategy, and you can communicate with other players.",
|
| 31 |
"prompt": {
|
| 32 |
"meta_data": {
|
| 33 |
+
"agent_name": "digeo",
|
| 34 |
+
"role": "You are player 'digeo'. Play strategically to win."
|
| 35 |
},
|
| 36 |
"task_context": {
|
| 37 |
+
"what_just_happened": "Player shon is placing their first settlement.",
|
| 38 |
"instructions": "Analyze the game state and select the optimal move from 'allowed_actions'. If you wish to negotiate or wait for other players, select the 'wait_for_response' action."
|
| 39 |
},
|
| 40 |
+
"game_state": "\n 1. LOOKUP TABLES:\n • \"H\" (Hexes): Array where Index = HexID. Value = Resource+Num.\n Example: H[1]=\"W12\" -> Hex 1 is Wood 12.\n • \"N\" (Nodes): Array where Index = NodeID.\n Format: [ [Neighbors], [HexIDs], Port? ]\n Logic: To find yield of Node 10, check N[10]. Get HexIDs (e.g. [1,5]). Look up H[1] and H[5].\n\n2. CODES: W=Wood, B=Brick, S=Sheep, Wh=Wheat, O=Ore, D=Desert.\n ?3=Any 3:1 port, X2=Specific Resource 2:1 port.\n\n3. STATE: \"bld\"=[NodeID, Owner, Type], \"rds\"=[[From,To], Owner].\n\n4. PLAYERS: \"res\"={Resource:Count}, \"dev\"={\"h\":[Hidden Cards], \"r\":[Revealed] (K=Knight)}, \n \"stat\"=[\"LR\" (Longest Road), \"LA\" (Largest Army)].\n\n5. ROBBER: Located at HexID specified in \"meta.robber\". H[id] is blocked.\n\nJSON:\n{\"meta\":{\"curr\":\"shon\",\"phase\":\"SETUP_FIRST_ROUND\",\"robber\":10,\"dice\":null},\"H\":[\"\",\"W12\",\"S5\",\"W4\",\"S8\",\"B6\",\"W3\",\"Wh8\",\"B10\",\"W11\",\"D\",\"O3\",\"S4\",\"B10\",\"Wh9\",\"Wh6\",\"S11\",\"O5\",\"Wh9\",\"O2\"],\"N\":[null,[[2,9],[1]],[[1,3],[1],\"Wh2\"],[[2,4,11],[2,1],\"Wh2\"],[[3,5],[2]],[[4,6,13],[3,2]],[[5,7],[3],\"B2\"],[[6,15],[3],\"B2\"],[[9,18],[4],\"?3\"],[[8,10,1],[4,1],\"?3\"],[[9,11,20],[5,4,1]],[[10,12,3],[5,2,1]],[[11,13,22],[6,5,2]],[[12,14,5],[6,3,2]],[[13,15,24],[7,6,3]],[[14,16,7],[7,3]],[[15,26],[7],\"O2\"],[[18,28],[8],\"S2\"],[[17,19,8],[8,4]],[[18,20,30],[9,8,4]],[[19,21,10],[9,5,4]],[[20,22,32],[10,9,5]],[[21,23,12],[10,6,5]],[[22,24,34],[11,10,6]],[[23,25,14],[11,7,6]],[[24,26,36],[12,11,7]],[[25,27,16],[12,7],\"O2\"],[[26,38],[12]],[[29,17],[8],\"S2\"],[[28,30,39],[13,8]],[[29,31,19],[13,9,8]],[[30,32,41],[14,13,9]],[[31,33,21],[14,10,9]],[[32,34,43],[15,14,10]],[[33,35,23],[15,11,10]],[[34,36,45],[16,15,11]],[[35,37,25],[16,12,11]],[[36,38,47],[16,12],\"?3\"],[[37,27],[12],\"?3\"],[[40,29],[13]],[[39,41,48],[17,13],\"W2\"],[[40,42,31],[17,14,13]],[[41,43,50],[18,17,14]],[[42,44,33],[18,15,14]],[[43,45,52],[19,18,15]],[[44,46,35],[19,16,15]],[[45,47,54],[19,16]],[[46,37],[16]],[[49,40],[17],\"W2\"],[[48,50],[17]],[[49,51,42],[18,17],\"?3\"],[[50,52],[18],\"?3\"],[[51,53,44],[19,18]],[[52,54],[19],\"?3\"],[[53,46],[19],\"?3\"]],\"state\":{\"bld\":[[10,\"hadar\",\"S\"]],\"rds\":[[[10,9],\"hadar\"]]},\"players\":{\"hadar\":{\"vp\":1,\"res\":{}},\"shon\":{\"vp\":0,\"res\":{}},\"digeo\":{\"vp\":0,\"res\":{}}}}"
|
| 41 |
}
|
| 42 |
}
|
examples/ai_testing/my_games/{prompts/prompt_player_c.txt → ai_logs/session_20260104_011246/prompts/prompt_player_digeo.txt}
RENAMED
|
@@ -1,6 +1,6 @@
|
|
| 1 |
================================================================================
|
| 2 |
-
AI AGENT PROMPT - PLAYER
|
| 3 |
-
Generated: 2026-01-
|
| 4 |
================================================================================
|
| 5 |
|
| 6 |
📋 RESPONSE SCHEMA (Expected LLM Output Format)
|
|
@@ -40,14 +40,14 @@ Generated: 2026-01-03 22:34:03
|
|
| 40 |
|
| 41 |
{
|
| 42 |
"meta_data": {
|
| 43 |
-
"agent_name": "
|
| 44 |
-
"role": "You are player '
|
| 45 |
},
|
| 46 |
"task_context": {
|
| 47 |
-
"what_just_happened": "Player
|
| 48 |
"instructions": "Analyze the game state and select the optimal move from 'allowed_actions'. If you wish to negotiate or wait for other players, select the 'wait_for_response' action."
|
| 49 |
},
|
| 50 |
-
"game_state": "\n 1. LOOKUP TABLES:\n • \"H\" (Hexes): Array where Index = HexID. Value = Resource+Num.\n Example: H[1]=\"W12\" -> Hex 1 is Wood 12.\n • \"N\" (Nodes): Array where Index = NodeID.\n Format: [ [Neighbors], [HexIDs], Port? ]\n Logic: To find yield of Node 10, check N[10]. Get HexIDs (e.g. [1,5]). Look up H[1] and H[5].\n\n2. CODES: W=Wood, B=Brick, S=Sheep, Wh=Wheat, O=Ore, D=Desert.\n ?3=Any 3:1 port, X2=Specific Resource 2:1 port.\n\n3. STATE: \"bld\"=[NodeID, Owner, Type], \"rds\"=[[From,To], Owner].\n\n4. PLAYERS: \"res\"={Resource:Count}, \"dev\"={\"h\":[Hidden Cards], \"r\":[Revealed] (K=Knight)}, \n \"stat\"=[\"LR\" (Longest Road), \"LA\" (Largest Army)].\n\n5. ROBBER: Located at HexID specified in \"meta.robber\". H[id] is blocked.\n\nJSON:\n{\"meta\":{\"curr\":\"
|
| 51 |
}
|
| 52 |
|
| 53 |
================================================================================
|
|
|
|
| 1 |
================================================================================
|
| 2 |
+
AI AGENT PROMPT - PLAYER DIGEO
|
| 3 |
+
Generated: 2026-01-04 01:18:48
|
| 4 |
================================================================================
|
| 5 |
|
| 6 |
📋 RESPONSE SCHEMA (Expected LLM Output Format)
|
|
|
|
| 40 |
|
| 41 |
{
|
| 42 |
"meta_data": {
|
| 43 |
+
"agent_name": "digeo",
|
| 44 |
+
"role": "You are player 'digeo'. Play strategically to win."
|
| 45 |
},
|
| 46 |
"task_context": {
|
| 47 |
+
"what_just_happened": "Player shon is placing their first settlement.",
|
| 48 |
"instructions": "Analyze the game state and select the optimal move from 'allowed_actions'. If you wish to negotiate or wait for other players, select the 'wait_for_response' action."
|
| 49 |
},
|
| 50 |
+
"game_state": "\n 1. LOOKUP TABLES:\n • \"H\" (Hexes): Array where Index = HexID. Value = Resource+Num.\n Example: H[1]=\"W12\" -> Hex 1 is Wood 12.\n • \"N\" (Nodes): Array where Index = NodeID.\n Format: [ [Neighbors], [HexIDs], Port? ]\n Logic: To find yield of Node 10, check N[10]. Get HexIDs (e.g. [1,5]). Look up H[1] and H[5].\n\n2. CODES: W=Wood, B=Brick, S=Sheep, Wh=Wheat, O=Ore, D=Desert.\n ?3=Any 3:1 port, X2=Specific Resource 2:1 port.\n\n3. STATE: \"bld\"=[NodeID, Owner, Type], \"rds\"=[[From,To], Owner].\n\n4. PLAYERS: \"res\"={Resource:Count}, \"dev\"={\"h\":[Hidden Cards], \"r\":[Revealed] (K=Knight)}, \n \"stat\"=[\"LR\" (Longest Road), \"LA\" (Largest Army)].\n\n5. ROBBER: Located at HexID specified in \"meta.robber\". H[id] is blocked.\n\nJSON:\n{\"meta\":{\"curr\":\"shon\",\"phase\":\"SETUP_FIRST_ROUND\",\"robber\":10,\"dice\":null},\"H\":[\"\",\"W12\",\"S5\",\"W4\",\"S8\",\"B6\",\"W3\",\"Wh8\",\"B10\",\"W11\",\"D\",\"O3\",\"S4\",\"B10\",\"Wh9\",\"Wh6\",\"S11\",\"O5\",\"Wh9\",\"O2\"],\"N\":[null,[[2,9],[1]],[[1,3],[1],\"Wh2\"],[[2,4,11],[2,1],\"Wh2\"],[[3,5],[2]],[[4,6,13],[3,2]],[[5,7],[3],\"B2\"],[[6,15],[3],\"B2\"],[[9,18],[4],\"?3\"],[[8,10,1],[4,1],\"?3\"],[[9,11,20],[5,4,1]],[[10,12,3],[5,2,1]],[[11,13,22],[6,5,2]],[[12,14,5],[6,3,2]],[[13,15,24],[7,6,3]],[[14,16,7],[7,3]],[[15,26],[7],\"O2\"],[[18,28],[8],\"S2\"],[[17,19,8],[8,4]],[[18,20,30],[9,8,4]],[[19,21,10],[9,5,4]],[[20,22,32],[10,9,5]],[[21,23,12],[10,6,5]],[[22,24,34],[11,10,6]],[[23,25,14],[11,7,6]],[[24,26,36],[12,11,7]],[[25,27,16],[12,7],\"O2\"],[[26,38],[12]],[[29,17],[8],\"S2\"],[[28,30,39],[13,8]],[[29,31,19],[13,9,8]],[[30,32,41],[14,13,9]],[[31,33,21],[14,10,9]],[[32,34,43],[15,14,10]],[[33,35,23],[15,11,10]],[[34,36,45],[16,15,11]],[[35,37,25],[16,12,11]],[[36,38,47],[16,12],\"?3\"],[[37,27],[12],\"?3\"],[[40,29],[13]],[[39,41,48],[17,13],\"W2\"],[[40,42,31],[17,14,13]],[[41,43,50],[18,17,14]],[[42,44,33],[18,15,14]],[[43,45,52],[19,18,15]],[[44,46,35],[19,16,15]],[[45,47,54],[19,16]],[[46,37],[16]],[[49,40],[17],\"W2\"],[[48,50],[17]],[[49,51,42],[18,17],\"?3\"],[[50,52],[18],\"?3\"],[[51,53,44],[19,18]],[[52,54],[19],\"?3\"],[[53,46],[19],\"?3\"]],\"state\":{\"bld\":[[10,\"hadar\",\"S\"]],\"rds\":[[[10,9],\"hadar\"]]},\"players\":{\"hadar\":{\"vp\":1,\"res\":{}},\"shon\":{\"vp\":0,\"res\":{}},\"digeo\":{\"vp\":0,\"res\":{}}}}"
|
| 51 |
}
|
| 52 |
|
| 53 |
================================================================================
|
examples/ai_testing/my_games/{prompts/prompt_player_c.json → ai_logs/session_20260104_011246/prompts/prompt_player_hadar.json}
RENAMED
|
@@ -30,13 +30,13 @@
|
|
| 30 |
"system_instruction": "You are observing the game while waiting for your turn. Track what's happening, plan your strategy, and you can communicate with other players.",
|
| 31 |
"prompt": {
|
| 32 |
"meta_data": {
|
| 33 |
-
"agent_name": "
|
| 34 |
-
"role": "You are player '
|
| 35 |
},
|
| 36 |
"task_context": {
|
| 37 |
-
"what_just_happened": "Player
|
| 38 |
"instructions": "Analyze the game state and select the optimal move from 'allowed_actions'. If you wish to negotiate or wait for other players, select the 'wait_for_response' action."
|
| 39 |
},
|
| 40 |
-
"game_state": "\n 1. LOOKUP TABLES:\n • \"H\" (Hexes): Array where Index = HexID. Value = Resource+Num.\n Example: H[1]=\"W12\" -> Hex 1 is Wood 12.\n • \"N\" (Nodes): Array where Index = NodeID.\n Format: [ [Neighbors], [HexIDs], Port? ]\n Logic: To find yield of Node 10, check N[10]. Get HexIDs (e.g. [1,5]). Look up H[1] and H[5].\n\n2. CODES: W=Wood, B=Brick, S=Sheep, Wh=Wheat, O=Ore, D=Desert.\n ?3=Any 3:1 port, X2=Specific Resource 2:1 port.\n\n3. STATE: \"bld\"=[NodeID, Owner, Type], \"rds\"=[[From,To], Owner].\n\n4. PLAYERS: \"res\"={Resource:Count}, \"dev\"={\"h\":[Hidden Cards], \"r\":[Revealed] (K=Knight)}, \n \"stat\"=[\"LR\" (Longest Road), \"LA\" (Largest Army)].\n\n5. ROBBER: Located at HexID specified in \"meta.robber\". H[id] is blocked.\n\nJSON:\n{\"meta\":{\"curr\":\"
|
| 41 |
}
|
| 42 |
}
|
|
|
|
| 30 |
"system_instruction": "You are observing the game while waiting for your turn. Track what's happening, plan your strategy, and you can communicate with other players.",
|
| 31 |
"prompt": {
|
| 32 |
"meta_data": {
|
| 33 |
+
"agent_name": "hadar",
|
| 34 |
+
"role": "You are player 'hadar'. Play strategically to win."
|
| 35 |
},
|
| 36 |
"task_context": {
|
| 37 |
+
"what_just_happened": "Player shon is placing their first settlement.",
|
| 38 |
"instructions": "Analyze the game state and select the optimal move from 'allowed_actions'. If you wish to negotiate or wait for other players, select the 'wait_for_response' action."
|
| 39 |
},
|
| 40 |
+
"game_state": "\n 1. LOOKUP TABLES:\n • \"H\" (Hexes): Array where Index = HexID. Value = Resource+Num.\n Example: H[1]=\"W12\" -> Hex 1 is Wood 12.\n • \"N\" (Nodes): Array where Index = NodeID.\n Format: [ [Neighbors], [HexIDs], Port? ]\n Logic: To find yield of Node 10, check N[10]. Get HexIDs (e.g. [1,5]). Look up H[1] and H[5].\n\n2. CODES: W=Wood, B=Brick, S=Sheep, Wh=Wheat, O=Ore, D=Desert.\n ?3=Any 3:1 port, X2=Specific Resource 2:1 port.\n\n3. STATE: \"bld\"=[NodeID, Owner, Type], \"rds\"=[[From,To], Owner].\n\n4. PLAYERS: \"res\"={Resource:Count}, \"dev\"={\"h\":[Hidden Cards], \"r\":[Revealed] (K=Knight)}, \n \"stat\"=[\"LR\" (Longest Road), \"LA\" (Largest Army)].\n\n5. ROBBER: Located at HexID specified in \"meta.robber\". H[id] is blocked.\n\nJSON:\n{\"meta\":{\"curr\":\"shon\",\"phase\":\"SETUP_FIRST_ROUND\",\"robber\":10,\"dice\":null},\"H\":[\"\",\"W12\",\"S5\",\"W4\",\"S8\",\"B6\",\"W3\",\"Wh8\",\"B10\",\"W11\",\"D\",\"O3\",\"S4\",\"B10\",\"Wh9\",\"Wh6\",\"S11\",\"O5\",\"Wh9\",\"O2\"],\"N\":[null,[[2,9],[1]],[[1,3],[1],\"Wh2\"],[[2,4,11],[2,1],\"Wh2\"],[[3,5],[2]],[[4,6,13],[3,2]],[[5,7],[3],\"B2\"],[[6,15],[3],\"B2\"],[[9,18],[4],\"?3\"],[[8,10,1],[4,1],\"?3\"],[[9,11,20],[5,4,1]],[[10,12,3],[5,2,1]],[[11,13,22],[6,5,2]],[[12,14,5],[6,3,2]],[[13,15,24],[7,6,3]],[[14,16,7],[7,3]],[[15,26],[7],\"O2\"],[[18,28],[8],\"S2\"],[[17,19,8],[8,4]],[[18,20,30],[9,8,4]],[[19,21,10],[9,5,4]],[[20,22,32],[10,9,5]],[[21,23,12],[10,6,5]],[[22,24,34],[11,10,6]],[[23,25,14],[11,7,6]],[[24,26,36],[12,11,7]],[[25,27,16],[12,7],\"O2\"],[[26,38],[12]],[[29,17],[8],\"S2\"],[[28,30,39],[13,8]],[[29,31,19],[13,9,8]],[[30,32,41],[14,13,9]],[[31,33,21],[14,10,9]],[[32,34,43],[15,14,10]],[[33,35,23],[15,11,10]],[[34,36,45],[16,15,11]],[[35,37,25],[16,12,11]],[[36,38,47],[16,12],\"?3\"],[[37,27],[12],\"?3\"],[[40,29],[13]],[[39,41,48],[17,13],\"W2\"],[[40,42,31],[17,14,13]],[[41,43,50],[18,17,14]],[[42,44,33],[18,15,14]],[[43,45,52],[19,18,15]],[[44,46,35],[19,16,15]],[[45,47,54],[19,16]],[[46,37],[16]],[[49,40],[17],\"W2\"],[[48,50],[17]],[[49,51,42],[18,17],\"?3\"],[[50,52],[18],\"?3\"],[[51,53,44],[19,18]],[[52,54],[19],\"?3\"],[[53,46],[19],\"?3\"]],\"state\":{\"bld\":[[10,\"hadar\",\"S\"]],\"rds\":[[[10,9],\"hadar\"]]},\"players\":{\"hadar\":{\"vp\":1,\"res\":{}},\"shon\":{\"vp\":0,\"res\":{}},\"digeo\":{\"vp\":0,\"res\":{}}}}"
|
| 41 |
}
|
| 42 |
}
|
examples/ai_testing/my_games/{prompts/prompt_player_b.txt → ai_logs/session_20260104_011246/prompts/prompt_player_hadar.txt}
RENAMED
|
@@ -1,6 +1,6 @@
|
|
| 1 |
================================================================================
|
| 2 |
-
AI AGENT PROMPT - PLAYER
|
| 3 |
-
Generated: 2026-01-
|
| 4 |
================================================================================
|
| 5 |
|
| 6 |
📋 RESPONSE SCHEMA (Expected LLM Output Format)
|
|
@@ -40,14 +40,14 @@ Generated: 2026-01-03 22:34:03
|
|
| 40 |
|
| 41 |
{
|
| 42 |
"meta_data": {
|
| 43 |
-
"agent_name": "
|
| 44 |
-
"role": "You are player '
|
| 45 |
},
|
| 46 |
"task_context": {
|
| 47 |
-
"what_just_happened": "Player
|
| 48 |
"instructions": "Analyze the game state and select the optimal move from 'allowed_actions'. If you wish to negotiate or wait for other players, select the 'wait_for_response' action."
|
| 49 |
},
|
| 50 |
-
"game_state": "\n 1. LOOKUP TABLES:\n • \"H\" (Hexes): Array where Index = HexID. Value = Resource+Num.\n Example: H[1]=\"W12\" -> Hex 1 is Wood 12.\n • \"N\" (Nodes): Array where Index = NodeID.\n Format: [ [Neighbors], [HexIDs], Port? ]\n Logic: To find yield of Node 10, check N[10]. Get HexIDs (e.g. [1,5]). Look up H[1] and H[5].\n\n2. CODES: W=Wood, B=Brick, S=Sheep, Wh=Wheat, O=Ore, D=Desert.\n ?3=Any 3:1 port, X2=Specific Resource 2:1 port.\n\n3. STATE: \"bld\"=[NodeID, Owner, Type], \"rds\"=[[From,To], Owner].\n\n4. PLAYERS: \"res\"={Resource:Count}, \"dev\"={\"h\":[Hidden Cards], \"r\":[Revealed] (K=Knight)}, \n \"stat\"=[\"LR\" (Longest Road), \"LA\" (Largest Army)].\n\n5. ROBBER: Located at HexID specified in \"meta.robber\". H[id] is blocked.\n\nJSON:\n{\"meta\":{\"curr\":\"
|
| 51 |
}
|
| 52 |
|
| 53 |
================================================================================
|
|
|
|
| 1 |
================================================================================
|
| 2 |
+
AI AGENT PROMPT - PLAYER HADAR
|
| 3 |
+
Generated: 2026-01-04 01:18:48
|
| 4 |
================================================================================
|
| 5 |
|
| 6 |
📋 RESPONSE SCHEMA (Expected LLM Output Format)
|
|
|
|
| 40 |
|
| 41 |
{
|
| 42 |
"meta_data": {
|
| 43 |
+
"agent_name": "hadar",
|
| 44 |
+
"role": "You are player 'hadar'. Play strategically to win."
|
| 45 |
},
|
| 46 |
"task_context": {
|
| 47 |
+
"what_just_happened": "Player shon is placing their first settlement.",
|
| 48 |
"instructions": "Analyze the game state and select the optimal move from 'allowed_actions'. If you wish to negotiate or wait for other players, select the 'wait_for_response' action."
|
| 49 |
},
|
| 50 |
+
"game_state": "\n 1. LOOKUP TABLES:\n • \"H\" (Hexes): Array where Index = HexID. Value = Resource+Num.\n Example: H[1]=\"W12\" -> Hex 1 is Wood 12.\n • \"N\" (Nodes): Array where Index = NodeID.\n Format: [ [Neighbors], [HexIDs], Port? ]\n Logic: To find yield of Node 10, check N[10]. Get HexIDs (e.g. [1,5]). Look up H[1] and H[5].\n\n2. CODES: W=Wood, B=Brick, S=Sheep, Wh=Wheat, O=Ore, D=Desert.\n ?3=Any 3:1 port, X2=Specific Resource 2:1 port.\n\n3. STATE: \"bld\"=[NodeID, Owner, Type], \"rds\"=[[From,To], Owner].\n\n4. PLAYERS: \"res\"={Resource:Count}, \"dev\"={\"h\":[Hidden Cards], \"r\":[Revealed] (K=Knight)}, \n \"stat\"=[\"LR\" (Longest Road), \"LA\" (Largest Army)].\n\n5. ROBBER: Located at HexID specified in \"meta.robber\". H[id] is blocked.\n\nJSON:\n{\"meta\":{\"curr\":\"shon\",\"phase\":\"SETUP_FIRST_ROUND\",\"robber\":10,\"dice\":null},\"H\":[\"\",\"W12\",\"S5\",\"W4\",\"S8\",\"B6\",\"W3\",\"Wh8\",\"B10\",\"W11\",\"D\",\"O3\",\"S4\",\"B10\",\"Wh9\",\"Wh6\",\"S11\",\"O5\",\"Wh9\",\"O2\"],\"N\":[null,[[2,9],[1]],[[1,3],[1],\"Wh2\"],[[2,4,11],[2,1],\"Wh2\"],[[3,5],[2]],[[4,6,13],[3,2]],[[5,7],[3],\"B2\"],[[6,15],[3],\"B2\"],[[9,18],[4],\"?3\"],[[8,10,1],[4,1],\"?3\"],[[9,11,20],[5,4,1]],[[10,12,3],[5,2,1]],[[11,13,22],[6,5,2]],[[12,14,5],[6,3,2]],[[13,15,24],[7,6,3]],[[14,16,7],[7,3]],[[15,26],[7],\"O2\"],[[18,28],[8],\"S2\"],[[17,19,8],[8,4]],[[18,20,30],[9,8,4]],[[19,21,10],[9,5,4]],[[20,22,32],[10,9,5]],[[21,23,12],[10,6,5]],[[22,24,34],[11,10,6]],[[23,25,14],[11,7,6]],[[24,26,36],[12,11,7]],[[25,27,16],[12,7],\"O2\"],[[26,38],[12]],[[29,17],[8],\"S2\"],[[28,30,39],[13,8]],[[29,31,19],[13,9,8]],[[30,32,41],[14,13,9]],[[31,33,21],[14,10,9]],[[32,34,43],[15,14,10]],[[33,35,23],[15,11,10]],[[34,36,45],[16,15,11]],[[35,37,25],[16,12,11]],[[36,38,47],[16,12],\"?3\"],[[37,27],[12],\"?3\"],[[40,29],[13]],[[39,41,48],[17,13],\"W2\"],[[40,42,31],[17,14,13]],[[41,43,50],[18,17,14]],[[42,44,33],[18,15,14]],[[43,45,52],[19,18,15]],[[44,46,35],[19,16,15]],[[45,47,54],[19,16]],[[46,37],[16]],[[49,40],[17],\"W2\"],[[48,50],[17]],[[49,51,42],[18,17],\"?3\"],[[50,52],[18],\"?3\"],[[51,53,44],[19,18]],[[52,54],[19],\"?3\"],[[53,46],[19],\"?3\"]],\"state\":{\"bld\":[[10,\"hadar\",\"S\"]],\"rds\":[[[10,9],\"hadar\"]]},\"players\":{\"hadar\":{\"vp\":1,\"res\":{}},\"shon\":{\"vp\":0,\"res\":{}},\"digeo\":{\"vp\":0,\"res\":{}}}}"
|
| 51 |
}
|
| 52 |
|
| 53 |
================================================================================
|
examples/ai_testing/my_games/{prompts/prompt_player_a.json → ai_logs/session_20260104_011246/prompts/prompt_player_shon.json}
RENAMED
|
@@ -72,23 +72,22 @@
|
|
| 72 |
"system_instruction": "You are an expert Settlers of Catan player. Analyze the game state carefully and respond in the exact JSON format specified in response_schema.",
|
| 73 |
"prompt": {
|
| 74 |
"meta_data": {
|
| 75 |
-
"agent_name": "
|
| 76 |
-
"role": "You are player '
|
| 77 |
},
|
| 78 |
"task_context": {
|
| 79 |
-
"what_just_happened": "
|
| 80 |
"instructions": "Analyze the game state and select the optimal move from 'allowed_actions'. You have 2 possible actions. If you wish to negotiate or wait for other players, select the 'wait_for_response' action."
|
| 81 |
},
|
| 82 |
-
"game_state": "\n 1. LOOKUP TABLES:\n • \"H\" (Hexes): Array where Index = HexID. Value = Resource+Num.\n Example: H[1]=\"W12\" -> Hex 1 is Wood 12.\n • \"N\" (Nodes): Array where Index = NodeID.\n Format: [ [Neighbors], [HexIDs], Port? ]\n Logic: To find yield of Node 10, check N[10]. Get HexIDs (e.g. [1,5]). Look up H[1] and H[5].\n\n2. CODES: W=Wood, B=Brick, S=Sheep, Wh=Wheat, O=Ore, D=Desert.\n ?3=Any 3:1 port, X2=Specific Resource 2:1 port.\n\n3. STATE: \"bld\"=[NodeID, Owner, Type], \"rds\"=[[From,To], Owner].\n\n4. PLAYERS: \"res\"={Resource:Count}, \"dev\"={\"h\":[Hidden Cards], \"r\":[Revealed] (K=Knight)}, \n \"stat\"=[\"LR\" (Longest Road), \"LA\" (Largest Army)].\n\n5. ROBBER: Located at HexID specified in \"meta.robber\". H[id] is blocked.\n\nJSON:\n{\"meta\":{\"curr\":\"
|
| 83 |
"constraints": {
|
| 84 |
"usage_instructions": "Choose one action type from the list below. Populate the 'parameters' field in your response strictly according to the 'example_parameters' structure provided.",
|
| 85 |
"allowed_actions": [
|
| 86 |
{
|
| 87 |
-
"action": "
|
| 88 |
-
"description": "Place your starting
|
| 89 |
"example_parameters": {
|
| 90 |
-
"
|
| 91 |
-
"to": "21"
|
| 92 |
}
|
| 93 |
},
|
| 94 |
{
|
|
|
|
| 72 |
"system_instruction": "You are an expert Settlers of Catan player. Analyze the game state carefully and respond in the exact JSON format specified in response_schema.",
|
| 73 |
"prompt": {
|
| 74 |
"meta_data": {
|
| 75 |
+
"agent_name": "shon",
|
| 76 |
+
"role": "You are player 'shon'. Play strategically to win."
|
| 77 |
},
|
| 78 |
"task_context": {
|
| 79 |
+
"what_just_happened": "It's your turn in the setup phase. Place your first settlement on a strategic location.",
|
| 80 |
"instructions": "Analyze the game state and select the optimal move from 'allowed_actions'. You have 2 possible actions. If you wish to negotiate or wait for other players, select the 'wait_for_response' action."
|
| 81 |
},
|
| 82 |
+
"game_state": "\n 1. LOOKUP TABLES:\n • \"H\" (Hexes): Array where Index = HexID. Value = Resource+Num.\n Example: H[1]=\"W12\" -> Hex 1 is Wood 12.\n • \"N\" (Nodes): Array where Index = NodeID.\n Format: [ [Neighbors], [HexIDs], Port? ]\n Logic: To find yield of Node 10, check N[10]. Get HexIDs (e.g. [1,5]). Look up H[1] and H[5].\n\n2. CODES: W=Wood, B=Brick, S=Sheep, Wh=Wheat, O=Ore, D=Desert.\n ?3=Any 3:1 port, X2=Specific Resource 2:1 port.\n\n3. STATE: \"bld\"=[NodeID, Owner, Type], \"rds\"=[[From,To], Owner].\n\n4. PLAYERS: \"res\"={Resource:Count}, \"dev\"={\"h\":[Hidden Cards], \"r\":[Revealed] (K=Knight)}, \n \"stat\"=[\"LR\" (Longest Road), \"LA\" (Largest Army)].\n\n5. ROBBER: Located at HexID specified in \"meta.robber\". H[id] is blocked.\n\nJSON:\n{\"meta\":{\"curr\":\"shon\",\"phase\":\"SETUP_FIRST_ROUND\",\"robber\":10,\"dice\":null},\"H\":[\"\",\"W12\",\"S5\",\"W4\",\"S8\",\"B6\",\"W3\",\"Wh8\",\"B10\",\"W11\",\"D\",\"O3\",\"S4\",\"B10\",\"Wh9\",\"Wh6\",\"S11\",\"O5\",\"Wh9\",\"O2\"],\"N\":[null,[[2,9],[1]],[[1,3],[1],\"Wh2\"],[[2,4,11],[2,1],\"Wh2\"],[[3,5],[2]],[[4,6,13],[3,2]],[[5,7],[3],\"B2\"],[[6,15],[3],\"B2\"],[[9,18],[4],\"?3\"],[[8,10,1],[4,1],\"?3\"],[[9,11,20],[5,4,1]],[[10,12,3],[5,2,1]],[[11,13,22],[6,5,2]],[[12,14,5],[6,3,2]],[[13,15,24],[7,6,3]],[[14,16,7],[7,3]],[[15,26],[7],\"O2\"],[[18,28],[8],\"S2\"],[[17,19,8],[8,4]],[[18,20,30],[9,8,4]],[[19,21,10],[9,5,4]],[[20,22,32],[10,9,5]],[[21,23,12],[10,6,5]],[[22,24,34],[11,10,6]],[[23,25,14],[11,7,6]],[[24,26,36],[12,11,7]],[[25,27,16],[12,7],\"O2\"],[[26,38],[12]],[[29,17],[8],\"S2\"],[[28,30,39],[13,8]],[[29,31,19],[13,9,8]],[[30,32,41],[14,13,9]],[[31,33,21],[14,10,9]],[[32,34,43],[15,14,10]],[[33,35,23],[15,11,10]],[[34,36,45],[16,15,11]],[[35,37,25],[16,12,11]],[[36,38,47],[16,12],\"?3\"],[[37,27],[12],\"?3\"],[[40,29],[13]],[[39,41,48],[17,13],\"W2\"],[[40,42,31],[17,14,13]],[[41,43,50],[18,17,14]],[[42,44,33],[18,15,14]],[[43,45,52],[19,18,15]],[[44,46,35],[19,16,15]],[[45,47,54],[19,16]],[[46,37],[16]],[[49,40],[17],\"W2\"],[[48,50],[17]],[[49,51,42],[18,17],\"?3\"],[[50,52],[18],\"?3\"],[[51,53,44],[19,18]],[[52,54],[19],\"?3\"],[[53,46],[19],\"?3\"]],\"state\":{\"bld\":[[10,\"hadar\",\"S\"]],\"rds\":[[[10,9],\"hadar\"]]},\"players\":{\"hadar\":{\"vp\":1,\"res\":{}},\"shon\":{\"vp\":0,\"res\":{}},\"digeo\":{\"vp\":0,\"res\":{}}}}",
|
| 83 |
"constraints": {
|
| 84 |
"usage_instructions": "Choose one action type from the list below. Populate the 'parameters' field in your response strictly according to the 'example_parameters' structure provided.",
|
| 85 |
"allowed_actions": [
|
| 86 |
{
|
| 87 |
+
"action": "place_settlement",
|
| 88 |
+
"description": "Place your starting settlement on an available node",
|
| 89 |
"example_parameters": {
|
| 90 |
+
"location": "20"
|
|
|
|
| 91 |
}
|
| 92 |
},
|
| 93 |
{
|
examples/ai_testing/my_games/{prompts/prompt_player_a.txt → ai_logs/session_20260104_011246/prompts/prompt_player_shon.txt}
RENAMED
|
@@ -1,6 +1,6 @@
|
|
| 1 |
================================================================================
|
| 2 |
-
AI AGENT PROMPT - PLAYER
|
| 3 |
-
Generated: 2026-01-
|
| 4 |
================================================================================
|
| 5 |
|
| 6 |
📋 RESPONSE SCHEMA (Expected LLM Output Format)
|
|
@@ -82,23 +82,22 @@ Generated: 2026-01-03 22:34:03
|
|
| 82 |
|
| 83 |
{
|
| 84 |
"meta_data": {
|
| 85 |
-
"agent_name": "
|
| 86 |
-
"role": "You are player '
|
| 87 |
},
|
| 88 |
"task_context": {
|
| 89 |
-
"what_just_happened": "
|
| 90 |
"instructions": "Analyze the game state and select the optimal move from 'allowed_actions'. You have 2 possible actions. If you wish to negotiate or wait for other players, select the 'wait_for_response' action."
|
| 91 |
},
|
| 92 |
-
"game_state": "\n 1. LOOKUP TABLES:\n • \"H\" (Hexes): Array where Index = HexID. Value = Resource+Num.\n Example: H[1]=\"W12\" -> Hex 1 is Wood 12.\n • \"N\" (Nodes): Array where Index = NodeID.\n Format: [ [Neighbors], [HexIDs], Port? ]\n Logic: To find yield of Node 10, check N[10]. Get HexIDs (e.g. [1,5]). Look up H[1] and H[5].\n\n2. CODES: W=Wood, B=Brick, S=Sheep, Wh=Wheat, O=Ore, D=Desert.\n ?3=Any 3:1 port, X2=Specific Resource 2:1 port.\n\n3. STATE: \"bld\"=[NodeID, Owner, Type], \"rds\"=[[From,To], Owner].\n\n4. PLAYERS: \"res\"={Resource:Count}, \"dev\"={\"h\":[Hidden Cards], \"r\":[Revealed] (K=Knight)}, \n \"stat\"=[\"LR\" (Longest Road), \"LA\" (Largest Army)].\n\n5. ROBBER: Located at HexID specified in \"meta.robber\". H[id] is blocked.\n\nJSON:\n{\"meta\":{\"curr\":\"
|
| 93 |
"constraints": {
|
| 94 |
"usage_instructions": "Choose one action type from the list below. Populate the 'parameters' field in your response strictly according to the 'example_parameters' structure provided.",
|
| 95 |
"allowed_actions": [
|
| 96 |
{
|
| 97 |
-
"action": "
|
| 98 |
-
"description": "Place your starting
|
| 99 |
"example_parameters": {
|
| 100 |
-
"
|
| 101 |
-
"to": "21"
|
| 102 |
}
|
| 103 |
},
|
| 104 |
{
|
|
|
|
| 1 |
================================================================================
|
| 2 |
+
AI AGENT PROMPT - PLAYER SHON
|
| 3 |
+
Generated: 2026-01-04 01:18:48
|
| 4 |
================================================================================
|
| 5 |
|
| 6 |
📋 RESPONSE SCHEMA (Expected LLM Output Format)
|
|
|
|
| 82 |
|
| 83 |
{
|
| 84 |
"meta_data": {
|
| 85 |
+
"agent_name": "shon",
|
| 86 |
+
"role": "You are player 'shon'. Play strategically to win."
|
| 87 |
},
|
| 88 |
"task_context": {
|
| 89 |
+
"what_just_happened": "It's your turn in the setup phase. Place your first settlement on a strategic location.",
|
| 90 |
"instructions": "Analyze the game state and select the optimal move from 'allowed_actions'. You have 2 possible actions. If you wish to negotiate or wait for other players, select the 'wait_for_response' action."
|
| 91 |
},
|
| 92 |
+
"game_state": "\n 1. LOOKUP TABLES:\n • \"H\" (Hexes): Array where Index = HexID. Value = Resource+Num.\n Example: H[1]=\"W12\" -> Hex 1 is Wood 12.\n • \"N\" (Nodes): Array where Index = NodeID.\n Format: [ [Neighbors], [HexIDs], Port? ]\n Logic: To find yield of Node 10, check N[10]. Get HexIDs (e.g. [1,5]). Look up H[1] and H[5].\n\n2. CODES: W=Wood, B=Brick, S=Sheep, Wh=Wheat, O=Ore, D=Desert.\n ?3=Any 3:1 port, X2=Specific Resource 2:1 port.\n\n3. STATE: \"bld\"=[NodeID, Owner, Type], \"rds\"=[[From,To], Owner].\n\n4. PLAYERS: \"res\"={Resource:Count}, \"dev\"={\"h\":[Hidden Cards], \"r\":[Revealed] (K=Knight)}, \n \"stat\"=[\"LR\" (Longest Road), \"LA\" (Largest Army)].\n\n5. ROBBER: Located at HexID specified in \"meta.robber\". H[id] is blocked.\n\nJSON:\n{\"meta\":{\"curr\":\"shon\",\"phase\":\"SETUP_FIRST_ROUND\",\"robber\":10,\"dice\":null},\"H\":[\"\",\"W12\",\"S5\",\"W4\",\"S8\",\"B6\",\"W3\",\"Wh8\",\"B10\",\"W11\",\"D\",\"O3\",\"S4\",\"B10\",\"Wh9\",\"Wh6\",\"S11\",\"O5\",\"Wh9\",\"O2\"],\"N\":[null,[[2,9],[1]],[[1,3],[1],\"Wh2\"],[[2,4,11],[2,1],\"Wh2\"],[[3,5],[2]],[[4,6,13],[3,2]],[[5,7],[3],\"B2\"],[[6,15],[3],\"B2\"],[[9,18],[4],\"?3\"],[[8,10,1],[4,1],\"?3\"],[[9,11,20],[5,4,1]],[[10,12,3],[5,2,1]],[[11,13,22],[6,5,2]],[[12,14,5],[6,3,2]],[[13,15,24],[7,6,3]],[[14,16,7],[7,3]],[[15,26],[7],\"O2\"],[[18,28],[8],\"S2\"],[[17,19,8],[8,4]],[[18,20,30],[9,8,4]],[[19,21,10],[9,5,4]],[[20,22,32],[10,9,5]],[[21,23,12],[10,6,5]],[[22,24,34],[11,10,6]],[[23,25,14],[11,7,6]],[[24,26,36],[12,11,7]],[[25,27,16],[12,7],\"O2\"],[[26,38],[12]],[[29,17],[8],\"S2\"],[[28,30,39],[13,8]],[[29,31,19],[13,9,8]],[[30,32,41],[14,13,9]],[[31,33,21],[14,10,9]],[[32,34,43],[15,14,10]],[[33,35,23],[15,11,10]],[[34,36,45],[16,15,11]],[[35,37,25],[16,12,11]],[[36,38,47],[16,12],\"?3\"],[[37,27],[12],\"?3\"],[[40,29],[13]],[[39,41,48],[17,13],\"W2\"],[[40,42,31],[17,14,13]],[[41,43,50],[18,17,14]],[[42,44,33],[18,15,14]],[[43,45,52],[19,18,15]],[[44,46,35],[19,16,15]],[[45,47,54],[19,16]],[[46,37],[16]],[[49,40],[17],\"W2\"],[[48,50],[17]],[[49,51,42],[18,17],\"?3\"],[[50,52],[18],\"?3\"],[[51,53,44],[19,18]],[[52,54],[19],\"?3\"],[[53,46],[19],\"?3\"]],\"state\":{\"bld\":[[10,\"hadar\",\"S\"]],\"rds\":[[[10,9],\"hadar\"]]},\"players\":{\"hadar\":{\"vp\":1,\"res\":{}},\"shon\":{\"vp\":0,\"res\":{}},\"digeo\":{\"vp\":0,\"res\":{}}}}",
|
| 93 |
"constraints": {
|
| 94 |
"usage_instructions": "Choose one action type from the list below. Populate the 'parameters' field in your response strictly according to the 'example_parameters' structure provided.",
|
| 95 |
"allowed_actions": [
|
| 96 |
{
|
| 97 |
+
"action": "place_settlement",
|
| 98 |
+
"description": "Place your starting settlement on an available node",
|
| 99 |
"example_parameters": {
|
| 100 |
+
"location": "20"
|
|
|
|
| 101 |
}
|
| 102 |
},
|
| 103 |
{
|
examples/ai_testing/my_games/current_session.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
C:\GIT_new\PyCatan_AI\examples\ai_testing\my_games\ai_logs\session_20260104_011246
|
examples/ai_testing/my_games/current_state.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
| 1 |
{
|
| 2 |
-
"timestamp": "2026-01-
|
| 3 |
-
"state_number":
|
| 4 |
"state": {
|
| 5 |
"hexes": [
|
| 6 |
{
|
|
@@ -120,13 +120,20 @@
|
|
| 120 |
],
|
| 121 |
"settlements": [
|
| 122 |
{
|
| 123 |
-
"id": "
|
| 124 |
-
"vertex":
|
| 125 |
"player": 1
|
| 126 |
}
|
| 127 |
],
|
| 128 |
"cities": [],
|
| 129 |
-
"roads": [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 130 |
"harbors": [
|
| 131 |
{
|
| 132 |
"id": 1,
|
|
@@ -195,15 +202,15 @@
|
|
| 195 |
"players": [
|
| 196 |
{
|
| 197 |
"id": 0,
|
| 198 |
-
"name": "
|
| 199 |
"victory_points": 1,
|
| 200 |
"total_cards": 0,
|
| 201 |
"cards_list": [],
|
| 202 |
"dev_cards_list": [],
|
| 203 |
"settlements": 1,
|
| 204 |
"cities": 0,
|
| 205 |
-
"roads":
|
| 206 |
-
"longest_road":
|
| 207 |
"has_longest_road": false,
|
| 208 |
"knights": 0,
|
| 209 |
"knights_played": 0,
|
|
@@ -211,7 +218,7 @@
|
|
| 211 |
},
|
| 212 |
{
|
| 213 |
"id": 1,
|
| 214 |
-
"name": "
|
| 215 |
"victory_points": 0,
|
| 216 |
"total_cards": 0,
|
| 217 |
"cards_list": [],
|
|
@@ -227,7 +234,7 @@
|
|
| 227 |
},
|
| 228 |
{
|
| 229 |
"id": 2,
|
| 230 |
-
"name": "
|
| 231 |
"victory_points": 0,
|
| 232 |
"total_cards": 0,
|
| 233 |
"cards_list": [],
|
|
@@ -242,7 +249,7 @@
|
|
| 242 |
"has_largest_army": false
|
| 243 |
}
|
| 244 |
],
|
| 245 |
-
"current_player":
|
| 246 |
"current_phase": "SETUP_FIRST_ROUND",
|
| 247 |
"robber_position": [
|
| 248 |
2,
|
|
@@ -250,7 +257,7 @@
|
|
| 250 |
],
|
| 251 |
"dice_result": null,
|
| 252 |
"allowed_actions": [
|
| 253 |
-
"
|
| 254 |
],
|
| 255 |
"points": [
|
| 256 |
{
|
|
|
|
| 1 |
{
|
| 2 |
+
"timestamp": "2026-01-04T01:18:47.917271",
|
| 3 |
+
"state_number": 8,
|
| 4 |
"state": {
|
| 5 |
"hexes": [
|
| 6 |
{
|
|
|
|
| 120 |
],
|
| 121 |
"settlements": [
|
| 122 |
{
|
| 123 |
+
"id": "b_10",
|
| 124 |
+
"vertex": 10,
|
| 125 |
"player": 1
|
| 126 |
}
|
| 127 |
],
|
| 128 |
"cities": [],
|
| 129 |
+
"roads": [
|
| 130 |
+
{
|
| 131 |
+
"id": 1,
|
| 132 |
+
"from": 10,
|
| 133 |
+
"to": 9,
|
| 134 |
+
"player": 1
|
| 135 |
+
}
|
| 136 |
+
],
|
| 137 |
"harbors": [
|
| 138 |
{
|
| 139 |
"id": 1,
|
|
|
|
| 202 |
"players": [
|
| 203 |
{
|
| 204 |
"id": 0,
|
| 205 |
+
"name": "hadar",
|
| 206 |
"victory_points": 1,
|
| 207 |
"total_cards": 0,
|
| 208 |
"cards_list": [],
|
| 209 |
"dev_cards_list": [],
|
| 210 |
"settlements": 1,
|
| 211 |
"cities": 0,
|
| 212 |
+
"roads": 1,
|
| 213 |
+
"longest_road": 1,
|
| 214 |
"has_longest_road": false,
|
| 215 |
"knights": 0,
|
| 216 |
"knights_played": 0,
|
|
|
|
| 218 |
},
|
| 219 |
{
|
| 220 |
"id": 1,
|
| 221 |
+
"name": "shon",
|
| 222 |
"victory_points": 0,
|
| 223 |
"total_cards": 0,
|
| 224 |
"cards_list": [],
|
|
|
|
| 234 |
},
|
| 235 |
{
|
| 236 |
"id": 2,
|
| 237 |
+
"name": "digeo",
|
| 238 |
"victory_points": 0,
|
| 239 |
"total_cards": 0,
|
| 240 |
"cards_list": [],
|
|
|
|
| 249 |
"has_largest_army": false
|
| 250 |
}
|
| 251 |
],
|
| 252 |
+
"current_player": 1,
|
| 253 |
"current_phase": "SETUP_FIRST_ROUND",
|
| 254 |
"robber_position": [
|
| 255 |
2,
|
|
|
|
| 257 |
],
|
| 258 |
"dice_result": null,
|
| 259 |
"allowed_actions": [
|
| 260 |
+
"PLACE_STARTING_SETTLEMENT"
|
| 261 |
],
|
| 262 |
"points": [
|
| 263 |
{
|
examples/ai_testing/my_games/current_state_optimized.txt
CHANGED
|
@@ -17,9 +17,9 @@
|
|
| 17 |
|
| 18 |
JSON:
|
| 19 |
{
|
| 20 |
-
"meta":{"curr":"
|
| 21 |
"H":["","W12","S5","W4","S8","B6","W3","Wh8","B10","W11","D","O3","S4","B10","Wh9","Wh6","S11","O5","Wh9","O2"],
|
| 22 |
"N":[null,[[2,9],[1]],[[1,3],[1],"Wh2"],[[2,4,11],[2,1],"Wh2"],[[3,5],[2]],[[4,6,13],[3,2]],[[5,7],[3],"B2"],[[6,15],[3],"B2"],[[9,18],[4],"?3"],[[8,10,1],[4,1],"?3"],[[9,11,20],[5,4,1]],[[10,12,3],[5,2,1]],[[11,13,22],[6,5,2]],[[12,14,5],[6,3,2]],[[13,15,24],[7,6,3]],[[14,16,7],[7,3]],[[15,26],[7],"O2"],[[18,28],[8],"S2"],[[17,19,8],[8,4]],[[18,20,30],[9,8,4]],[[19,21,10],[9,5,4]],[[20,22,32],[10,9,5]],[[21,23,12],[10,6,5]],[[22,24,34],[11,10,6]],[[23,25,14],[11,7,6]],[[24,26,36],[12,11,7]],[[25,27,16],[12,7],"O2"],[[26,38],[12]],[[29,17],[8],"S2"],[[28,30,39],[13,8]],[[29,31,19],[13,9,8]],[[30,32,41],[14,13,9]],[[31,33,21],[14,10,9]],[[32,34,43],[15,14,10]],[[33,35,23],[15,11,10]],[[34,36,45],[16,15,11]],[[35,37,25],[16,12,11]],[[36,38,47],[16,12],"?3"],[[37,27],[12],"?3"],[[40,29],[13]],[[39,41,48],[17,13],"W2"],[[40,42,31],[17,14,13]],[[41,43,50],[18,17,14]],[[42,44,33],[18,15,14]],[[43,45,52],[19,18,15]],[[44,46,35],[19,16,15]],[[45,47,54],[19,16]],[[46,37],[16]],[[49,40],[17],"W2"],[[48,50],[17]],[[49,51,42],[18,17],"?3"],[[50,52],[18],"?3"],[[51,53,44],[19,18]],[[52,54],[19],"?3"],[[53,46],[19],"?3"]],
|
| 23 |
-
"state":{"bld":[[
|
| 24 |
-
"players":{"
|
| 25 |
}
|
|
|
|
| 17 |
|
| 18 |
JSON:
|
| 19 |
{
|
| 20 |
+
"meta":{"curr":"shon","phase":"SETUP_FIRST_ROUND","robber":10,"dice":null},
|
| 21 |
"H":["","W12","S5","W4","S8","B6","W3","Wh8","B10","W11","D","O3","S4","B10","Wh9","Wh6","S11","O5","Wh9","O2"],
|
| 22 |
"N":[null,[[2,9],[1]],[[1,3],[1],"Wh2"],[[2,4,11],[2,1],"Wh2"],[[3,5],[2]],[[4,6,13],[3,2]],[[5,7],[3],"B2"],[[6,15],[3],"B2"],[[9,18],[4],"?3"],[[8,10,1],[4,1],"?3"],[[9,11,20],[5,4,1]],[[10,12,3],[5,2,1]],[[11,13,22],[6,5,2]],[[12,14,5],[6,3,2]],[[13,15,24],[7,6,3]],[[14,16,7],[7,3]],[[15,26],[7],"O2"],[[18,28],[8],"S2"],[[17,19,8],[8,4]],[[18,20,30],[9,8,4]],[[19,21,10],[9,5,4]],[[20,22,32],[10,9,5]],[[21,23,12],[10,6,5]],[[22,24,34],[11,10,6]],[[23,25,14],[11,7,6]],[[24,26,36],[12,11,7]],[[25,27,16],[12,7],"O2"],[[26,38],[12]],[[29,17],[8],"S2"],[[28,30,39],[13,8]],[[29,31,19],[13,9,8]],[[30,32,41],[14,13,9]],[[31,33,21],[14,10,9]],[[32,34,43],[15,14,10]],[[33,35,23],[15,11,10]],[[34,36,45],[16,15,11]],[[35,37,25],[16,12,11]],[[36,38,47],[16,12],"?3"],[[37,27],[12],"?3"],[[40,29],[13]],[[39,41,48],[17,13],"W2"],[[40,42,31],[17,14,13]],[[41,43,50],[18,17,14]],[[42,44,33],[18,15,14]],[[43,45,52],[19,18,15]],[[44,46,35],[19,16,15]],[[45,47,54],[19,16]],[[46,37],[16]],[[49,40],[17],"W2"],[[48,50],[17]],[[49,51,42],[18,17],"?3"],[[50,52],[18],"?3"],[[51,53,44],[19,18]],[[52,54],[19],"?3"],[[53,46],[19],"?3"]],
|
| 23 |
+
"state":{"bld":[[10,"hadar","S"]],"rds":[[[10,9],"hadar"]]},
|
| 24 |
+
"players":{"hadar":{"vp":1,"res":{}},"shon":{"vp":0,"res":{}},"digeo":{"vp":0,"res":{}}}
|
| 25 |
}
|
examples/ai_testing/my_games/game_20260103_220835_final.json
DELETED
|
@@ -1,890 +0,0 @@
|
|
| 1 |
-
{
|
| 2 |
-
"hexes": [
|
| 3 |
-
{
|
| 4 |
-
"id": 1,
|
| 5 |
-
"type": "wood",
|
| 6 |
-
"number": 12,
|
| 7 |
-
"has_robber": false
|
| 8 |
-
},
|
| 9 |
-
{
|
| 10 |
-
"id": 2,
|
| 11 |
-
"type": "sheep",
|
| 12 |
-
"number": 5,
|
| 13 |
-
"has_robber": false
|
| 14 |
-
},
|
| 15 |
-
{
|
| 16 |
-
"id": 3,
|
| 17 |
-
"type": "wood",
|
| 18 |
-
"number": 4,
|
| 19 |
-
"has_robber": false
|
| 20 |
-
},
|
| 21 |
-
{
|
| 22 |
-
"id": 4,
|
| 23 |
-
"type": "sheep",
|
| 24 |
-
"number": 8,
|
| 25 |
-
"has_robber": false
|
| 26 |
-
},
|
| 27 |
-
{
|
| 28 |
-
"id": 5,
|
| 29 |
-
"type": "brick",
|
| 30 |
-
"number": 6,
|
| 31 |
-
"has_robber": false
|
| 32 |
-
},
|
| 33 |
-
{
|
| 34 |
-
"id": 6,
|
| 35 |
-
"type": "wood",
|
| 36 |
-
"number": 3,
|
| 37 |
-
"has_robber": false
|
| 38 |
-
},
|
| 39 |
-
{
|
| 40 |
-
"id": 7,
|
| 41 |
-
"type": "wheat",
|
| 42 |
-
"number": 8,
|
| 43 |
-
"has_robber": false
|
| 44 |
-
},
|
| 45 |
-
{
|
| 46 |
-
"id": 8,
|
| 47 |
-
"type": "brick",
|
| 48 |
-
"number": 10,
|
| 49 |
-
"has_robber": false
|
| 50 |
-
},
|
| 51 |
-
{
|
| 52 |
-
"id": 9,
|
| 53 |
-
"type": "wood",
|
| 54 |
-
"number": 11,
|
| 55 |
-
"has_robber": false
|
| 56 |
-
},
|
| 57 |
-
{
|
| 58 |
-
"id": 10,
|
| 59 |
-
"type": "desert",
|
| 60 |
-
"number": null,
|
| 61 |
-
"has_robber": true
|
| 62 |
-
},
|
| 63 |
-
{
|
| 64 |
-
"id": 11,
|
| 65 |
-
"type": "ore",
|
| 66 |
-
"number": 3,
|
| 67 |
-
"has_robber": false
|
| 68 |
-
},
|
| 69 |
-
{
|
| 70 |
-
"id": 12,
|
| 71 |
-
"type": "sheep",
|
| 72 |
-
"number": 4,
|
| 73 |
-
"has_robber": false
|
| 74 |
-
},
|
| 75 |
-
{
|
| 76 |
-
"id": 13,
|
| 77 |
-
"type": "brick",
|
| 78 |
-
"number": 10,
|
| 79 |
-
"has_robber": false
|
| 80 |
-
},
|
| 81 |
-
{
|
| 82 |
-
"id": 14,
|
| 83 |
-
"type": "wheat",
|
| 84 |
-
"number": 9,
|
| 85 |
-
"has_robber": false
|
| 86 |
-
},
|
| 87 |
-
{
|
| 88 |
-
"id": 15,
|
| 89 |
-
"type": "wheat",
|
| 90 |
-
"number": 6,
|
| 91 |
-
"has_robber": false
|
| 92 |
-
},
|
| 93 |
-
{
|
| 94 |
-
"id": 16,
|
| 95 |
-
"type": "sheep",
|
| 96 |
-
"number": 11,
|
| 97 |
-
"has_robber": false
|
| 98 |
-
},
|
| 99 |
-
{
|
| 100 |
-
"id": 17,
|
| 101 |
-
"type": "ore",
|
| 102 |
-
"number": 5,
|
| 103 |
-
"has_robber": false
|
| 104 |
-
},
|
| 105 |
-
{
|
| 106 |
-
"id": 18,
|
| 107 |
-
"type": "wheat",
|
| 108 |
-
"number": 9,
|
| 109 |
-
"has_robber": false
|
| 110 |
-
},
|
| 111 |
-
{
|
| 112 |
-
"id": 19,
|
| 113 |
-
"type": "ore",
|
| 114 |
-
"number": 2,
|
| 115 |
-
"has_robber": false
|
| 116 |
-
}
|
| 117 |
-
],
|
| 118 |
-
"settlements": [
|
| 119 |
-
{
|
| 120 |
-
"id": "b_20",
|
| 121 |
-
"vertex": 20,
|
| 122 |
-
"player": 1
|
| 123 |
-
}
|
| 124 |
-
],
|
| 125 |
-
"cities": [],
|
| 126 |
-
"roads": [],
|
| 127 |
-
"harbors": [
|
| 128 |
-
{
|
| 129 |
-
"id": 1,
|
| 130 |
-
"type": "any",
|
| 131 |
-
"ratio": 3,
|
| 132 |
-
"point_one": 9,
|
| 133 |
-
"point_two": 8
|
| 134 |
-
},
|
| 135 |
-
{
|
| 136 |
-
"id": 2,
|
| 137 |
-
"type": "sheep",
|
| 138 |
-
"ratio": 2,
|
| 139 |
-
"point_one": 17,
|
| 140 |
-
"point_two": 28
|
| 141 |
-
},
|
| 142 |
-
{
|
| 143 |
-
"id": 3,
|
| 144 |
-
"type": "wood",
|
| 145 |
-
"ratio": 2,
|
| 146 |
-
"point_one": 40,
|
| 147 |
-
"point_two": 48
|
| 148 |
-
},
|
| 149 |
-
{
|
| 150 |
-
"id": 4,
|
| 151 |
-
"type": "any",
|
| 152 |
-
"ratio": 3,
|
| 153 |
-
"point_one": 50,
|
| 154 |
-
"point_two": 51
|
| 155 |
-
},
|
| 156 |
-
{
|
| 157 |
-
"id": 5,
|
| 158 |
-
"type": "any",
|
| 159 |
-
"ratio": 3,
|
| 160 |
-
"point_one": 53,
|
| 161 |
-
"point_two": 54
|
| 162 |
-
},
|
| 163 |
-
{
|
| 164 |
-
"id": 6,
|
| 165 |
-
"type": "any",
|
| 166 |
-
"ratio": 3,
|
| 167 |
-
"point_one": 37,
|
| 168 |
-
"point_two": 38
|
| 169 |
-
},
|
| 170 |
-
{
|
| 171 |
-
"id": 7,
|
| 172 |
-
"type": "ore",
|
| 173 |
-
"ratio": 2,
|
| 174 |
-
"point_one": 26,
|
| 175 |
-
"point_two": 16
|
| 176 |
-
},
|
| 177 |
-
{
|
| 178 |
-
"id": 8,
|
| 179 |
-
"type": "brick",
|
| 180 |
-
"ratio": 2,
|
| 181 |
-
"point_one": 7,
|
| 182 |
-
"point_two": 6
|
| 183 |
-
},
|
| 184 |
-
{
|
| 185 |
-
"id": 9,
|
| 186 |
-
"type": "wheat",
|
| 187 |
-
"ratio": 2,
|
| 188 |
-
"point_one": 3,
|
| 189 |
-
"point_two": 2
|
| 190 |
-
}
|
| 191 |
-
],
|
| 192 |
-
"players": [
|
| 193 |
-
{
|
| 194 |
-
"id": 0,
|
| 195 |
-
"name": "a",
|
| 196 |
-
"victory_points": 1,
|
| 197 |
-
"total_cards": 0,
|
| 198 |
-
"cards_list": [],
|
| 199 |
-
"dev_cards_list": [],
|
| 200 |
-
"settlements": 1,
|
| 201 |
-
"cities": 0,
|
| 202 |
-
"roads": 0,
|
| 203 |
-
"longest_road": 0,
|
| 204 |
-
"has_longest_road": false,
|
| 205 |
-
"knights": 0,
|
| 206 |
-
"knights_played": 0,
|
| 207 |
-
"has_largest_army": false
|
| 208 |
-
},
|
| 209 |
-
{
|
| 210 |
-
"id": 1,
|
| 211 |
-
"name": "b",
|
| 212 |
-
"victory_points": 0,
|
| 213 |
-
"total_cards": 0,
|
| 214 |
-
"cards_list": [],
|
| 215 |
-
"dev_cards_list": [],
|
| 216 |
-
"settlements": 0,
|
| 217 |
-
"cities": 0,
|
| 218 |
-
"roads": 0,
|
| 219 |
-
"longest_road": 0,
|
| 220 |
-
"has_longest_road": false,
|
| 221 |
-
"knights": 0,
|
| 222 |
-
"knights_played": 0,
|
| 223 |
-
"has_largest_army": false
|
| 224 |
-
},
|
| 225 |
-
{
|
| 226 |
-
"id": 2,
|
| 227 |
-
"name": "c",
|
| 228 |
-
"victory_points": 0,
|
| 229 |
-
"total_cards": 0,
|
| 230 |
-
"cards_list": [],
|
| 231 |
-
"dev_cards_list": [],
|
| 232 |
-
"settlements": 0,
|
| 233 |
-
"cities": 0,
|
| 234 |
-
"roads": 0,
|
| 235 |
-
"longest_road": 0,
|
| 236 |
-
"has_longest_road": false,
|
| 237 |
-
"knights": 0,
|
| 238 |
-
"knights_played": 0,
|
| 239 |
-
"has_largest_army": false
|
| 240 |
-
}
|
| 241 |
-
],
|
| 242 |
-
"current_player": 0,
|
| 243 |
-
"current_phase": "SETUP_FIRST_ROUND",
|
| 244 |
-
"robber_position": [
|
| 245 |
-
2,
|
| 246 |
-
2
|
| 247 |
-
],
|
| 248 |
-
"dice_result": null,
|
| 249 |
-
"allowed_actions": [
|
| 250 |
-
"PLACE_STARTING_ROAD"
|
| 251 |
-
],
|
| 252 |
-
"points": [
|
| 253 |
-
{
|
| 254 |
-
"point_id": 1,
|
| 255 |
-
"adjacent_points": [
|
| 256 |
-
2,
|
| 257 |
-
9
|
| 258 |
-
],
|
| 259 |
-
"adjacent_hexes": [
|
| 260 |
-
1
|
| 261 |
-
]
|
| 262 |
-
},
|
| 263 |
-
{
|
| 264 |
-
"point_id": 2,
|
| 265 |
-
"adjacent_points": [
|
| 266 |
-
1,
|
| 267 |
-
3
|
| 268 |
-
],
|
| 269 |
-
"adjacent_hexes": [
|
| 270 |
-
1
|
| 271 |
-
]
|
| 272 |
-
},
|
| 273 |
-
{
|
| 274 |
-
"point_id": 3,
|
| 275 |
-
"adjacent_points": [
|
| 276 |
-
2,
|
| 277 |
-
4,
|
| 278 |
-
11
|
| 279 |
-
],
|
| 280 |
-
"adjacent_hexes": [
|
| 281 |
-
2,
|
| 282 |
-
1
|
| 283 |
-
]
|
| 284 |
-
},
|
| 285 |
-
{
|
| 286 |
-
"point_id": 4,
|
| 287 |
-
"adjacent_points": [
|
| 288 |
-
3,
|
| 289 |
-
5
|
| 290 |
-
],
|
| 291 |
-
"adjacent_hexes": [
|
| 292 |
-
2
|
| 293 |
-
]
|
| 294 |
-
},
|
| 295 |
-
{
|
| 296 |
-
"point_id": 5,
|
| 297 |
-
"adjacent_points": [
|
| 298 |
-
4,
|
| 299 |
-
6,
|
| 300 |
-
13
|
| 301 |
-
],
|
| 302 |
-
"adjacent_hexes": [
|
| 303 |
-
3,
|
| 304 |
-
2
|
| 305 |
-
]
|
| 306 |
-
},
|
| 307 |
-
{
|
| 308 |
-
"point_id": 6,
|
| 309 |
-
"adjacent_points": [
|
| 310 |
-
5,
|
| 311 |
-
7
|
| 312 |
-
],
|
| 313 |
-
"adjacent_hexes": [
|
| 314 |
-
3
|
| 315 |
-
]
|
| 316 |
-
},
|
| 317 |
-
{
|
| 318 |
-
"point_id": 7,
|
| 319 |
-
"adjacent_points": [
|
| 320 |
-
6,
|
| 321 |
-
15
|
| 322 |
-
],
|
| 323 |
-
"adjacent_hexes": [
|
| 324 |
-
3
|
| 325 |
-
]
|
| 326 |
-
},
|
| 327 |
-
{
|
| 328 |
-
"point_id": 8,
|
| 329 |
-
"adjacent_points": [
|
| 330 |
-
9,
|
| 331 |
-
18
|
| 332 |
-
],
|
| 333 |
-
"adjacent_hexes": [
|
| 334 |
-
4
|
| 335 |
-
]
|
| 336 |
-
},
|
| 337 |
-
{
|
| 338 |
-
"point_id": 9,
|
| 339 |
-
"adjacent_points": [
|
| 340 |
-
8,
|
| 341 |
-
10,
|
| 342 |
-
1
|
| 343 |
-
],
|
| 344 |
-
"adjacent_hexes": [
|
| 345 |
-
4,
|
| 346 |
-
1
|
| 347 |
-
]
|
| 348 |
-
},
|
| 349 |
-
{
|
| 350 |
-
"point_id": 10,
|
| 351 |
-
"adjacent_points": [
|
| 352 |
-
9,
|
| 353 |
-
11,
|
| 354 |
-
20
|
| 355 |
-
],
|
| 356 |
-
"adjacent_hexes": [
|
| 357 |
-
5,
|
| 358 |
-
4,
|
| 359 |
-
1
|
| 360 |
-
]
|
| 361 |
-
},
|
| 362 |
-
{
|
| 363 |
-
"point_id": 11,
|
| 364 |
-
"adjacent_points": [
|
| 365 |
-
10,
|
| 366 |
-
12,
|
| 367 |
-
3
|
| 368 |
-
],
|
| 369 |
-
"adjacent_hexes": [
|
| 370 |
-
5,
|
| 371 |
-
2,
|
| 372 |
-
1
|
| 373 |
-
]
|
| 374 |
-
},
|
| 375 |
-
{
|
| 376 |
-
"point_id": 12,
|
| 377 |
-
"adjacent_points": [
|
| 378 |
-
11,
|
| 379 |
-
13,
|
| 380 |
-
22
|
| 381 |
-
],
|
| 382 |
-
"adjacent_hexes": [
|
| 383 |
-
6,
|
| 384 |
-
5,
|
| 385 |
-
2
|
| 386 |
-
]
|
| 387 |
-
},
|
| 388 |
-
{
|
| 389 |
-
"point_id": 13,
|
| 390 |
-
"adjacent_points": [
|
| 391 |
-
12,
|
| 392 |
-
14,
|
| 393 |
-
5
|
| 394 |
-
],
|
| 395 |
-
"adjacent_hexes": [
|
| 396 |
-
6,
|
| 397 |
-
3,
|
| 398 |
-
2
|
| 399 |
-
]
|
| 400 |
-
},
|
| 401 |
-
{
|
| 402 |
-
"point_id": 14,
|
| 403 |
-
"adjacent_points": [
|
| 404 |
-
13,
|
| 405 |
-
15,
|
| 406 |
-
24
|
| 407 |
-
],
|
| 408 |
-
"adjacent_hexes": [
|
| 409 |
-
7,
|
| 410 |
-
6,
|
| 411 |
-
3
|
| 412 |
-
]
|
| 413 |
-
},
|
| 414 |
-
{
|
| 415 |
-
"point_id": 15,
|
| 416 |
-
"adjacent_points": [
|
| 417 |
-
14,
|
| 418 |
-
16,
|
| 419 |
-
7
|
| 420 |
-
],
|
| 421 |
-
"adjacent_hexes": [
|
| 422 |
-
7,
|
| 423 |
-
3
|
| 424 |
-
]
|
| 425 |
-
},
|
| 426 |
-
{
|
| 427 |
-
"point_id": 16,
|
| 428 |
-
"adjacent_points": [
|
| 429 |
-
15,
|
| 430 |
-
26
|
| 431 |
-
],
|
| 432 |
-
"adjacent_hexes": [
|
| 433 |
-
7
|
| 434 |
-
]
|
| 435 |
-
},
|
| 436 |
-
{
|
| 437 |
-
"point_id": 17,
|
| 438 |
-
"adjacent_points": [
|
| 439 |
-
18,
|
| 440 |
-
28
|
| 441 |
-
],
|
| 442 |
-
"adjacent_hexes": [
|
| 443 |
-
8
|
| 444 |
-
]
|
| 445 |
-
},
|
| 446 |
-
{
|
| 447 |
-
"point_id": 18,
|
| 448 |
-
"adjacent_points": [
|
| 449 |
-
17,
|
| 450 |
-
19,
|
| 451 |
-
8
|
| 452 |
-
],
|
| 453 |
-
"adjacent_hexes": [
|
| 454 |
-
8,
|
| 455 |
-
4
|
| 456 |
-
]
|
| 457 |
-
},
|
| 458 |
-
{
|
| 459 |
-
"point_id": 19,
|
| 460 |
-
"adjacent_points": [
|
| 461 |
-
18,
|
| 462 |
-
20,
|
| 463 |
-
30
|
| 464 |
-
],
|
| 465 |
-
"adjacent_hexes": [
|
| 466 |
-
9,
|
| 467 |
-
8,
|
| 468 |
-
4
|
| 469 |
-
]
|
| 470 |
-
},
|
| 471 |
-
{
|
| 472 |
-
"point_id": 20,
|
| 473 |
-
"adjacent_points": [
|
| 474 |
-
19,
|
| 475 |
-
21,
|
| 476 |
-
10
|
| 477 |
-
],
|
| 478 |
-
"adjacent_hexes": [
|
| 479 |
-
9,
|
| 480 |
-
5,
|
| 481 |
-
4
|
| 482 |
-
]
|
| 483 |
-
},
|
| 484 |
-
{
|
| 485 |
-
"point_id": 21,
|
| 486 |
-
"adjacent_points": [
|
| 487 |
-
20,
|
| 488 |
-
22,
|
| 489 |
-
32
|
| 490 |
-
],
|
| 491 |
-
"adjacent_hexes": [
|
| 492 |
-
10,
|
| 493 |
-
9,
|
| 494 |
-
5
|
| 495 |
-
]
|
| 496 |
-
},
|
| 497 |
-
{
|
| 498 |
-
"point_id": 22,
|
| 499 |
-
"adjacent_points": [
|
| 500 |
-
21,
|
| 501 |
-
23,
|
| 502 |
-
12
|
| 503 |
-
],
|
| 504 |
-
"adjacent_hexes": [
|
| 505 |
-
10,
|
| 506 |
-
6,
|
| 507 |
-
5
|
| 508 |
-
]
|
| 509 |
-
},
|
| 510 |
-
{
|
| 511 |
-
"point_id": 23,
|
| 512 |
-
"adjacent_points": [
|
| 513 |
-
22,
|
| 514 |
-
24,
|
| 515 |
-
34
|
| 516 |
-
],
|
| 517 |
-
"adjacent_hexes": [
|
| 518 |
-
11,
|
| 519 |
-
10,
|
| 520 |
-
6
|
| 521 |
-
]
|
| 522 |
-
},
|
| 523 |
-
{
|
| 524 |
-
"point_id": 24,
|
| 525 |
-
"adjacent_points": [
|
| 526 |
-
23,
|
| 527 |
-
25,
|
| 528 |
-
14
|
| 529 |
-
],
|
| 530 |
-
"adjacent_hexes": [
|
| 531 |
-
11,
|
| 532 |
-
7,
|
| 533 |
-
6
|
| 534 |
-
]
|
| 535 |
-
},
|
| 536 |
-
{
|
| 537 |
-
"point_id": 25,
|
| 538 |
-
"adjacent_points": [
|
| 539 |
-
24,
|
| 540 |
-
26,
|
| 541 |
-
36
|
| 542 |
-
],
|
| 543 |
-
"adjacent_hexes": [
|
| 544 |
-
12,
|
| 545 |
-
11,
|
| 546 |
-
7
|
| 547 |
-
]
|
| 548 |
-
},
|
| 549 |
-
{
|
| 550 |
-
"point_id": 26,
|
| 551 |
-
"adjacent_points": [
|
| 552 |
-
25,
|
| 553 |
-
27,
|
| 554 |
-
16
|
| 555 |
-
],
|
| 556 |
-
"adjacent_hexes": [
|
| 557 |
-
12,
|
| 558 |
-
7
|
| 559 |
-
]
|
| 560 |
-
},
|
| 561 |
-
{
|
| 562 |
-
"point_id": 27,
|
| 563 |
-
"adjacent_points": [
|
| 564 |
-
26,
|
| 565 |
-
38
|
| 566 |
-
],
|
| 567 |
-
"adjacent_hexes": [
|
| 568 |
-
12
|
| 569 |
-
]
|
| 570 |
-
},
|
| 571 |
-
{
|
| 572 |
-
"point_id": 28,
|
| 573 |
-
"adjacent_points": [
|
| 574 |
-
29,
|
| 575 |
-
17
|
| 576 |
-
],
|
| 577 |
-
"adjacent_hexes": [
|
| 578 |
-
8
|
| 579 |
-
]
|
| 580 |
-
},
|
| 581 |
-
{
|
| 582 |
-
"point_id": 29,
|
| 583 |
-
"adjacent_points": [
|
| 584 |
-
28,
|
| 585 |
-
30,
|
| 586 |
-
39
|
| 587 |
-
],
|
| 588 |
-
"adjacent_hexes": [
|
| 589 |
-
13,
|
| 590 |
-
8
|
| 591 |
-
]
|
| 592 |
-
},
|
| 593 |
-
{
|
| 594 |
-
"point_id": 30,
|
| 595 |
-
"adjacent_points": [
|
| 596 |
-
29,
|
| 597 |
-
31,
|
| 598 |
-
19
|
| 599 |
-
],
|
| 600 |
-
"adjacent_hexes": [
|
| 601 |
-
13,
|
| 602 |
-
9,
|
| 603 |
-
8
|
| 604 |
-
]
|
| 605 |
-
},
|
| 606 |
-
{
|
| 607 |
-
"point_id": 31,
|
| 608 |
-
"adjacent_points": [
|
| 609 |
-
30,
|
| 610 |
-
32,
|
| 611 |
-
41
|
| 612 |
-
],
|
| 613 |
-
"adjacent_hexes": [
|
| 614 |
-
14,
|
| 615 |
-
13,
|
| 616 |
-
9
|
| 617 |
-
]
|
| 618 |
-
},
|
| 619 |
-
{
|
| 620 |
-
"point_id": 32,
|
| 621 |
-
"adjacent_points": [
|
| 622 |
-
31,
|
| 623 |
-
33,
|
| 624 |
-
21
|
| 625 |
-
],
|
| 626 |
-
"adjacent_hexes": [
|
| 627 |
-
14,
|
| 628 |
-
10,
|
| 629 |
-
9
|
| 630 |
-
]
|
| 631 |
-
},
|
| 632 |
-
{
|
| 633 |
-
"point_id": 33,
|
| 634 |
-
"adjacent_points": [
|
| 635 |
-
32,
|
| 636 |
-
34,
|
| 637 |
-
43
|
| 638 |
-
],
|
| 639 |
-
"adjacent_hexes": [
|
| 640 |
-
15,
|
| 641 |
-
14,
|
| 642 |
-
10
|
| 643 |
-
]
|
| 644 |
-
},
|
| 645 |
-
{
|
| 646 |
-
"point_id": 34,
|
| 647 |
-
"adjacent_points": [
|
| 648 |
-
33,
|
| 649 |
-
35,
|
| 650 |
-
23
|
| 651 |
-
],
|
| 652 |
-
"adjacent_hexes": [
|
| 653 |
-
15,
|
| 654 |
-
11,
|
| 655 |
-
10
|
| 656 |
-
]
|
| 657 |
-
},
|
| 658 |
-
{
|
| 659 |
-
"point_id": 35,
|
| 660 |
-
"adjacent_points": [
|
| 661 |
-
34,
|
| 662 |
-
36,
|
| 663 |
-
45
|
| 664 |
-
],
|
| 665 |
-
"adjacent_hexes": [
|
| 666 |
-
16,
|
| 667 |
-
15,
|
| 668 |
-
11
|
| 669 |
-
]
|
| 670 |
-
},
|
| 671 |
-
{
|
| 672 |
-
"point_id": 36,
|
| 673 |
-
"adjacent_points": [
|
| 674 |
-
35,
|
| 675 |
-
37,
|
| 676 |
-
25
|
| 677 |
-
],
|
| 678 |
-
"adjacent_hexes": [
|
| 679 |
-
16,
|
| 680 |
-
12,
|
| 681 |
-
11
|
| 682 |
-
]
|
| 683 |
-
},
|
| 684 |
-
{
|
| 685 |
-
"point_id": 37,
|
| 686 |
-
"adjacent_points": [
|
| 687 |
-
36,
|
| 688 |
-
38,
|
| 689 |
-
47
|
| 690 |
-
],
|
| 691 |
-
"adjacent_hexes": [
|
| 692 |
-
16,
|
| 693 |
-
12
|
| 694 |
-
]
|
| 695 |
-
},
|
| 696 |
-
{
|
| 697 |
-
"point_id": 38,
|
| 698 |
-
"adjacent_points": [
|
| 699 |
-
37,
|
| 700 |
-
27
|
| 701 |
-
],
|
| 702 |
-
"adjacent_hexes": [
|
| 703 |
-
12
|
| 704 |
-
]
|
| 705 |
-
},
|
| 706 |
-
{
|
| 707 |
-
"point_id": 39,
|
| 708 |
-
"adjacent_points": [
|
| 709 |
-
40,
|
| 710 |
-
29
|
| 711 |
-
],
|
| 712 |
-
"adjacent_hexes": [
|
| 713 |
-
13
|
| 714 |
-
]
|
| 715 |
-
},
|
| 716 |
-
{
|
| 717 |
-
"point_id": 40,
|
| 718 |
-
"adjacent_points": [
|
| 719 |
-
39,
|
| 720 |
-
41,
|
| 721 |
-
48
|
| 722 |
-
],
|
| 723 |
-
"adjacent_hexes": [
|
| 724 |
-
17,
|
| 725 |
-
13
|
| 726 |
-
]
|
| 727 |
-
},
|
| 728 |
-
{
|
| 729 |
-
"point_id": 41,
|
| 730 |
-
"adjacent_points": [
|
| 731 |
-
40,
|
| 732 |
-
42,
|
| 733 |
-
31
|
| 734 |
-
],
|
| 735 |
-
"adjacent_hexes": [
|
| 736 |
-
17,
|
| 737 |
-
14,
|
| 738 |
-
13
|
| 739 |
-
]
|
| 740 |
-
},
|
| 741 |
-
{
|
| 742 |
-
"point_id": 42,
|
| 743 |
-
"adjacent_points": [
|
| 744 |
-
41,
|
| 745 |
-
43,
|
| 746 |
-
50
|
| 747 |
-
],
|
| 748 |
-
"adjacent_hexes": [
|
| 749 |
-
18,
|
| 750 |
-
17,
|
| 751 |
-
14
|
| 752 |
-
]
|
| 753 |
-
},
|
| 754 |
-
{
|
| 755 |
-
"point_id": 43,
|
| 756 |
-
"adjacent_points": [
|
| 757 |
-
42,
|
| 758 |
-
44,
|
| 759 |
-
33
|
| 760 |
-
],
|
| 761 |
-
"adjacent_hexes": [
|
| 762 |
-
18,
|
| 763 |
-
15,
|
| 764 |
-
14
|
| 765 |
-
]
|
| 766 |
-
},
|
| 767 |
-
{
|
| 768 |
-
"point_id": 44,
|
| 769 |
-
"adjacent_points": [
|
| 770 |
-
43,
|
| 771 |
-
45,
|
| 772 |
-
52
|
| 773 |
-
],
|
| 774 |
-
"adjacent_hexes": [
|
| 775 |
-
19,
|
| 776 |
-
18,
|
| 777 |
-
15
|
| 778 |
-
]
|
| 779 |
-
},
|
| 780 |
-
{
|
| 781 |
-
"point_id": 45,
|
| 782 |
-
"adjacent_points": [
|
| 783 |
-
44,
|
| 784 |
-
46,
|
| 785 |
-
35
|
| 786 |
-
],
|
| 787 |
-
"adjacent_hexes": [
|
| 788 |
-
19,
|
| 789 |
-
16,
|
| 790 |
-
15
|
| 791 |
-
]
|
| 792 |
-
},
|
| 793 |
-
{
|
| 794 |
-
"point_id": 46,
|
| 795 |
-
"adjacent_points": [
|
| 796 |
-
45,
|
| 797 |
-
47,
|
| 798 |
-
54
|
| 799 |
-
],
|
| 800 |
-
"adjacent_hexes": [
|
| 801 |
-
19,
|
| 802 |
-
16
|
| 803 |
-
]
|
| 804 |
-
},
|
| 805 |
-
{
|
| 806 |
-
"point_id": 47,
|
| 807 |
-
"adjacent_points": [
|
| 808 |
-
46,
|
| 809 |
-
37
|
| 810 |
-
],
|
| 811 |
-
"adjacent_hexes": [
|
| 812 |
-
16
|
| 813 |
-
]
|
| 814 |
-
},
|
| 815 |
-
{
|
| 816 |
-
"point_id": 48,
|
| 817 |
-
"adjacent_points": [
|
| 818 |
-
49,
|
| 819 |
-
40
|
| 820 |
-
],
|
| 821 |
-
"adjacent_hexes": [
|
| 822 |
-
17
|
| 823 |
-
]
|
| 824 |
-
},
|
| 825 |
-
{
|
| 826 |
-
"point_id": 49,
|
| 827 |
-
"adjacent_points": [
|
| 828 |
-
48,
|
| 829 |
-
50
|
| 830 |
-
],
|
| 831 |
-
"adjacent_hexes": [
|
| 832 |
-
17
|
| 833 |
-
]
|
| 834 |
-
},
|
| 835 |
-
{
|
| 836 |
-
"point_id": 50,
|
| 837 |
-
"adjacent_points": [
|
| 838 |
-
49,
|
| 839 |
-
51,
|
| 840 |
-
42
|
| 841 |
-
],
|
| 842 |
-
"adjacent_hexes": [
|
| 843 |
-
18,
|
| 844 |
-
17
|
| 845 |
-
]
|
| 846 |
-
},
|
| 847 |
-
{
|
| 848 |
-
"point_id": 51,
|
| 849 |
-
"adjacent_points": [
|
| 850 |
-
50,
|
| 851 |
-
52
|
| 852 |
-
],
|
| 853 |
-
"adjacent_hexes": [
|
| 854 |
-
18
|
| 855 |
-
]
|
| 856 |
-
},
|
| 857 |
-
{
|
| 858 |
-
"point_id": 52,
|
| 859 |
-
"adjacent_points": [
|
| 860 |
-
51,
|
| 861 |
-
53,
|
| 862 |
-
44
|
| 863 |
-
],
|
| 864 |
-
"adjacent_hexes": [
|
| 865 |
-
19,
|
| 866 |
-
18
|
| 867 |
-
]
|
| 868 |
-
},
|
| 869 |
-
{
|
| 870 |
-
"point_id": 53,
|
| 871 |
-
"adjacent_points": [
|
| 872 |
-
52,
|
| 873 |
-
54
|
| 874 |
-
],
|
| 875 |
-
"adjacent_hexes": [
|
| 876 |
-
19
|
| 877 |
-
]
|
| 878 |
-
},
|
| 879 |
-
{
|
| 880 |
-
"point_id": 54,
|
| 881 |
-
"adjacent_points": [
|
| 882 |
-
53,
|
| 883 |
-
46
|
| 884 |
-
],
|
| 885 |
-
"adjacent_hexes": [
|
| 886 |
-
19
|
| 887 |
-
]
|
| 888 |
-
}
|
| 889 |
-
]
|
| 890 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
examples/ai_testing/my_games/game_20260103_220835_final_optimized.txt
DELETED
|
@@ -1,25 +0,0 @@
|
|
| 1 |
-
1. LOOKUP TABLES:
|
| 2 |
-
• "H" (Hexes): Array where Index = HexID. Value = Resource+Num.
|
| 3 |
-
Example: H[1]="W12" -> Hex 1 is Wood 12.
|
| 4 |
-
• "N" (Nodes): Array where Index = NodeID.
|
| 5 |
-
Format: [ [Neighbors], [HexIDs], Port? ]
|
| 6 |
-
Logic: To find yield of Node 10, check N[10]. Get HexIDs (e.g. [1,5]). Look up H[1] and H[5].
|
| 7 |
-
|
| 8 |
-
2. CODES: W=Wood, B=Brick, S=Sheep, Wh=Wheat, O=Ore, D=Desert.
|
| 9 |
-
?3=Any 3:1 port, X2=Specific Resource 2:1 port.
|
| 10 |
-
|
| 11 |
-
3. STATE: "bld"=[NodeID, Owner, Type], "rds"=[[From,To], Owner].
|
| 12 |
-
|
| 13 |
-
4. PLAYERS: "res"={Resource:Count}, "dev"={"h":[Hidden Cards], "r":[Revealed] (K=Knight)},
|
| 14 |
-
"stat"=["LR" (Longest Road), "LA" (Largest Army)].
|
| 15 |
-
|
| 16 |
-
5. ROBBER: Located at HexID specified in "meta.robber". H[id] is blocked.
|
| 17 |
-
|
| 18 |
-
JSON:
|
| 19 |
-
{
|
| 20 |
-
"meta":{"curr":"a","phase":"SETUP_FIRST_ROUND","robber":10,"dice":null},
|
| 21 |
-
"H":["","W12","S5","W4","S8","B6","W3","Wh8","B10","W11","D","O3","S4","B10","Wh9","Wh6","S11","O5","Wh9","O2"],
|
| 22 |
-
"N":[null,[[2,9],[1]],[[1,3],[1],"Wh2"],[[2,4,11],[2,1],"Wh2"],[[3,5],[2]],[[4,6,13],[3,2]],[[5,7],[3],"B2"],[[6,15],[3],"B2"],[[9,18],[4],"?3"],[[8,10,1],[4,1],"?3"],[[9,11,20],[5,4,1]],[[10,12,3],[5,2,1]],[[11,13,22],[6,5,2]],[[12,14,5],[6,3,2]],[[13,15,24],[7,6,3]],[[14,16,7],[7,3]],[[15,26],[7],"O2"],[[18,28],[8],"S2"],[[17,19,8],[8,4]],[[18,20,30],[9,8,4]],[[19,21,10],[9,5,4]],[[20,22,32],[10,9,5]],[[21,23,12],[10,6,5]],[[22,24,34],[11,10,6]],[[23,25,14],[11,7,6]],[[24,26,36],[12,11,7]],[[25,27,16],[12,7],"O2"],[[26,38],[12]],[[29,17],[8],"S2"],[[28,30,39],[13,8]],[[29,31,19],[13,9,8]],[[30,32,41],[14,13,9]],[[31,33,21],[14,10,9]],[[32,34,43],[15,14,10]],[[33,35,23],[15,11,10]],[[34,36,45],[16,15,11]],[[35,37,25],[16,12,11]],[[36,38,47],[16,12],"?3"],[[37,27],[12],"?3"],[[40,29],[13]],[[39,41,48],[17,13],"W2"],[[40,42,31],[17,14,13]],[[41,43,50],[18,17,14]],[[42,44,33],[18,15,14]],[[43,45,52],[19,18,15]],[[44,46,35],[19,16,15]],[[45,47,54],[19,16]],[[46,37],[16]],[[49,40],[17],"W2"],[[48,50],[17]],[[49,51,42],[18,17],"?3"],[[50,52],[18],"?3"],[[51,53,44],[19,18]],[[52,54],[19],"?3"],[[53,46],[19],"?3"]],
|
| 23 |
-
"state":{"bld":[[20,"a","S"]],"rds":[]},
|
| 24 |
-
"players":{"a":{"vp":1,"res":{}},"b":{"vp":0,"res":{}},"c":{"vp":0,"res":{}}}
|
| 25 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
examples/ai_testing/my_games/game_20260103_220835_full.json
DELETED
|
@@ -1,2664 +0,0 @@
|
|
| 1 |
-
{
|
| 2 |
-
"total_states": 3,
|
| 3 |
-
"timestamp": "20260103_220835",
|
| 4 |
-
"states": [
|
| 5 |
-
{
|
| 6 |
-
"hexes": [
|
| 7 |
-
{
|
| 8 |
-
"id": 1,
|
| 9 |
-
"type": "wood",
|
| 10 |
-
"number": 12,
|
| 11 |
-
"has_robber": false
|
| 12 |
-
},
|
| 13 |
-
{
|
| 14 |
-
"id": 2,
|
| 15 |
-
"type": "sheep",
|
| 16 |
-
"number": 5,
|
| 17 |
-
"has_robber": false
|
| 18 |
-
},
|
| 19 |
-
{
|
| 20 |
-
"id": 3,
|
| 21 |
-
"type": "wood",
|
| 22 |
-
"number": 4,
|
| 23 |
-
"has_robber": false
|
| 24 |
-
},
|
| 25 |
-
{
|
| 26 |
-
"id": 4,
|
| 27 |
-
"type": "sheep",
|
| 28 |
-
"number": 8,
|
| 29 |
-
"has_robber": false
|
| 30 |
-
},
|
| 31 |
-
{
|
| 32 |
-
"id": 5,
|
| 33 |
-
"type": "brick",
|
| 34 |
-
"number": 6,
|
| 35 |
-
"has_robber": false
|
| 36 |
-
},
|
| 37 |
-
{
|
| 38 |
-
"id": 6,
|
| 39 |
-
"type": "wood",
|
| 40 |
-
"number": 3,
|
| 41 |
-
"has_robber": false
|
| 42 |
-
},
|
| 43 |
-
{
|
| 44 |
-
"id": 7,
|
| 45 |
-
"type": "wheat",
|
| 46 |
-
"number": 8,
|
| 47 |
-
"has_robber": false
|
| 48 |
-
},
|
| 49 |
-
{
|
| 50 |
-
"id": 8,
|
| 51 |
-
"type": "brick",
|
| 52 |
-
"number": 10,
|
| 53 |
-
"has_robber": false
|
| 54 |
-
},
|
| 55 |
-
{
|
| 56 |
-
"id": 9,
|
| 57 |
-
"type": "wood",
|
| 58 |
-
"number": 11,
|
| 59 |
-
"has_robber": false
|
| 60 |
-
},
|
| 61 |
-
{
|
| 62 |
-
"id": 10,
|
| 63 |
-
"type": "desert",
|
| 64 |
-
"number": null,
|
| 65 |
-
"has_robber": true
|
| 66 |
-
},
|
| 67 |
-
{
|
| 68 |
-
"id": 11,
|
| 69 |
-
"type": "ore",
|
| 70 |
-
"number": 3,
|
| 71 |
-
"has_robber": false
|
| 72 |
-
},
|
| 73 |
-
{
|
| 74 |
-
"id": 12,
|
| 75 |
-
"type": "sheep",
|
| 76 |
-
"number": 4,
|
| 77 |
-
"has_robber": false
|
| 78 |
-
},
|
| 79 |
-
{
|
| 80 |
-
"id": 13,
|
| 81 |
-
"type": "brick",
|
| 82 |
-
"number": 10,
|
| 83 |
-
"has_robber": false
|
| 84 |
-
},
|
| 85 |
-
{
|
| 86 |
-
"id": 14,
|
| 87 |
-
"type": "wheat",
|
| 88 |
-
"number": 9,
|
| 89 |
-
"has_robber": false
|
| 90 |
-
},
|
| 91 |
-
{
|
| 92 |
-
"id": 15,
|
| 93 |
-
"type": "wheat",
|
| 94 |
-
"number": 6,
|
| 95 |
-
"has_robber": false
|
| 96 |
-
},
|
| 97 |
-
{
|
| 98 |
-
"id": 16,
|
| 99 |
-
"type": "sheep",
|
| 100 |
-
"number": 11,
|
| 101 |
-
"has_robber": false
|
| 102 |
-
},
|
| 103 |
-
{
|
| 104 |
-
"id": 17,
|
| 105 |
-
"type": "ore",
|
| 106 |
-
"number": 5,
|
| 107 |
-
"has_robber": false
|
| 108 |
-
},
|
| 109 |
-
{
|
| 110 |
-
"id": 18,
|
| 111 |
-
"type": "wheat",
|
| 112 |
-
"number": 9,
|
| 113 |
-
"has_robber": false
|
| 114 |
-
},
|
| 115 |
-
{
|
| 116 |
-
"id": 19,
|
| 117 |
-
"type": "ore",
|
| 118 |
-
"number": 2,
|
| 119 |
-
"has_robber": false
|
| 120 |
-
}
|
| 121 |
-
],
|
| 122 |
-
"settlements": [],
|
| 123 |
-
"cities": [],
|
| 124 |
-
"roads": [],
|
| 125 |
-
"harbors": [
|
| 126 |
-
{
|
| 127 |
-
"id": 1,
|
| 128 |
-
"type": "any",
|
| 129 |
-
"ratio": 3,
|
| 130 |
-
"point_one": 9,
|
| 131 |
-
"point_two": 8
|
| 132 |
-
},
|
| 133 |
-
{
|
| 134 |
-
"id": 2,
|
| 135 |
-
"type": "sheep",
|
| 136 |
-
"ratio": 2,
|
| 137 |
-
"point_one": 17,
|
| 138 |
-
"point_two": 28
|
| 139 |
-
},
|
| 140 |
-
{
|
| 141 |
-
"id": 3,
|
| 142 |
-
"type": "wood",
|
| 143 |
-
"ratio": 2,
|
| 144 |
-
"point_one": 40,
|
| 145 |
-
"point_two": 48
|
| 146 |
-
},
|
| 147 |
-
{
|
| 148 |
-
"id": 4,
|
| 149 |
-
"type": "any",
|
| 150 |
-
"ratio": 3,
|
| 151 |
-
"point_one": 50,
|
| 152 |
-
"point_two": 51
|
| 153 |
-
},
|
| 154 |
-
{
|
| 155 |
-
"id": 5,
|
| 156 |
-
"type": "any",
|
| 157 |
-
"ratio": 3,
|
| 158 |
-
"point_one": 53,
|
| 159 |
-
"point_two": 54
|
| 160 |
-
},
|
| 161 |
-
{
|
| 162 |
-
"id": 6,
|
| 163 |
-
"type": "any",
|
| 164 |
-
"ratio": 3,
|
| 165 |
-
"point_one": 37,
|
| 166 |
-
"point_two": 38
|
| 167 |
-
},
|
| 168 |
-
{
|
| 169 |
-
"id": 7,
|
| 170 |
-
"type": "ore",
|
| 171 |
-
"ratio": 2,
|
| 172 |
-
"point_one": 26,
|
| 173 |
-
"point_two": 16
|
| 174 |
-
},
|
| 175 |
-
{
|
| 176 |
-
"id": 8,
|
| 177 |
-
"type": "brick",
|
| 178 |
-
"ratio": 2,
|
| 179 |
-
"point_one": 7,
|
| 180 |
-
"point_two": 6
|
| 181 |
-
},
|
| 182 |
-
{
|
| 183 |
-
"id": 9,
|
| 184 |
-
"type": "wheat",
|
| 185 |
-
"ratio": 2,
|
| 186 |
-
"point_one": 3,
|
| 187 |
-
"point_two": 2
|
| 188 |
-
}
|
| 189 |
-
],
|
| 190 |
-
"players": [
|
| 191 |
-
{
|
| 192 |
-
"id": 0,
|
| 193 |
-
"name": "a",
|
| 194 |
-
"victory_points": 0,
|
| 195 |
-
"total_cards": 0,
|
| 196 |
-
"cards_list": [],
|
| 197 |
-
"dev_cards_list": [],
|
| 198 |
-
"settlements": 0,
|
| 199 |
-
"cities": 0,
|
| 200 |
-
"roads": 0,
|
| 201 |
-
"longest_road": 0,
|
| 202 |
-
"has_longest_road": false,
|
| 203 |
-
"knights": 0,
|
| 204 |
-
"knights_played": 0,
|
| 205 |
-
"has_largest_army": false
|
| 206 |
-
},
|
| 207 |
-
{
|
| 208 |
-
"id": 1,
|
| 209 |
-
"name": "b",
|
| 210 |
-
"victory_points": 0,
|
| 211 |
-
"total_cards": 0,
|
| 212 |
-
"cards_list": [],
|
| 213 |
-
"dev_cards_list": [],
|
| 214 |
-
"settlements": 0,
|
| 215 |
-
"cities": 0,
|
| 216 |
-
"roads": 0,
|
| 217 |
-
"longest_road": 0,
|
| 218 |
-
"has_longest_road": false,
|
| 219 |
-
"knights": 0,
|
| 220 |
-
"knights_played": 0,
|
| 221 |
-
"has_largest_army": false
|
| 222 |
-
},
|
| 223 |
-
{
|
| 224 |
-
"id": 2,
|
| 225 |
-
"name": "c",
|
| 226 |
-
"victory_points": 0,
|
| 227 |
-
"total_cards": 0,
|
| 228 |
-
"cards_list": [],
|
| 229 |
-
"dev_cards_list": [],
|
| 230 |
-
"settlements": 0,
|
| 231 |
-
"cities": 0,
|
| 232 |
-
"roads": 0,
|
| 233 |
-
"longest_road": 0,
|
| 234 |
-
"has_longest_road": false,
|
| 235 |
-
"knights": 0,
|
| 236 |
-
"knights_played": 0,
|
| 237 |
-
"has_largest_army": false
|
| 238 |
-
}
|
| 239 |
-
],
|
| 240 |
-
"current_player": 0,
|
| 241 |
-
"current_phase": "SETUP_FIRST_ROUND",
|
| 242 |
-
"robber_position": [
|
| 243 |
-
2,
|
| 244 |
-
2
|
| 245 |
-
],
|
| 246 |
-
"dice_result": null,
|
| 247 |
-
"allowed_actions": [
|
| 248 |
-
"PLACE_STARTING_SETTLEMENT"
|
| 249 |
-
],
|
| 250 |
-
"points": [
|
| 251 |
-
{
|
| 252 |
-
"point_id": 1,
|
| 253 |
-
"adjacent_points": [
|
| 254 |
-
2,
|
| 255 |
-
9
|
| 256 |
-
],
|
| 257 |
-
"adjacent_hexes": [
|
| 258 |
-
1
|
| 259 |
-
]
|
| 260 |
-
},
|
| 261 |
-
{
|
| 262 |
-
"point_id": 2,
|
| 263 |
-
"adjacent_points": [
|
| 264 |
-
1,
|
| 265 |
-
3
|
| 266 |
-
],
|
| 267 |
-
"adjacent_hexes": [
|
| 268 |
-
1
|
| 269 |
-
]
|
| 270 |
-
},
|
| 271 |
-
{
|
| 272 |
-
"point_id": 3,
|
| 273 |
-
"adjacent_points": [
|
| 274 |
-
2,
|
| 275 |
-
4,
|
| 276 |
-
11
|
| 277 |
-
],
|
| 278 |
-
"adjacent_hexes": [
|
| 279 |
-
2,
|
| 280 |
-
1
|
| 281 |
-
]
|
| 282 |
-
},
|
| 283 |
-
{
|
| 284 |
-
"point_id": 4,
|
| 285 |
-
"adjacent_points": [
|
| 286 |
-
3,
|
| 287 |
-
5
|
| 288 |
-
],
|
| 289 |
-
"adjacent_hexes": [
|
| 290 |
-
2
|
| 291 |
-
]
|
| 292 |
-
},
|
| 293 |
-
{
|
| 294 |
-
"point_id": 5,
|
| 295 |
-
"adjacent_points": [
|
| 296 |
-
4,
|
| 297 |
-
6,
|
| 298 |
-
13
|
| 299 |
-
],
|
| 300 |
-
"adjacent_hexes": [
|
| 301 |
-
3,
|
| 302 |
-
2
|
| 303 |
-
]
|
| 304 |
-
},
|
| 305 |
-
{
|
| 306 |
-
"point_id": 6,
|
| 307 |
-
"adjacent_points": [
|
| 308 |
-
5,
|
| 309 |
-
7
|
| 310 |
-
],
|
| 311 |
-
"adjacent_hexes": [
|
| 312 |
-
3
|
| 313 |
-
]
|
| 314 |
-
},
|
| 315 |
-
{
|
| 316 |
-
"point_id": 7,
|
| 317 |
-
"adjacent_points": [
|
| 318 |
-
6,
|
| 319 |
-
15
|
| 320 |
-
],
|
| 321 |
-
"adjacent_hexes": [
|
| 322 |
-
3
|
| 323 |
-
]
|
| 324 |
-
},
|
| 325 |
-
{
|
| 326 |
-
"point_id": 8,
|
| 327 |
-
"adjacent_points": [
|
| 328 |
-
9,
|
| 329 |
-
18
|
| 330 |
-
],
|
| 331 |
-
"adjacent_hexes": [
|
| 332 |
-
4
|
| 333 |
-
]
|
| 334 |
-
},
|
| 335 |
-
{
|
| 336 |
-
"point_id": 9,
|
| 337 |
-
"adjacent_points": [
|
| 338 |
-
8,
|
| 339 |
-
10,
|
| 340 |
-
1
|
| 341 |
-
],
|
| 342 |
-
"adjacent_hexes": [
|
| 343 |
-
4,
|
| 344 |
-
1
|
| 345 |
-
]
|
| 346 |
-
},
|
| 347 |
-
{
|
| 348 |
-
"point_id": 10,
|
| 349 |
-
"adjacent_points": [
|
| 350 |
-
9,
|
| 351 |
-
11,
|
| 352 |
-
20
|
| 353 |
-
],
|
| 354 |
-
"adjacent_hexes": [
|
| 355 |
-
5,
|
| 356 |
-
4,
|
| 357 |
-
1
|
| 358 |
-
]
|
| 359 |
-
},
|
| 360 |
-
{
|
| 361 |
-
"point_id": 11,
|
| 362 |
-
"adjacent_points": [
|
| 363 |
-
10,
|
| 364 |
-
12,
|
| 365 |
-
3
|
| 366 |
-
],
|
| 367 |
-
"adjacent_hexes": [
|
| 368 |
-
5,
|
| 369 |
-
2,
|
| 370 |
-
1
|
| 371 |
-
]
|
| 372 |
-
},
|
| 373 |
-
{
|
| 374 |
-
"point_id": 12,
|
| 375 |
-
"adjacent_points": [
|
| 376 |
-
11,
|
| 377 |
-
13,
|
| 378 |
-
22
|
| 379 |
-
],
|
| 380 |
-
"adjacent_hexes": [
|
| 381 |
-
6,
|
| 382 |
-
5,
|
| 383 |
-
2
|
| 384 |
-
]
|
| 385 |
-
},
|
| 386 |
-
{
|
| 387 |
-
"point_id": 13,
|
| 388 |
-
"adjacent_points": [
|
| 389 |
-
12,
|
| 390 |
-
14,
|
| 391 |
-
5
|
| 392 |
-
],
|
| 393 |
-
"adjacent_hexes": [
|
| 394 |
-
6,
|
| 395 |
-
3,
|
| 396 |
-
2
|
| 397 |
-
]
|
| 398 |
-
},
|
| 399 |
-
{
|
| 400 |
-
"point_id": 14,
|
| 401 |
-
"adjacent_points": [
|
| 402 |
-
13,
|
| 403 |
-
15,
|
| 404 |
-
24
|
| 405 |
-
],
|
| 406 |
-
"adjacent_hexes": [
|
| 407 |
-
7,
|
| 408 |
-
6,
|
| 409 |
-
3
|
| 410 |
-
]
|
| 411 |
-
},
|
| 412 |
-
{
|
| 413 |
-
"point_id": 15,
|
| 414 |
-
"adjacent_points": [
|
| 415 |
-
14,
|
| 416 |
-
16,
|
| 417 |
-
7
|
| 418 |
-
],
|
| 419 |
-
"adjacent_hexes": [
|
| 420 |
-
7,
|
| 421 |
-
3
|
| 422 |
-
]
|
| 423 |
-
},
|
| 424 |
-
{
|
| 425 |
-
"point_id": 16,
|
| 426 |
-
"adjacent_points": [
|
| 427 |
-
15,
|
| 428 |
-
26
|
| 429 |
-
],
|
| 430 |
-
"adjacent_hexes": [
|
| 431 |
-
7
|
| 432 |
-
]
|
| 433 |
-
},
|
| 434 |
-
{
|
| 435 |
-
"point_id": 17,
|
| 436 |
-
"adjacent_points": [
|
| 437 |
-
18,
|
| 438 |
-
28
|
| 439 |
-
],
|
| 440 |
-
"adjacent_hexes": [
|
| 441 |
-
8
|
| 442 |
-
]
|
| 443 |
-
},
|
| 444 |
-
{
|
| 445 |
-
"point_id": 18,
|
| 446 |
-
"adjacent_points": [
|
| 447 |
-
17,
|
| 448 |
-
19,
|
| 449 |
-
8
|
| 450 |
-
],
|
| 451 |
-
"adjacent_hexes": [
|
| 452 |
-
8,
|
| 453 |
-
4
|
| 454 |
-
]
|
| 455 |
-
},
|
| 456 |
-
{
|
| 457 |
-
"point_id": 19,
|
| 458 |
-
"adjacent_points": [
|
| 459 |
-
18,
|
| 460 |
-
20,
|
| 461 |
-
30
|
| 462 |
-
],
|
| 463 |
-
"adjacent_hexes": [
|
| 464 |
-
9,
|
| 465 |
-
8,
|
| 466 |
-
4
|
| 467 |
-
]
|
| 468 |
-
},
|
| 469 |
-
{
|
| 470 |
-
"point_id": 20,
|
| 471 |
-
"adjacent_points": [
|
| 472 |
-
19,
|
| 473 |
-
21,
|
| 474 |
-
10
|
| 475 |
-
],
|
| 476 |
-
"adjacent_hexes": [
|
| 477 |
-
9,
|
| 478 |
-
5,
|
| 479 |
-
4
|
| 480 |
-
]
|
| 481 |
-
},
|
| 482 |
-
{
|
| 483 |
-
"point_id": 21,
|
| 484 |
-
"adjacent_points": [
|
| 485 |
-
20,
|
| 486 |
-
22,
|
| 487 |
-
32
|
| 488 |
-
],
|
| 489 |
-
"adjacent_hexes": [
|
| 490 |
-
10,
|
| 491 |
-
9,
|
| 492 |
-
5
|
| 493 |
-
]
|
| 494 |
-
},
|
| 495 |
-
{
|
| 496 |
-
"point_id": 22,
|
| 497 |
-
"adjacent_points": [
|
| 498 |
-
21,
|
| 499 |
-
23,
|
| 500 |
-
12
|
| 501 |
-
],
|
| 502 |
-
"adjacent_hexes": [
|
| 503 |
-
10,
|
| 504 |
-
6,
|
| 505 |
-
5
|
| 506 |
-
]
|
| 507 |
-
},
|
| 508 |
-
{
|
| 509 |
-
"point_id": 23,
|
| 510 |
-
"adjacent_points": [
|
| 511 |
-
22,
|
| 512 |
-
24,
|
| 513 |
-
34
|
| 514 |
-
],
|
| 515 |
-
"adjacent_hexes": [
|
| 516 |
-
11,
|
| 517 |
-
10,
|
| 518 |
-
6
|
| 519 |
-
]
|
| 520 |
-
},
|
| 521 |
-
{
|
| 522 |
-
"point_id": 24,
|
| 523 |
-
"adjacent_points": [
|
| 524 |
-
23,
|
| 525 |
-
25,
|
| 526 |
-
14
|
| 527 |
-
],
|
| 528 |
-
"adjacent_hexes": [
|
| 529 |
-
11,
|
| 530 |
-
7,
|
| 531 |
-
6
|
| 532 |
-
]
|
| 533 |
-
},
|
| 534 |
-
{
|
| 535 |
-
"point_id": 25,
|
| 536 |
-
"adjacent_points": [
|
| 537 |
-
24,
|
| 538 |
-
26,
|
| 539 |
-
36
|
| 540 |
-
],
|
| 541 |
-
"adjacent_hexes": [
|
| 542 |
-
12,
|
| 543 |
-
11,
|
| 544 |
-
7
|
| 545 |
-
]
|
| 546 |
-
},
|
| 547 |
-
{
|
| 548 |
-
"point_id": 26,
|
| 549 |
-
"adjacent_points": [
|
| 550 |
-
25,
|
| 551 |
-
27,
|
| 552 |
-
16
|
| 553 |
-
],
|
| 554 |
-
"adjacent_hexes": [
|
| 555 |
-
12,
|
| 556 |
-
7
|
| 557 |
-
]
|
| 558 |
-
},
|
| 559 |
-
{
|
| 560 |
-
"point_id": 27,
|
| 561 |
-
"adjacent_points": [
|
| 562 |
-
26,
|
| 563 |
-
38
|
| 564 |
-
],
|
| 565 |
-
"adjacent_hexes": [
|
| 566 |
-
12
|
| 567 |
-
]
|
| 568 |
-
},
|
| 569 |
-
{
|
| 570 |
-
"point_id": 28,
|
| 571 |
-
"adjacent_points": [
|
| 572 |
-
29,
|
| 573 |
-
17
|
| 574 |
-
],
|
| 575 |
-
"adjacent_hexes": [
|
| 576 |
-
8
|
| 577 |
-
]
|
| 578 |
-
},
|
| 579 |
-
{
|
| 580 |
-
"point_id": 29,
|
| 581 |
-
"adjacent_points": [
|
| 582 |
-
28,
|
| 583 |
-
30,
|
| 584 |
-
39
|
| 585 |
-
],
|
| 586 |
-
"adjacent_hexes": [
|
| 587 |
-
13,
|
| 588 |
-
8
|
| 589 |
-
]
|
| 590 |
-
},
|
| 591 |
-
{
|
| 592 |
-
"point_id": 30,
|
| 593 |
-
"adjacent_points": [
|
| 594 |
-
29,
|
| 595 |
-
31,
|
| 596 |
-
19
|
| 597 |
-
],
|
| 598 |
-
"adjacent_hexes": [
|
| 599 |
-
13,
|
| 600 |
-
9,
|
| 601 |
-
8
|
| 602 |
-
]
|
| 603 |
-
},
|
| 604 |
-
{
|
| 605 |
-
"point_id": 31,
|
| 606 |
-
"adjacent_points": [
|
| 607 |
-
30,
|
| 608 |
-
32,
|
| 609 |
-
41
|
| 610 |
-
],
|
| 611 |
-
"adjacent_hexes": [
|
| 612 |
-
14,
|
| 613 |
-
13,
|
| 614 |
-
9
|
| 615 |
-
]
|
| 616 |
-
},
|
| 617 |
-
{
|
| 618 |
-
"point_id": 32,
|
| 619 |
-
"adjacent_points": [
|
| 620 |
-
31,
|
| 621 |
-
33,
|
| 622 |
-
21
|
| 623 |
-
],
|
| 624 |
-
"adjacent_hexes": [
|
| 625 |
-
14,
|
| 626 |
-
10,
|
| 627 |
-
9
|
| 628 |
-
]
|
| 629 |
-
},
|
| 630 |
-
{
|
| 631 |
-
"point_id": 33,
|
| 632 |
-
"adjacent_points": [
|
| 633 |
-
32,
|
| 634 |
-
34,
|
| 635 |
-
43
|
| 636 |
-
],
|
| 637 |
-
"adjacent_hexes": [
|
| 638 |
-
15,
|
| 639 |
-
14,
|
| 640 |
-
10
|
| 641 |
-
]
|
| 642 |
-
},
|
| 643 |
-
{
|
| 644 |
-
"point_id": 34,
|
| 645 |
-
"adjacent_points": [
|
| 646 |
-
33,
|
| 647 |
-
35,
|
| 648 |
-
23
|
| 649 |
-
],
|
| 650 |
-
"adjacent_hexes": [
|
| 651 |
-
15,
|
| 652 |
-
11,
|
| 653 |
-
10
|
| 654 |
-
]
|
| 655 |
-
},
|
| 656 |
-
{
|
| 657 |
-
"point_id": 35,
|
| 658 |
-
"adjacent_points": [
|
| 659 |
-
34,
|
| 660 |
-
36,
|
| 661 |
-
45
|
| 662 |
-
],
|
| 663 |
-
"adjacent_hexes": [
|
| 664 |
-
16,
|
| 665 |
-
15,
|
| 666 |
-
11
|
| 667 |
-
]
|
| 668 |
-
},
|
| 669 |
-
{
|
| 670 |
-
"point_id": 36,
|
| 671 |
-
"adjacent_points": [
|
| 672 |
-
35,
|
| 673 |
-
37,
|
| 674 |
-
25
|
| 675 |
-
],
|
| 676 |
-
"adjacent_hexes": [
|
| 677 |
-
16,
|
| 678 |
-
12,
|
| 679 |
-
11
|
| 680 |
-
]
|
| 681 |
-
},
|
| 682 |
-
{
|
| 683 |
-
"point_id": 37,
|
| 684 |
-
"adjacent_points": [
|
| 685 |
-
36,
|
| 686 |
-
38,
|
| 687 |
-
47
|
| 688 |
-
],
|
| 689 |
-
"adjacent_hexes": [
|
| 690 |
-
16,
|
| 691 |
-
12
|
| 692 |
-
]
|
| 693 |
-
},
|
| 694 |
-
{
|
| 695 |
-
"point_id": 38,
|
| 696 |
-
"adjacent_points": [
|
| 697 |
-
37,
|
| 698 |
-
27
|
| 699 |
-
],
|
| 700 |
-
"adjacent_hexes": [
|
| 701 |
-
12
|
| 702 |
-
]
|
| 703 |
-
},
|
| 704 |
-
{
|
| 705 |
-
"point_id": 39,
|
| 706 |
-
"adjacent_points": [
|
| 707 |
-
40,
|
| 708 |
-
29
|
| 709 |
-
],
|
| 710 |
-
"adjacent_hexes": [
|
| 711 |
-
13
|
| 712 |
-
]
|
| 713 |
-
},
|
| 714 |
-
{
|
| 715 |
-
"point_id": 40,
|
| 716 |
-
"adjacent_points": [
|
| 717 |
-
39,
|
| 718 |
-
41,
|
| 719 |
-
48
|
| 720 |
-
],
|
| 721 |
-
"adjacent_hexes": [
|
| 722 |
-
17,
|
| 723 |
-
13
|
| 724 |
-
]
|
| 725 |
-
},
|
| 726 |
-
{
|
| 727 |
-
"point_id": 41,
|
| 728 |
-
"adjacent_points": [
|
| 729 |
-
40,
|
| 730 |
-
42,
|
| 731 |
-
31
|
| 732 |
-
],
|
| 733 |
-
"adjacent_hexes": [
|
| 734 |
-
17,
|
| 735 |
-
14,
|
| 736 |
-
13
|
| 737 |
-
]
|
| 738 |
-
},
|
| 739 |
-
{
|
| 740 |
-
"point_id": 42,
|
| 741 |
-
"adjacent_points": [
|
| 742 |
-
41,
|
| 743 |
-
43,
|
| 744 |
-
50
|
| 745 |
-
],
|
| 746 |
-
"adjacent_hexes": [
|
| 747 |
-
18,
|
| 748 |
-
17,
|
| 749 |
-
14
|
| 750 |
-
]
|
| 751 |
-
},
|
| 752 |
-
{
|
| 753 |
-
"point_id": 43,
|
| 754 |
-
"adjacent_points": [
|
| 755 |
-
42,
|
| 756 |
-
44,
|
| 757 |
-
33
|
| 758 |
-
],
|
| 759 |
-
"adjacent_hexes": [
|
| 760 |
-
18,
|
| 761 |
-
15,
|
| 762 |
-
14
|
| 763 |
-
]
|
| 764 |
-
},
|
| 765 |
-
{
|
| 766 |
-
"point_id": 44,
|
| 767 |
-
"adjacent_points": [
|
| 768 |
-
43,
|
| 769 |
-
45,
|
| 770 |
-
52
|
| 771 |
-
],
|
| 772 |
-
"adjacent_hexes": [
|
| 773 |
-
19,
|
| 774 |
-
18,
|
| 775 |
-
15
|
| 776 |
-
]
|
| 777 |
-
},
|
| 778 |
-
{
|
| 779 |
-
"point_id": 45,
|
| 780 |
-
"adjacent_points": [
|
| 781 |
-
44,
|
| 782 |
-
46,
|
| 783 |
-
35
|
| 784 |
-
],
|
| 785 |
-
"adjacent_hexes": [
|
| 786 |
-
19,
|
| 787 |
-
16,
|
| 788 |
-
15
|
| 789 |
-
]
|
| 790 |
-
},
|
| 791 |
-
{
|
| 792 |
-
"point_id": 46,
|
| 793 |
-
"adjacent_points": [
|
| 794 |
-
45,
|
| 795 |
-
47,
|
| 796 |
-
54
|
| 797 |
-
],
|
| 798 |
-
"adjacent_hexes": [
|
| 799 |
-
19,
|
| 800 |
-
16
|
| 801 |
-
]
|
| 802 |
-
},
|
| 803 |
-
{
|
| 804 |
-
"point_id": 47,
|
| 805 |
-
"adjacent_points": [
|
| 806 |
-
46,
|
| 807 |
-
37
|
| 808 |
-
],
|
| 809 |
-
"adjacent_hexes": [
|
| 810 |
-
16
|
| 811 |
-
]
|
| 812 |
-
},
|
| 813 |
-
{
|
| 814 |
-
"point_id": 48,
|
| 815 |
-
"adjacent_points": [
|
| 816 |
-
49,
|
| 817 |
-
40
|
| 818 |
-
],
|
| 819 |
-
"adjacent_hexes": [
|
| 820 |
-
17
|
| 821 |
-
]
|
| 822 |
-
},
|
| 823 |
-
{
|
| 824 |
-
"point_id": 49,
|
| 825 |
-
"adjacent_points": [
|
| 826 |
-
48,
|
| 827 |
-
50
|
| 828 |
-
],
|
| 829 |
-
"adjacent_hexes": [
|
| 830 |
-
17
|
| 831 |
-
]
|
| 832 |
-
},
|
| 833 |
-
{
|
| 834 |
-
"point_id": 50,
|
| 835 |
-
"adjacent_points": [
|
| 836 |
-
49,
|
| 837 |
-
51,
|
| 838 |
-
42
|
| 839 |
-
],
|
| 840 |
-
"adjacent_hexes": [
|
| 841 |
-
18,
|
| 842 |
-
17
|
| 843 |
-
]
|
| 844 |
-
},
|
| 845 |
-
{
|
| 846 |
-
"point_id": 51,
|
| 847 |
-
"adjacent_points": [
|
| 848 |
-
50,
|
| 849 |
-
52
|
| 850 |
-
],
|
| 851 |
-
"adjacent_hexes": [
|
| 852 |
-
18
|
| 853 |
-
]
|
| 854 |
-
},
|
| 855 |
-
{
|
| 856 |
-
"point_id": 52,
|
| 857 |
-
"adjacent_points": [
|
| 858 |
-
51,
|
| 859 |
-
53,
|
| 860 |
-
44
|
| 861 |
-
],
|
| 862 |
-
"adjacent_hexes": [
|
| 863 |
-
19,
|
| 864 |
-
18
|
| 865 |
-
]
|
| 866 |
-
},
|
| 867 |
-
{
|
| 868 |
-
"point_id": 53,
|
| 869 |
-
"adjacent_points": [
|
| 870 |
-
52,
|
| 871 |
-
54
|
| 872 |
-
],
|
| 873 |
-
"adjacent_hexes": [
|
| 874 |
-
19
|
| 875 |
-
]
|
| 876 |
-
},
|
| 877 |
-
{
|
| 878 |
-
"point_id": 54,
|
| 879 |
-
"adjacent_points": [
|
| 880 |
-
53,
|
| 881 |
-
46
|
| 882 |
-
],
|
| 883 |
-
"adjacent_hexes": [
|
| 884 |
-
19
|
| 885 |
-
]
|
| 886 |
-
}
|
| 887 |
-
]
|
| 888 |
-
},
|
| 889 |
-
{
|
| 890 |
-
"hexes": [
|
| 891 |
-
{
|
| 892 |
-
"id": 1,
|
| 893 |
-
"type": "wood",
|
| 894 |
-
"number": 12,
|
| 895 |
-
"has_robber": false
|
| 896 |
-
},
|
| 897 |
-
{
|
| 898 |
-
"id": 2,
|
| 899 |
-
"type": "sheep",
|
| 900 |
-
"number": 5,
|
| 901 |
-
"has_robber": false
|
| 902 |
-
},
|
| 903 |
-
{
|
| 904 |
-
"id": 3,
|
| 905 |
-
"type": "wood",
|
| 906 |
-
"number": 4,
|
| 907 |
-
"has_robber": false
|
| 908 |
-
},
|
| 909 |
-
{
|
| 910 |
-
"id": 4,
|
| 911 |
-
"type": "sheep",
|
| 912 |
-
"number": 8,
|
| 913 |
-
"has_robber": false
|
| 914 |
-
},
|
| 915 |
-
{
|
| 916 |
-
"id": 5,
|
| 917 |
-
"type": "brick",
|
| 918 |
-
"number": 6,
|
| 919 |
-
"has_robber": false
|
| 920 |
-
},
|
| 921 |
-
{
|
| 922 |
-
"id": 6,
|
| 923 |
-
"type": "wood",
|
| 924 |
-
"number": 3,
|
| 925 |
-
"has_robber": false
|
| 926 |
-
},
|
| 927 |
-
{
|
| 928 |
-
"id": 7,
|
| 929 |
-
"type": "wheat",
|
| 930 |
-
"number": 8,
|
| 931 |
-
"has_robber": false
|
| 932 |
-
},
|
| 933 |
-
{
|
| 934 |
-
"id": 8,
|
| 935 |
-
"type": "brick",
|
| 936 |
-
"number": 10,
|
| 937 |
-
"has_robber": false
|
| 938 |
-
},
|
| 939 |
-
{
|
| 940 |
-
"id": 9,
|
| 941 |
-
"type": "wood",
|
| 942 |
-
"number": 11,
|
| 943 |
-
"has_robber": false
|
| 944 |
-
},
|
| 945 |
-
{
|
| 946 |
-
"id": 10,
|
| 947 |
-
"type": "desert",
|
| 948 |
-
"number": null,
|
| 949 |
-
"has_robber": true
|
| 950 |
-
},
|
| 951 |
-
{
|
| 952 |
-
"id": 11,
|
| 953 |
-
"type": "ore",
|
| 954 |
-
"number": 3,
|
| 955 |
-
"has_robber": false
|
| 956 |
-
},
|
| 957 |
-
{
|
| 958 |
-
"id": 12,
|
| 959 |
-
"type": "sheep",
|
| 960 |
-
"number": 4,
|
| 961 |
-
"has_robber": false
|
| 962 |
-
},
|
| 963 |
-
{
|
| 964 |
-
"id": 13,
|
| 965 |
-
"type": "brick",
|
| 966 |
-
"number": 10,
|
| 967 |
-
"has_robber": false
|
| 968 |
-
},
|
| 969 |
-
{
|
| 970 |
-
"id": 14,
|
| 971 |
-
"type": "wheat",
|
| 972 |
-
"number": 9,
|
| 973 |
-
"has_robber": false
|
| 974 |
-
},
|
| 975 |
-
{
|
| 976 |
-
"id": 15,
|
| 977 |
-
"type": "wheat",
|
| 978 |
-
"number": 6,
|
| 979 |
-
"has_robber": false
|
| 980 |
-
},
|
| 981 |
-
{
|
| 982 |
-
"id": 16,
|
| 983 |
-
"type": "sheep",
|
| 984 |
-
"number": 11,
|
| 985 |
-
"has_robber": false
|
| 986 |
-
},
|
| 987 |
-
{
|
| 988 |
-
"id": 17,
|
| 989 |
-
"type": "ore",
|
| 990 |
-
"number": 5,
|
| 991 |
-
"has_robber": false
|
| 992 |
-
},
|
| 993 |
-
{
|
| 994 |
-
"id": 18,
|
| 995 |
-
"type": "wheat",
|
| 996 |
-
"number": 9,
|
| 997 |
-
"has_robber": false
|
| 998 |
-
},
|
| 999 |
-
{
|
| 1000 |
-
"id": 19,
|
| 1001 |
-
"type": "ore",
|
| 1002 |
-
"number": 2,
|
| 1003 |
-
"has_robber": false
|
| 1004 |
-
}
|
| 1005 |
-
],
|
| 1006 |
-
"settlements": [],
|
| 1007 |
-
"cities": [],
|
| 1008 |
-
"roads": [],
|
| 1009 |
-
"harbors": [
|
| 1010 |
-
{
|
| 1011 |
-
"id": 1,
|
| 1012 |
-
"type": "any",
|
| 1013 |
-
"ratio": 3,
|
| 1014 |
-
"point_one": 9,
|
| 1015 |
-
"point_two": 8
|
| 1016 |
-
},
|
| 1017 |
-
{
|
| 1018 |
-
"id": 2,
|
| 1019 |
-
"type": "sheep",
|
| 1020 |
-
"ratio": 2,
|
| 1021 |
-
"point_one": 17,
|
| 1022 |
-
"point_two": 28
|
| 1023 |
-
},
|
| 1024 |
-
{
|
| 1025 |
-
"id": 3,
|
| 1026 |
-
"type": "wood",
|
| 1027 |
-
"ratio": 2,
|
| 1028 |
-
"point_one": 40,
|
| 1029 |
-
"point_two": 48
|
| 1030 |
-
},
|
| 1031 |
-
{
|
| 1032 |
-
"id": 4,
|
| 1033 |
-
"type": "any",
|
| 1034 |
-
"ratio": 3,
|
| 1035 |
-
"point_one": 50,
|
| 1036 |
-
"point_two": 51
|
| 1037 |
-
},
|
| 1038 |
-
{
|
| 1039 |
-
"id": 5,
|
| 1040 |
-
"type": "any",
|
| 1041 |
-
"ratio": 3,
|
| 1042 |
-
"point_one": 53,
|
| 1043 |
-
"point_two": 54
|
| 1044 |
-
},
|
| 1045 |
-
{
|
| 1046 |
-
"id": 6,
|
| 1047 |
-
"type": "any",
|
| 1048 |
-
"ratio": 3,
|
| 1049 |
-
"point_one": 37,
|
| 1050 |
-
"point_two": 38
|
| 1051 |
-
},
|
| 1052 |
-
{
|
| 1053 |
-
"id": 7,
|
| 1054 |
-
"type": "ore",
|
| 1055 |
-
"ratio": 2,
|
| 1056 |
-
"point_one": 26,
|
| 1057 |
-
"point_two": 16
|
| 1058 |
-
},
|
| 1059 |
-
{
|
| 1060 |
-
"id": 8,
|
| 1061 |
-
"type": "brick",
|
| 1062 |
-
"ratio": 2,
|
| 1063 |
-
"point_one": 7,
|
| 1064 |
-
"point_two": 6
|
| 1065 |
-
},
|
| 1066 |
-
{
|
| 1067 |
-
"id": 9,
|
| 1068 |
-
"type": "wheat",
|
| 1069 |
-
"ratio": 2,
|
| 1070 |
-
"point_one": 3,
|
| 1071 |
-
"point_two": 2
|
| 1072 |
-
}
|
| 1073 |
-
],
|
| 1074 |
-
"players": [
|
| 1075 |
-
{
|
| 1076 |
-
"id": 0,
|
| 1077 |
-
"name": "a",
|
| 1078 |
-
"victory_points": 0,
|
| 1079 |
-
"total_cards": 0,
|
| 1080 |
-
"cards_list": [],
|
| 1081 |
-
"dev_cards_list": [],
|
| 1082 |
-
"settlements": 0,
|
| 1083 |
-
"cities": 0,
|
| 1084 |
-
"roads": 0,
|
| 1085 |
-
"longest_road": 0,
|
| 1086 |
-
"has_longest_road": false,
|
| 1087 |
-
"knights": 0,
|
| 1088 |
-
"knights_played": 0,
|
| 1089 |
-
"has_largest_army": false
|
| 1090 |
-
},
|
| 1091 |
-
{
|
| 1092 |
-
"id": 1,
|
| 1093 |
-
"name": "b",
|
| 1094 |
-
"victory_points": 0,
|
| 1095 |
-
"total_cards": 0,
|
| 1096 |
-
"cards_list": [],
|
| 1097 |
-
"dev_cards_list": [],
|
| 1098 |
-
"settlements": 0,
|
| 1099 |
-
"cities": 0,
|
| 1100 |
-
"roads": 0,
|
| 1101 |
-
"longest_road": 0,
|
| 1102 |
-
"has_longest_road": false,
|
| 1103 |
-
"knights": 0,
|
| 1104 |
-
"knights_played": 0,
|
| 1105 |
-
"has_largest_army": false
|
| 1106 |
-
},
|
| 1107 |
-
{
|
| 1108 |
-
"id": 2,
|
| 1109 |
-
"name": "c",
|
| 1110 |
-
"victory_points": 0,
|
| 1111 |
-
"total_cards": 0,
|
| 1112 |
-
"cards_list": [],
|
| 1113 |
-
"dev_cards_list": [],
|
| 1114 |
-
"settlements": 0,
|
| 1115 |
-
"cities": 0,
|
| 1116 |
-
"roads": 0,
|
| 1117 |
-
"longest_road": 0,
|
| 1118 |
-
"has_longest_road": false,
|
| 1119 |
-
"knights": 0,
|
| 1120 |
-
"knights_played": 0,
|
| 1121 |
-
"has_largest_army": false
|
| 1122 |
-
}
|
| 1123 |
-
],
|
| 1124 |
-
"current_player": 0,
|
| 1125 |
-
"current_phase": "SETUP_FIRST_ROUND",
|
| 1126 |
-
"robber_position": [
|
| 1127 |
-
2,
|
| 1128 |
-
2
|
| 1129 |
-
],
|
| 1130 |
-
"dice_result": null,
|
| 1131 |
-
"allowed_actions": [
|
| 1132 |
-
"PLACE_STARTING_SETTLEMENT"
|
| 1133 |
-
],
|
| 1134 |
-
"points": [
|
| 1135 |
-
{
|
| 1136 |
-
"point_id": 1,
|
| 1137 |
-
"adjacent_points": [
|
| 1138 |
-
2,
|
| 1139 |
-
9
|
| 1140 |
-
],
|
| 1141 |
-
"adjacent_hexes": [
|
| 1142 |
-
1
|
| 1143 |
-
]
|
| 1144 |
-
},
|
| 1145 |
-
{
|
| 1146 |
-
"point_id": 2,
|
| 1147 |
-
"adjacent_points": [
|
| 1148 |
-
1,
|
| 1149 |
-
3
|
| 1150 |
-
],
|
| 1151 |
-
"adjacent_hexes": [
|
| 1152 |
-
1
|
| 1153 |
-
]
|
| 1154 |
-
},
|
| 1155 |
-
{
|
| 1156 |
-
"point_id": 3,
|
| 1157 |
-
"adjacent_points": [
|
| 1158 |
-
2,
|
| 1159 |
-
4,
|
| 1160 |
-
11
|
| 1161 |
-
],
|
| 1162 |
-
"adjacent_hexes": [
|
| 1163 |
-
2,
|
| 1164 |
-
1
|
| 1165 |
-
]
|
| 1166 |
-
},
|
| 1167 |
-
{
|
| 1168 |
-
"point_id": 4,
|
| 1169 |
-
"adjacent_points": [
|
| 1170 |
-
3,
|
| 1171 |
-
5
|
| 1172 |
-
],
|
| 1173 |
-
"adjacent_hexes": [
|
| 1174 |
-
2
|
| 1175 |
-
]
|
| 1176 |
-
},
|
| 1177 |
-
{
|
| 1178 |
-
"point_id": 5,
|
| 1179 |
-
"adjacent_points": [
|
| 1180 |
-
4,
|
| 1181 |
-
6,
|
| 1182 |
-
13
|
| 1183 |
-
],
|
| 1184 |
-
"adjacent_hexes": [
|
| 1185 |
-
3,
|
| 1186 |
-
2
|
| 1187 |
-
]
|
| 1188 |
-
},
|
| 1189 |
-
{
|
| 1190 |
-
"point_id": 6,
|
| 1191 |
-
"adjacent_points": [
|
| 1192 |
-
5,
|
| 1193 |
-
7
|
| 1194 |
-
],
|
| 1195 |
-
"adjacent_hexes": [
|
| 1196 |
-
3
|
| 1197 |
-
]
|
| 1198 |
-
},
|
| 1199 |
-
{
|
| 1200 |
-
"point_id": 7,
|
| 1201 |
-
"adjacent_points": [
|
| 1202 |
-
6,
|
| 1203 |
-
15
|
| 1204 |
-
],
|
| 1205 |
-
"adjacent_hexes": [
|
| 1206 |
-
3
|
| 1207 |
-
]
|
| 1208 |
-
},
|
| 1209 |
-
{
|
| 1210 |
-
"point_id": 8,
|
| 1211 |
-
"adjacent_points": [
|
| 1212 |
-
9,
|
| 1213 |
-
18
|
| 1214 |
-
],
|
| 1215 |
-
"adjacent_hexes": [
|
| 1216 |
-
4
|
| 1217 |
-
]
|
| 1218 |
-
},
|
| 1219 |
-
{
|
| 1220 |
-
"point_id": 9,
|
| 1221 |
-
"adjacent_points": [
|
| 1222 |
-
8,
|
| 1223 |
-
10,
|
| 1224 |
-
1
|
| 1225 |
-
],
|
| 1226 |
-
"adjacent_hexes": [
|
| 1227 |
-
4,
|
| 1228 |
-
1
|
| 1229 |
-
]
|
| 1230 |
-
},
|
| 1231 |
-
{
|
| 1232 |
-
"point_id": 10,
|
| 1233 |
-
"adjacent_points": [
|
| 1234 |
-
9,
|
| 1235 |
-
11,
|
| 1236 |
-
20
|
| 1237 |
-
],
|
| 1238 |
-
"adjacent_hexes": [
|
| 1239 |
-
5,
|
| 1240 |
-
4,
|
| 1241 |
-
1
|
| 1242 |
-
]
|
| 1243 |
-
},
|
| 1244 |
-
{
|
| 1245 |
-
"point_id": 11,
|
| 1246 |
-
"adjacent_points": [
|
| 1247 |
-
10,
|
| 1248 |
-
12,
|
| 1249 |
-
3
|
| 1250 |
-
],
|
| 1251 |
-
"adjacent_hexes": [
|
| 1252 |
-
5,
|
| 1253 |
-
2,
|
| 1254 |
-
1
|
| 1255 |
-
]
|
| 1256 |
-
},
|
| 1257 |
-
{
|
| 1258 |
-
"point_id": 12,
|
| 1259 |
-
"adjacent_points": [
|
| 1260 |
-
11,
|
| 1261 |
-
13,
|
| 1262 |
-
22
|
| 1263 |
-
],
|
| 1264 |
-
"adjacent_hexes": [
|
| 1265 |
-
6,
|
| 1266 |
-
5,
|
| 1267 |
-
2
|
| 1268 |
-
]
|
| 1269 |
-
},
|
| 1270 |
-
{
|
| 1271 |
-
"point_id": 13,
|
| 1272 |
-
"adjacent_points": [
|
| 1273 |
-
12,
|
| 1274 |
-
14,
|
| 1275 |
-
5
|
| 1276 |
-
],
|
| 1277 |
-
"adjacent_hexes": [
|
| 1278 |
-
6,
|
| 1279 |
-
3,
|
| 1280 |
-
2
|
| 1281 |
-
]
|
| 1282 |
-
},
|
| 1283 |
-
{
|
| 1284 |
-
"point_id": 14,
|
| 1285 |
-
"adjacent_points": [
|
| 1286 |
-
13,
|
| 1287 |
-
15,
|
| 1288 |
-
24
|
| 1289 |
-
],
|
| 1290 |
-
"adjacent_hexes": [
|
| 1291 |
-
7,
|
| 1292 |
-
6,
|
| 1293 |
-
3
|
| 1294 |
-
]
|
| 1295 |
-
},
|
| 1296 |
-
{
|
| 1297 |
-
"point_id": 15,
|
| 1298 |
-
"adjacent_points": [
|
| 1299 |
-
14,
|
| 1300 |
-
16,
|
| 1301 |
-
7
|
| 1302 |
-
],
|
| 1303 |
-
"adjacent_hexes": [
|
| 1304 |
-
7,
|
| 1305 |
-
3
|
| 1306 |
-
]
|
| 1307 |
-
},
|
| 1308 |
-
{
|
| 1309 |
-
"point_id": 16,
|
| 1310 |
-
"adjacent_points": [
|
| 1311 |
-
15,
|
| 1312 |
-
26
|
| 1313 |
-
],
|
| 1314 |
-
"adjacent_hexes": [
|
| 1315 |
-
7
|
| 1316 |
-
]
|
| 1317 |
-
},
|
| 1318 |
-
{
|
| 1319 |
-
"point_id": 17,
|
| 1320 |
-
"adjacent_points": [
|
| 1321 |
-
18,
|
| 1322 |
-
28
|
| 1323 |
-
],
|
| 1324 |
-
"adjacent_hexes": [
|
| 1325 |
-
8
|
| 1326 |
-
]
|
| 1327 |
-
},
|
| 1328 |
-
{
|
| 1329 |
-
"point_id": 18,
|
| 1330 |
-
"adjacent_points": [
|
| 1331 |
-
17,
|
| 1332 |
-
19,
|
| 1333 |
-
8
|
| 1334 |
-
],
|
| 1335 |
-
"adjacent_hexes": [
|
| 1336 |
-
8,
|
| 1337 |
-
4
|
| 1338 |
-
]
|
| 1339 |
-
},
|
| 1340 |
-
{
|
| 1341 |
-
"point_id": 19,
|
| 1342 |
-
"adjacent_points": [
|
| 1343 |
-
18,
|
| 1344 |
-
20,
|
| 1345 |
-
30
|
| 1346 |
-
],
|
| 1347 |
-
"adjacent_hexes": [
|
| 1348 |
-
9,
|
| 1349 |
-
8,
|
| 1350 |
-
4
|
| 1351 |
-
]
|
| 1352 |
-
},
|
| 1353 |
-
{
|
| 1354 |
-
"point_id": 20,
|
| 1355 |
-
"adjacent_points": [
|
| 1356 |
-
19,
|
| 1357 |
-
21,
|
| 1358 |
-
10
|
| 1359 |
-
],
|
| 1360 |
-
"adjacent_hexes": [
|
| 1361 |
-
9,
|
| 1362 |
-
5,
|
| 1363 |
-
4
|
| 1364 |
-
]
|
| 1365 |
-
},
|
| 1366 |
-
{
|
| 1367 |
-
"point_id": 21,
|
| 1368 |
-
"adjacent_points": [
|
| 1369 |
-
20,
|
| 1370 |
-
22,
|
| 1371 |
-
32
|
| 1372 |
-
],
|
| 1373 |
-
"adjacent_hexes": [
|
| 1374 |
-
10,
|
| 1375 |
-
9,
|
| 1376 |
-
5
|
| 1377 |
-
]
|
| 1378 |
-
},
|
| 1379 |
-
{
|
| 1380 |
-
"point_id": 22,
|
| 1381 |
-
"adjacent_points": [
|
| 1382 |
-
21,
|
| 1383 |
-
23,
|
| 1384 |
-
12
|
| 1385 |
-
],
|
| 1386 |
-
"adjacent_hexes": [
|
| 1387 |
-
10,
|
| 1388 |
-
6,
|
| 1389 |
-
5
|
| 1390 |
-
]
|
| 1391 |
-
},
|
| 1392 |
-
{
|
| 1393 |
-
"point_id": 23,
|
| 1394 |
-
"adjacent_points": [
|
| 1395 |
-
22,
|
| 1396 |
-
24,
|
| 1397 |
-
34
|
| 1398 |
-
],
|
| 1399 |
-
"adjacent_hexes": [
|
| 1400 |
-
11,
|
| 1401 |
-
10,
|
| 1402 |
-
6
|
| 1403 |
-
]
|
| 1404 |
-
},
|
| 1405 |
-
{
|
| 1406 |
-
"point_id": 24,
|
| 1407 |
-
"adjacent_points": [
|
| 1408 |
-
23,
|
| 1409 |
-
25,
|
| 1410 |
-
14
|
| 1411 |
-
],
|
| 1412 |
-
"adjacent_hexes": [
|
| 1413 |
-
11,
|
| 1414 |
-
7,
|
| 1415 |
-
6
|
| 1416 |
-
]
|
| 1417 |
-
},
|
| 1418 |
-
{
|
| 1419 |
-
"point_id": 25,
|
| 1420 |
-
"adjacent_points": [
|
| 1421 |
-
24,
|
| 1422 |
-
26,
|
| 1423 |
-
36
|
| 1424 |
-
],
|
| 1425 |
-
"adjacent_hexes": [
|
| 1426 |
-
12,
|
| 1427 |
-
11,
|
| 1428 |
-
7
|
| 1429 |
-
]
|
| 1430 |
-
},
|
| 1431 |
-
{
|
| 1432 |
-
"point_id": 26,
|
| 1433 |
-
"adjacent_points": [
|
| 1434 |
-
25,
|
| 1435 |
-
27,
|
| 1436 |
-
16
|
| 1437 |
-
],
|
| 1438 |
-
"adjacent_hexes": [
|
| 1439 |
-
12,
|
| 1440 |
-
7
|
| 1441 |
-
]
|
| 1442 |
-
},
|
| 1443 |
-
{
|
| 1444 |
-
"point_id": 27,
|
| 1445 |
-
"adjacent_points": [
|
| 1446 |
-
26,
|
| 1447 |
-
38
|
| 1448 |
-
],
|
| 1449 |
-
"adjacent_hexes": [
|
| 1450 |
-
12
|
| 1451 |
-
]
|
| 1452 |
-
},
|
| 1453 |
-
{
|
| 1454 |
-
"point_id": 28,
|
| 1455 |
-
"adjacent_points": [
|
| 1456 |
-
29,
|
| 1457 |
-
17
|
| 1458 |
-
],
|
| 1459 |
-
"adjacent_hexes": [
|
| 1460 |
-
8
|
| 1461 |
-
]
|
| 1462 |
-
},
|
| 1463 |
-
{
|
| 1464 |
-
"point_id": 29,
|
| 1465 |
-
"adjacent_points": [
|
| 1466 |
-
28,
|
| 1467 |
-
30,
|
| 1468 |
-
39
|
| 1469 |
-
],
|
| 1470 |
-
"adjacent_hexes": [
|
| 1471 |
-
13,
|
| 1472 |
-
8
|
| 1473 |
-
]
|
| 1474 |
-
},
|
| 1475 |
-
{
|
| 1476 |
-
"point_id": 30,
|
| 1477 |
-
"adjacent_points": [
|
| 1478 |
-
29,
|
| 1479 |
-
31,
|
| 1480 |
-
19
|
| 1481 |
-
],
|
| 1482 |
-
"adjacent_hexes": [
|
| 1483 |
-
13,
|
| 1484 |
-
9,
|
| 1485 |
-
8
|
| 1486 |
-
]
|
| 1487 |
-
},
|
| 1488 |
-
{
|
| 1489 |
-
"point_id": 31,
|
| 1490 |
-
"adjacent_points": [
|
| 1491 |
-
30,
|
| 1492 |
-
32,
|
| 1493 |
-
41
|
| 1494 |
-
],
|
| 1495 |
-
"adjacent_hexes": [
|
| 1496 |
-
14,
|
| 1497 |
-
13,
|
| 1498 |
-
9
|
| 1499 |
-
]
|
| 1500 |
-
},
|
| 1501 |
-
{
|
| 1502 |
-
"point_id": 32,
|
| 1503 |
-
"adjacent_points": [
|
| 1504 |
-
31,
|
| 1505 |
-
33,
|
| 1506 |
-
21
|
| 1507 |
-
],
|
| 1508 |
-
"adjacent_hexes": [
|
| 1509 |
-
14,
|
| 1510 |
-
10,
|
| 1511 |
-
9
|
| 1512 |
-
]
|
| 1513 |
-
},
|
| 1514 |
-
{
|
| 1515 |
-
"point_id": 33,
|
| 1516 |
-
"adjacent_points": [
|
| 1517 |
-
32,
|
| 1518 |
-
34,
|
| 1519 |
-
43
|
| 1520 |
-
],
|
| 1521 |
-
"adjacent_hexes": [
|
| 1522 |
-
15,
|
| 1523 |
-
14,
|
| 1524 |
-
10
|
| 1525 |
-
]
|
| 1526 |
-
},
|
| 1527 |
-
{
|
| 1528 |
-
"point_id": 34,
|
| 1529 |
-
"adjacent_points": [
|
| 1530 |
-
33,
|
| 1531 |
-
35,
|
| 1532 |
-
23
|
| 1533 |
-
],
|
| 1534 |
-
"adjacent_hexes": [
|
| 1535 |
-
15,
|
| 1536 |
-
11,
|
| 1537 |
-
10
|
| 1538 |
-
]
|
| 1539 |
-
},
|
| 1540 |
-
{
|
| 1541 |
-
"point_id": 35,
|
| 1542 |
-
"adjacent_points": [
|
| 1543 |
-
34,
|
| 1544 |
-
36,
|
| 1545 |
-
45
|
| 1546 |
-
],
|
| 1547 |
-
"adjacent_hexes": [
|
| 1548 |
-
16,
|
| 1549 |
-
15,
|
| 1550 |
-
11
|
| 1551 |
-
]
|
| 1552 |
-
},
|
| 1553 |
-
{
|
| 1554 |
-
"point_id": 36,
|
| 1555 |
-
"adjacent_points": [
|
| 1556 |
-
35,
|
| 1557 |
-
37,
|
| 1558 |
-
25
|
| 1559 |
-
],
|
| 1560 |
-
"adjacent_hexes": [
|
| 1561 |
-
16,
|
| 1562 |
-
12,
|
| 1563 |
-
11
|
| 1564 |
-
]
|
| 1565 |
-
},
|
| 1566 |
-
{
|
| 1567 |
-
"point_id": 37,
|
| 1568 |
-
"adjacent_points": [
|
| 1569 |
-
36,
|
| 1570 |
-
38,
|
| 1571 |
-
47
|
| 1572 |
-
],
|
| 1573 |
-
"adjacent_hexes": [
|
| 1574 |
-
16,
|
| 1575 |
-
12
|
| 1576 |
-
]
|
| 1577 |
-
},
|
| 1578 |
-
{
|
| 1579 |
-
"point_id": 38,
|
| 1580 |
-
"adjacent_points": [
|
| 1581 |
-
37,
|
| 1582 |
-
27
|
| 1583 |
-
],
|
| 1584 |
-
"adjacent_hexes": [
|
| 1585 |
-
12
|
| 1586 |
-
]
|
| 1587 |
-
},
|
| 1588 |
-
{
|
| 1589 |
-
"point_id": 39,
|
| 1590 |
-
"adjacent_points": [
|
| 1591 |
-
40,
|
| 1592 |
-
29
|
| 1593 |
-
],
|
| 1594 |
-
"adjacent_hexes": [
|
| 1595 |
-
13
|
| 1596 |
-
]
|
| 1597 |
-
},
|
| 1598 |
-
{
|
| 1599 |
-
"point_id": 40,
|
| 1600 |
-
"adjacent_points": [
|
| 1601 |
-
39,
|
| 1602 |
-
41,
|
| 1603 |
-
48
|
| 1604 |
-
],
|
| 1605 |
-
"adjacent_hexes": [
|
| 1606 |
-
17,
|
| 1607 |
-
13
|
| 1608 |
-
]
|
| 1609 |
-
},
|
| 1610 |
-
{
|
| 1611 |
-
"point_id": 41,
|
| 1612 |
-
"adjacent_points": [
|
| 1613 |
-
40,
|
| 1614 |
-
42,
|
| 1615 |
-
31
|
| 1616 |
-
],
|
| 1617 |
-
"adjacent_hexes": [
|
| 1618 |
-
17,
|
| 1619 |
-
14,
|
| 1620 |
-
13
|
| 1621 |
-
]
|
| 1622 |
-
},
|
| 1623 |
-
{
|
| 1624 |
-
"point_id": 42,
|
| 1625 |
-
"adjacent_points": [
|
| 1626 |
-
41,
|
| 1627 |
-
43,
|
| 1628 |
-
50
|
| 1629 |
-
],
|
| 1630 |
-
"adjacent_hexes": [
|
| 1631 |
-
18,
|
| 1632 |
-
17,
|
| 1633 |
-
14
|
| 1634 |
-
]
|
| 1635 |
-
},
|
| 1636 |
-
{
|
| 1637 |
-
"point_id": 43,
|
| 1638 |
-
"adjacent_points": [
|
| 1639 |
-
42,
|
| 1640 |
-
44,
|
| 1641 |
-
33
|
| 1642 |
-
],
|
| 1643 |
-
"adjacent_hexes": [
|
| 1644 |
-
18,
|
| 1645 |
-
15,
|
| 1646 |
-
14
|
| 1647 |
-
]
|
| 1648 |
-
},
|
| 1649 |
-
{
|
| 1650 |
-
"point_id": 44,
|
| 1651 |
-
"adjacent_points": [
|
| 1652 |
-
43,
|
| 1653 |
-
45,
|
| 1654 |
-
52
|
| 1655 |
-
],
|
| 1656 |
-
"adjacent_hexes": [
|
| 1657 |
-
19,
|
| 1658 |
-
18,
|
| 1659 |
-
15
|
| 1660 |
-
]
|
| 1661 |
-
},
|
| 1662 |
-
{
|
| 1663 |
-
"point_id": 45,
|
| 1664 |
-
"adjacent_points": [
|
| 1665 |
-
44,
|
| 1666 |
-
46,
|
| 1667 |
-
35
|
| 1668 |
-
],
|
| 1669 |
-
"adjacent_hexes": [
|
| 1670 |
-
19,
|
| 1671 |
-
16,
|
| 1672 |
-
15
|
| 1673 |
-
]
|
| 1674 |
-
},
|
| 1675 |
-
{
|
| 1676 |
-
"point_id": 46,
|
| 1677 |
-
"adjacent_points": [
|
| 1678 |
-
45,
|
| 1679 |
-
47,
|
| 1680 |
-
54
|
| 1681 |
-
],
|
| 1682 |
-
"adjacent_hexes": [
|
| 1683 |
-
19,
|
| 1684 |
-
16
|
| 1685 |
-
]
|
| 1686 |
-
},
|
| 1687 |
-
{
|
| 1688 |
-
"point_id": 47,
|
| 1689 |
-
"adjacent_points": [
|
| 1690 |
-
46,
|
| 1691 |
-
37
|
| 1692 |
-
],
|
| 1693 |
-
"adjacent_hexes": [
|
| 1694 |
-
16
|
| 1695 |
-
]
|
| 1696 |
-
},
|
| 1697 |
-
{
|
| 1698 |
-
"point_id": 48,
|
| 1699 |
-
"adjacent_points": [
|
| 1700 |
-
49,
|
| 1701 |
-
40
|
| 1702 |
-
],
|
| 1703 |
-
"adjacent_hexes": [
|
| 1704 |
-
17
|
| 1705 |
-
]
|
| 1706 |
-
},
|
| 1707 |
-
{
|
| 1708 |
-
"point_id": 49,
|
| 1709 |
-
"adjacent_points": [
|
| 1710 |
-
48,
|
| 1711 |
-
50
|
| 1712 |
-
],
|
| 1713 |
-
"adjacent_hexes": [
|
| 1714 |
-
17
|
| 1715 |
-
]
|
| 1716 |
-
},
|
| 1717 |
-
{
|
| 1718 |
-
"point_id": 50,
|
| 1719 |
-
"adjacent_points": [
|
| 1720 |
-
49,
|
| 1721 |
-
51,
|
| 1722 |
-
42
|
| 1723 |
-
],
|
| 1724 |
-
"adjacent_hexes": [
|
| 1725 |
-
18,
|
| 1726 |
-
17
|
| 1727 |
-
]
|
| 1728 |
-
},
|
| 1729 |
-
{
|
| 1730 |
-
"point_id": 51,
|
| 1731 |
-
"adjacent_points": [
|
| 1732 |
-
50,
|
| 1733 |
-
52
|
| 1734 |
-
],
|
| 1735 |
-
"adjacent_hexes": [
|
| 1736 |
-
18
|
| 1737 |
-
]
|
| 1738 |
-
},
|
| 1739 |
-
{
|
| 1740 |
-
"point_id": 52,
|
| 1741 |
-
"adjacent_points": [
|
| 1742 |
-
51,
|
| 1743 |
-
53,
|
| 1744 |
-
44
|
| 1745 |
-
],
|
| 1746 |
-
"adjacent_hexes": [
|
| 1747 |
-
19,
|
| 1748 |
-
18
|
| 1749 |
-
]
|
| 1750 |
-
},
|
| 1751 |
-
{
|
| 1752 |
-
"point_id": 53,
|
| 1753 |
-
"adjacent_points": [
|
| 1754 |
-
52,
|
| 1755 |
-
54
|
| 1756 |
-
],
|
| 1757 |
-
"adjacent_hexes": [
|
| 1758 |
-
19
|
| 1759 |
-
]
|
| 1760 |
-
},
|
| 1761 |
-
{
|
| 1762 |
-
"point_id": 54,
|
| 1763 |
-
"adjacent_points": [
|
| 1764 |
-
53,
|
| 1765 |
-
46
|
| 1766 |
-
],
|
| 1767 |
-
"adjacent_hexes": [
|
| 1768 |
-
19
|
| 1769 |
-
]
|
| 1770 |
-
}
|
| 1771 |
-
]
|
| 1772 |
-
},
|
| 1773 |
-
{
|
| 1774 |
-
"hexes": [
|
| 1775 |
-
{
|
| 1776 |
-
"id": 1,
|
| 1777 |
-
"type": "wood",
|
| 1778 |
-
"number": 12,
|
| 1779 |
-
"has_robber": false
|
| 1780 |
-
},
|
| 1781 |
-
{
|
| 1782 |
-
"id": 2,
|
| 1783 |
-
"type": "sheep",
|
| 1784 |
-
"number": 5,
|
| 1785 |
-
"has_robber": false
|
| 1786 |
-
},
|
| 1787 |
-
{
|
| 1788 |
-
"id": 3,
|
| 1789 |
-
"type": "wood",
|
| 1790 |
-
"number": 4,
|
| 1791 |
-
"has_robber": false
|
| 1792 |
-
},
|
| 1793 |
-
{
|
| 1794 |
-
"id": 4,
|
| 1795 |
-
"type": "sheep",
|
| 1796 |
-
"number": 8,
|
| 1797 |
-
"has_robber": false
|
| 1798 |
-
},
|
| 1799 |
-
{
|
| 1800 |
-
"id": 5,
|
| 1801 |
-
"type": "brick",
|
| 1802 |
-
"number": 6,
|
| 1803 |
-
"has_robber": false
|
| 1804 |
-
},
|
| 1805 |
-
{
|
| 1806 |
-
"id": 6,
|
| 1807 |
-
"type": "wood",
|
| 1808 |
-
"number": 3,
|
| 1809 |
-
"has_robber": false
|
| 1810 |
-
},
|
| 1811 |
-
{
|
| 1812 |
-
"id": 7,
|
| 1813 |
-
"type": "wheat",
|
| 1814 |
-
"number": 8,
|
| 1815 |
-
"has_robber": false
|
| 1816 |
-
},
|
| 1817 |
-
{
|
| 1818 |
-
"id": 8,
|
| 1819 |
-
"type": "brick",
|
| 1820 |
-
"number": 10,
|
| 1821 |
-
"has_robber": false
|
| 1822 |
-
},
|
| 1823 |
-
{
|
| 1824 |
-
"id": 9,
|
| 1825 |
-
"type": "wood",
|
| 1826 |
-
"number": 11,
|
| 1827 |
-
"has_robber": false
|
| 1828 |
-
},
|
| 1829 |
-
{
|
| 1830 |
-
"id": 10,
|
| 1831 |
-
"type": "desert",
|
| 1832 |
-
"number": null,
|
| 1833 |
-
"has_robber": true
|
| 1834 |
-
},
|
| 1835 |
-
{
|
| 1836 |
-
"id": 11,
|
| 1837 |
-
"type": "ore",
|
| 1838 |
-
"number": 3,
|
| 1839 |
-
"has_robber": false
|
| 1840 |
-
},
|
| 1841 |
-
{
|
| 1842 |
-
"id": 12,
|
| 1843 |
-
"type": "sheep",
|
| 1844 |
-
"number": 4,
|
| 1845 |
-
"has_robber": false
|
| 1846 |
-
},
|
| 1847 |
-
{
|
| 1848 |
-
"id": 13,
|
| 1849 |
-
"type": "brick",
|
| 1850 |
-
"number": 10,
|
| 1851 |
-
"has_robber": false
|
| 1852 |
-
},
|
| 1853 |
-
{
|
| 1854 |
-
"id": 14,
|
| 1855 |
-
"type": "wheat",
|
| 1856 |
-
"number": 9,
|
| 1857 |
-
"has_robber": false
|
| 1858 |
-
},
|
| 1859 |
-
{
|
| 1860 |
-
"id": 15,
|
| 1861 |
-
"type": "wheat",
|
| 1862 |
-
"number": 6,
|
| 1863 |
-
"has_robber": false
|
| 1864 |
-
},
|
| 1865 |
-
{
|
| 1866 |
-
"id": 16,
|
| 1867 |
-
"type": "sheep",
|
| 1868 |
-
"number": 11,
|
| 1869 |
-
"has_robber": false
|
| 1870 |
-
},
|
| 1871 |
-
{
|
| 1872 |
-
"id": 17,
|
| 1873 |
-
"type": "ore",
|
| 1874 |
-
"number": 5,
|
| 1875 |
-
"has_robber": false
|
| 1876 |
-
},
|
| 1877 |
-
{
|
| 1878 |
-
"id": 18,
|
| 1879 |
-
"type": "wheat",
|
| 1880 |
-
"number": 9,
|
| 1881 |
-
"has_robber": false
|
| 1882 |
-
},
|
| 1883 |
-
{
|
| 1884 |
-
"id": 19,
|
| 1885 |
-
"type": "ore",
|
| 1886 |
-
"number": 2,
|
| 1887 |
-
"has_robber": false
|
| 1888 |
-
}
|
| 1889 |
-
],
|
| 1890 |
-
"settlements": [
|
| 1891 |
-
{
|
| 1892 |
-
"id": "b_20",
|
| 1893 |
-
"vertex": 20,
|
| 1894 |
-
"player": 1
|
| 1895 |
-
}
|
| 1896 |
-
],
|
| 1897 |
-
"cities": [],
|
| 1898 |
-
"roads": [],
|
| 1899 |
-
"harbors": [
|
| 1900 |
-
{
|
| 1901 |
-
"id": 1,
|
| 1902 |
-
"type": "any",
|
| 1903 |
-
"ratio": 3,
|
| 1904 |
-
"point_one": 9,
|
| 1905 |
-
"point_two": 8
|
| 1906 |
-
},
|
| 1907 |
-
{
|
| 1908 |
-
"id": 2,
|
| 1909 |
-
"type": "sheep",
|
| 1910 |
-
"ratio": 2,
|
| 1911 |
-
"point_one": 17,
|
| 1912 |
-
"point_two": 28
|
| 1913 |
-
},
|
| 1914 |
-
{
|
| 1915 |
-
"id": 3,
|
| 1916 |
-
"type": "wood",
|
| 1917 |
-
"ratio": 2,
|
| 1918 |
-
"point_one": 40,
|
| 1919 |
-
"point_two": 48
|
| 1920 |
-
},
|
| 1921 |
-
{
|
| 1922 |
-
"id": 4,
|
| 1923 |
-
"type": "any",
|
| 1924 |
-
"ratio": 3,
|
| 1925 |
-
"point_one": 50,
|
| 1926 |
-
"point_two": 51
|
| 1927 |
-
},
|
| 1928 |
-
{
|
| 1929 |
-
"id": 5,
|
| 1930 |
-
"type": "any",
|
| 1931 |
-
"ratio": 3,
|
| 1932 |
-
"point_one": 53,
|
| 1933 |
-
"point_two": 54
|
| 1934 |
-
},
|
| 1935 |
-
{
|
| 1936 |
-
"id": 6,
|
| 1937 |
-
"type": "any",
|
| 1938 |
-
"ratio": 3,
|
| 1939 |
-
"point_one": 37,
|
| 1940 |
-
"point_two": 38
|
| 1941 |
-
},
|
| 1942 |
-
{
|
| 1943 |
-
"id": 7,
|
| 1944 |
-
"type": "ore",
|
| 1945 |
-
"ratio": 2,
|
| 1946 |
-
"point_one": 26,
|
| 1947 |
-
"point_two": 16
|
| 1948 |
-
},
|
| 1949 |
-
{
|
| 1950 |
-
"id": 8,
|
| 1951 |
-
"type": "brick",
|
| 1952 |
-
"ratio": 2,
|
| 1953 |
-
"point_one": 7,
|
| 1954 |
-
"point_two": 6
|
| 1955 |
-
},
|
| 1956 |
-
{
|
| 1957 |
-
"id": 9,
|
| 1958 |
-
"type": "wheat",
|
| 1959 |
-
"ratio": 2,
|
| 1960 |
-
"point_one": 3,
|
| 1961 |
-
"point_two": 2
|
| 1962 |
-
}
|
| 1963 |
-
],
|
| 1964 |
-
"players": [
|
| 1965 |
-
{
|
| 1966 |
-
"id": 0,
|
| 1967 |
-
"name": "a",
|
| 1968 |
-
"victory_points": 1,
|
| 1969 |
-
"total_cards": 0,
|
| 1970 |
-
"cards_list": [],
|
| 1971 |
-
"dev_cards_list": [],
|
| 1972 |
-
"settlements": 1,
|
| 1973 |
-
"cities": 0,
|
| 1974 |
-
"roads": 0,
|
| 1975 |
-
"longest_road": 0,
|
| 1976 |
-
"has_longest_road": false,
|
| 1977 |
-
"knights": 0,
|
| 1978 |
-
"knights_played": 0,
|
| 1979 |
-
"has_largest_army": false
|
| 1980 |
-
},
|
| 1981 |
-
{
|
| 1982 |
-
"id": 1,
|
| 1983 |
-
"name": "b",
|
| 1984 |
-
"victory_points": 0,
|
| 1985 |
-
"total_cards": 0,
|
| 1986 |
-
"cards_list": [],
|
| 1987 |
-
"dev_cards_list": [],
|
| 1988 |
-
"settlements": 0,
|
| 1989 |
-
"cities": 0,
|
| 1990 |
-
"roads": 0,
|
| 1991 |
-
"longest_road": 0,
|
| 1992 |
-
"has_longest_road": false,
|
| 1993 |
-
"knights": 0,
|
| 1994 |
-
"knights_played": 0,
|
| 1995 |
-
"has_largest_army": false
|
| 1996 |
-
},
|
| 1997 |
-
{
|
| 1998 |
-
"id": 2,
|
| 1999 |
-
"name": "c",
|
| 2000 |
-
"victory_points": 0,
|
| 2001 |
-
"total_cards": 0,
|
| 2002 |
-
"cards_list": [],
|
| 2003 |
-
"dev_cards_list": [],
|
| 2004 |
-
"settlements": 0,
|
| 2005 |
-
"cities": 0,
|
| 2006 |
-
"roads": 0,
|
| 2007 |
-
"longest_road": 0,
|
| 2008 |
-
"has_longest_road": false,
|
| 2009 |
-
"knights": 0,
|
| 2010 |
-
"knights_played": 0,
|
| 2011 |
-
"has_largest_army": false
|
| 2012 |
-
}
|
| 2013 |
-
],
|
| 2014 |
-
"current_player": 0,
|
| 2015 |
-
"current_phase": "SETUP_FIRST_ROUND",
|
| 2016 |
-
"robber_position": [
|
| 2017 |
-
2,
|
| 2018 |
-
2
|
| 2019 |
-
],
|
| 2020 |
-
"dice_result": null,
|
| 2021 |
-
"allowed_actions": [
|
| 2022 |
-
"PLACE_STARTING_ROAD"
|
| 2023 |
-
],
|
| 2024 |
-
"points": [
|
| 2025 |
-
{
|
| 2026 |
-
"point_id": 1,
|
| 2027 |
-
"adjacent_points": [
|
| 2028 |
-
2,
|
| 2029 |
-
9
|
| 2030 |
-
],
|
| 2031 |
-
"adjacent_hexes": [
|
| 2032 |
-
1
|
| 2033 |
-
]
|
| 2034 |
-
},
|
| 2035 |
-
{
|
| 2036 |
-
"point_id": 2,
|
| 2037 |
-
"adjacent_points": [
|
| 2038 |
-
1,
|
| 2039 |
-
3
|
| 2040 |
-
],
|
| 2041 |
-
"adjacent_hexes": [
|
| 2042 |
-
1
|
| 2043 |
-
]
|
| 2044 |
-
},
|
| 2045 |
-
{
|
| 2046 |
-
"point_id": 3,
|
| 2047 |
-
"adjacent_points": [
|
| 2048 |
-
2,
|
| 2049 |
-
4,
|
| 2050 |
-
11
|
| 2051 |
-
],
|
| 2052 |
-
"adjacent_hexes": [
|
| 2053 |
-
2,
|
| 2054 |
-
1
|
| 2055 |
-
]
|
| 2056 |
-
},
|
| 2057 |
-
{
|
| 2058 |
-
"point_id": 4,
|
| 2059 |
-
"adjacent_points": [
|
| 2060 |
-
3,
|
| 2061 |
-
5
|
| 2062 |
-
],
|
| 2063 |
-
"adjacent_hexes": [
|
| 2064 |
-
2
|
| 2065 |
-
]
|
| 2066 |
-
},
|
| 2067 |
-
{
|
| 2068 |
-
"point_id": 5,
|
| 2069 |
-
"adjacent_points": [
|
| 2070 |
-
4,
|
| 2071 |
-
6,
|
| 2072 |
-
13
|
| 2073 |
-
],
|
| 2074 |
-
"adjacent_hexes": [
|
| 2075 |
-
3,
|
| 2076 |
-
2
|
| 2077 |
-
]
|
| 2078 |
-
},
|
| 2079 |
-
{
|
| 2080 |
-
"point_id": 6,
|
| 2081 |
-
"adjacent_points": [
|
| 2082 |
-
5,
|
| 2083 |
-
7
|
| 2084 |
-
],
|
| 2085 |
-
"adjacent_hexes": [
|
| 2086 |
-
3
|
| 2087 |
-
]
|
| 2088 |
-
},
|
| 2089 |
-
{
|
| 2090 |
-
"point_id": 7,
|
| 2091 |
-
"adjacent_points": [
|
| 2092 |
-
6,
|
| 2093 |
-
15
|
| 2094 |
-
],
|
| 2095 |
-
"adjacent_hexes": [
|
| 2096 |
-
3
|
| 2097 |
-
]
|
| 2098 |
-
},
|
| 2099 |
-
{
|
| 2100 |
-
"point_id": 8,
|
| 2101 |
-
"adjacent_points": [
|
| 2102 |
-
9,
|
| 2103 |
-
18
|
| 2104 |
-
],
|
| 2105 |
-
"adjacent_hexes": [
|
| 2106 |
-
4
|
| 2107 |
-
]
|
| 2108 |
-
},
|
| 2109 |
-
{
|
| 2110 |
-
"point_id": 9,
|
| 2111 |
-
"adjacent_points": [
|
| 2112 |
-
8,
|
| 2113 |
-
10,
|
| 2114 |
-
1
|
| 2115 |
-
],
|
| 2116 |
-
"adjacent_hexes": [
|
| 2117 |
-
4,
|
| 2118 |
-
1
|
| 2119 |
-
]
|
| 2120 |
-
},
|
| 2121 |
-
{
|
| 2122 |
-
"point_id": 10,
|
| 2123 |
-
"adjacent_points": [
|
| 2124 |
-
9,
|
| 2125 |
-
11,
|
| 2126 |
-
20
|
| 2127 |
-
],
|
| 2128 |
-
"adjacent_hexes": [
|
| 2129 |
-
5,
|
| 2130 |
-
4,
|
| 2131 |
-
1
|
| 2132 |
-
]
|
| 2133 |
-
},
|
| 2134 |
-
{
|
| 2135 |
-
"point_id": 11,
|
| 2136 |
-
"adjacent_points": [
|
| 2137 |
-
10,
|
| 2138 |
-
12,
|
| 2139 |
-
3
|
| 2140 |
-
],
|
| 2141 |
-
"adjacent_hexes": [
|
| 2142 |
-
5,
|
| 2143 |
-
2,
|
| 2144 |
-
1
|
| 2145 |
-
]
|
| 2146 |
-
},
|
| 2147 |
-
{
|
| 2148 |
-
"point_id": 12,
|
| 2149 |
-
"adjacent_points": [
|
| 2150 |
-
11,
|
| 2151 |
-
13,
|
| 2152 |
-
22
|
| 2153 |
-
],
|
| 2154 |
-
"adjacent_hexes": [
|
| 2155 |
-
6,
|
| 2156 |
-
5,
|
| 2157 |
-
2
|
| 2158 |
-
]
|
| 2159 |
-
},
|
| 2160 |
-
{
|
| 2161 |
-
"point_id": 13,
|
| 2162 |
-
"adjacent_points": [
|
| 2163 |
-
12,
|
| 2164 |
-
14,
|
| 2165 |
-
5
|
| 2166 |
-
],
|
| 2167 |
-
"adjacent_hexes": [
|
| 2168 |
-
6,
|
| 2169 |
-
3,
|
| 2170 |
-
2
|
| 2171 |
-
]
|
| 2172 |
-
},
|
| 2173 |
-
{
|
| 2174 |
-
"point_id": 14,
|
| 2175 |
-
"adjacent_points": [
|
| 2176 |
-
13,
|
| 2177 |
-
15,
|
| 2178 |
-
24
|
| 2179 |
-
],
|
| 2180 |
-
"adjacent_hexes": [
|
| 2181 |
-
7,
|
| 2182 |
-
6,
|
| 2183 |
-
3
|
| 2184 |
-
]
|
| 2185 |
-
},
|
| 2186 |
-
{
|
| 2187 |
-
"point_id": 15,
|
| 2188 |
-
"adjacent_points": [
|
| 2189 |
-
14,
|
| 2190 |
-
16,
|
| 2191 |
-
7
|
| 2192 |
-
],
|
| 2193 |
-
"adjacent_hexes": [
|
| 2194 |
-
7,
|
| 2195 |
-
3
|
| 2196 |
-
]
|
| 2197 |
-
},
|
| 2198 |
-
{
|
| 2199 |
-
"point_id": 16,
|
| 2200 |
-
"adjacent_points": [
|
| 2201 |
-
15,
|
| 2202 |
-
26
|
| 2203 |
-
],
|
| 2204 |
-
"adjacent_hexes": [
|
| 2205 |
-
7
|
| 2206 |
-
]
|
| 2207 |
-
},
|
| 2208 |
-
{
|
| 2209 |
-
"point_id": 17,
|
| 2210 |
-
"adjacent_points": [
|
| 2211 |
-
18,
|
| 2212 |
-
28
|
| 2213 |
-
],
|
| 2214 |
-
"adjacent_hexes": [
|
| 2215 |
-
8
|
| 2216 |
-
]
|
| 2217 |
-
},
|
| 2218 |
-
{
|
| 2219 |
-
"point_id": 18,
|
| 2220 |
-
"adjacent_points": [
|
| 2221 |
-
17,
|
| 2222 |
-
19,
|
| 2223 |
-
8
|
| 2224 |
-
],
|
| 2225 |
-
"adjacent_hexes": [
|
| 2226 |
-
8,
|
| 2227 |
-
4
|
| 2228 |
-
]
|
| 2229 |
-
},
|
| 2230 |
-
{
|
| 2231 |
-
"point_id": 19,
|
| 2232 |
-
"adjacent_points": [
|
| 2233 |
-
18,
|
| 2234 |
-
20,
|
| 2235 |
-
30
|
| 2236 |
-
],
|
| 2237 |
-
"adjacent_hexes": [
|
| 2238 |
-
9,
|
| 2239 |
-
8,
|
| 2240 |
-
4
|
| 2241 |
-
]
|
| 2242 |
-
},
|
| 2243 |
-
{
|
| 2244 |
-
"point_id": 20,
|
| 2245 |
-
"adjacent_points": [
|
| 2246 |
-
19,
|
| 2247 |
-
21,
|
| 2248 |
-
10
|
| 2249 |
-
],
|
| 2250 |
-
"adjacent_hexes": [
|
| 2251 |
-
9,
|
| 2252 |
-
5,
|
| 2253 |
-
4
|
| 2254 |
-
]
|
| 2255 |
-
},
|
| 2256 |
-
{
|
| 2257 |
-
"point_id": 21,
|
| 2258 |
-
"adjacent_points": [
|
| 2259 |
-
20,
|
| 2260 |
-
22,
|
| 2261 |
-
32
|
| 2262 |
-
],
|
| 2263 |
-
"adjacent_hexes": [
|
| 2264 |
-
10,
|
| 2265 |
-
9,
|
| 2266 |
-
5
|
| 2267 |
-
]
|
| 2268 |
-
},
|
| 2269 |
-
{
|
| 2270 |
-
"point_id": 22,
|
| 2271 |
-
"adjacent_points": [
|
| 2272 |
-
21,
|
| 2273 |
-
23,
|
| 2274 |
-
12
|
| 2275 |
-
],
|
| 2276 |
-
"adjacent_hexes": [
|
| 2277 |
-
10,
|
| 2278 |
-
6,
|
| 2279 |
-
5
|
| 2280 |
-
]
|
| 2281 |
-
},
|
| 2282 |
-
{
|
| 2283 |
-
"point_id": 23,
|
| 2284 |
-
"adjacent_points": [
|
| 2285 |
-
22,
|
| 2286 |
-
24,
|
| 2287 |
-
34
|
| 2288 |
-
],
|
| 2289 |
-
"adjacent_hexes": [
|
| 2290 |
-
11,
|
| 2291 |
-
10,
|
| 2292 |
-
6
|
| 2293 |
-
]
|
| 2294 |
-
},
|
| 2295 |
-
{
|
| 2296 |
-
"point_id": 24,
|
| 2297 |
-
"adjacent_points": [
|
| 2298 |
-
23,
|
| 2299 |
-
25,
|
| 2300 |
-
14
|
| 2301 |
-
],
|
| 2302 |
-
"adjacent_hexes": [
|
| 2303 |
-
11,
|
| 2304 |
-
7,
|
| 2305 |
-
6
|
| 2306 |
-
]
|
| 2307 |
-
},
|
| 2308 |
-
{
|
| 2309 |
-
"point_id": 25,
|
| 2310 |
-
"adjacent_points": [
|
| 2311 |
-
24,
|
| 2312 |
-
26,
|
| 2313 |
-
36
|
| 2314 |
-
],
|
| 2315 |
-
"adjacent_hexes": [
|
| 2316 |
-
12,
|
| 2317 |
-
11,
|
| 2318 |
-
7
|
| 2319 |
-
]
|
| 2320 |
-
},
|
| 2321 |
-
{
|
| 2322 |
-
"point_id": 26,
|
| 2323 |
-
"adjacent_points": [
|
| 2324 |
-
25,
|
| 2325 |
-
27,
|
| 2326 |
-
16
|
| 2327 |
-
],
|
| 2328 |
-
"adjacent_hexes": [
|
| 2329 |
-
12,
|
| 2330 |
-
7
|
| 2331 |
-
]
|
| 2332 |
-
},
|
| 2333 |
-
{
|
| 2334 |
-
"point_id": 27,
|
| 2335 |
-
"adjacent_points": [
|
| 2336 |
-
26,
|
| 2337 |
-
38
|
| 2338 |
-
],
|
| 2339 |
-
"adjacent_hexes": [
|
| 2340 |
-
12
|
| 2341 |
-
]
|
| 2342 |
-
},
|
| 2343 |
-
{
|
| 2344 |
-
"point_id": 28,
|
| 2345 |
-
"adjacent_points": [
|
| 2346 |
-
29,
|
| 2347 |
-
17
|
| 2348 |
-
],
|
| 2349 |
-
"adjacent_hexes": [
|
| 2350 |
-
8
|
| 2351 |
-
]
|
| 2352 |
-
},
|
| 2353 |
-
{
|
| 2354 |
-
"point_id": 29,
|
| 2355 |
-
"adjacent_points": [
|
| 2356 |
-
28,
|
| 2357 |
-
30,
|
| 2358 |
-
39
|
| 2359 |
-
],
|
| 2360 |
-
"adjacent_hexes": [
|
| 2361 |
-
13,
|
| 2362 |
-
8
|
| 2363 |
-
]
|
| 2364 |
-
},
|
| 2365 |
-
{
|
| 2366 |
-
"point_id": 30,
|
| 2367 |
-
"adjacent_points": [
|
| 2368 |
-
29,
|
| 2369 |
-
31,
|
| 2370 |
-
19
|
| 2371 |
-
],
|
| 2372 |
-
"adjacent_hexes": [
|
| 2373 |
-
13,
|
| 2374 |
-
9,
|
| 2375 |
-
8
|
| 2376 |
-
]
|
| 2377 |
-
},
|
| 2378 |
-
{
|
| 2379 |
-
"point_id": 31,
|
| 2380 |
-
"adjacent_points": [
|
| 2381 |
-
30,
|
| 2382 |
-
32,
|
| 2383 |
-
41
|
| 2384 |
-
],
|
| 2385 |
-
"adjacent_hexes": [
|
| 2386 |
-
14,
|
| 2387 |
-
13,
|
| 2388 |
-
9
|
| 2389 |
-
]
|
| 2390 |
-
},
|
| 2391 |
-
{
|
| 2392 |
-
"point_id": 32,
|
| 2393 |
-
"adjacent_points": [
|
| 2394 |
-
31,
|
| 2395 |
-
33,
|
| 2396 |
-
21
|
| 2397 |
-
],
|
| 2398 |
-
"adjacent_hexes": [
|
| 2399 |
-
14,
|
| 2400 |
-
10,
|
| 2401 |
-
9
|
| 2402 |
-
]
|
| 2403 |
-
},
|
| 2404 |
-
{
|
| 2405 |
-
"point_id": 33,
|
| 2406 |
-
"adjacent_points": [
|
| 2407 |
-
32,
|
| 2408 |
-
34,
|
| 2409 |
-
43
|
| 2410 |
-
],
|
| 2411 |
-
"adjacent_hexes": [
|
| 2412 |
-
15,
|
| 2413 |
-
14,
|
| 2414 |
-
10
|
| 2415 |
-
]
|
| 2416 |
-
},
|
| 2417 |
-
{
|
| 2418 |
-
"point_id": 34,
|
| 2419 |
-
"adjacent_points": [
|
| 2420 |
-
33,
|
| 2421 |
-
35,
|
| 2422 |
-
23
|
| 2423 |
-
],
|
| 2424 |
-
"adjacent_hexes": [
|
| 2425 |
-
15,
|
| 2426 |
-
11,
|
| 2427 |
-
10
|
| 2428 |
-
]
|
| 2429 |
-
},
|
| 2430 |
-
{
|
| 2431 |
-
"point_id": 35,
|
| 2432 |
-
"adjacent_points": [
|
| 2433 |
-
34,
|
| 2434 |
-
36,
|
| 2435 |
-
45
|
| 2436 |
-
],
|
| 2437 |
-
"adjacent_hexes": [
|
| 2438 |
-
16,
|
| 2439 |
-
15,
|
| 2440 |
-
11
|
| 2441 |
-
]
|
| 2442 |
-
},
|
| 2443 |
-
{
|
| 2444 |
-
"point_id": 36,
|
| 2445 |
-
"adjacent_points": [
|
| 2446 |
-
35,
|
| 2447 |
-
37,
|
| 2448 |
-
25
|
| 2449 |
-
],
|
| 2450 |
-
"adjacent_hexes": [
|
| 2451 |
-
16,
|
| 2452 |
-
12,
|
| 2453 |
-
11
|
| 2454 |
-
]
|
| 2455 |
-
},
|
| 2456 |
-
{
|
| 2457 |
-
"point_id": 37,
|
| 2458 |
-
"adjacent_points": [
|
| 2459 |
-
36,
|
| 2460 |
-
38,
|
| 2461 |
-
47
|
| 2462 |
-
],
|
| 2463 |
-
"adjacent_hexes": [
|
| 2464 |
-
16,
|
| 2465 |
-
12
|
| 2466 |
-
]
|
| 2467 |
-
},
|
| 2468 |
-
{
|
| 2469 |
-
"point_id": 38,
|
| 2470 |
-
"adjacent_points": [
|
| 2471 |
-
37,
|
| 2472 |
-
27
|
| 2473 |
-
],
|
| 2474 |
-
"adjacent_hexes": [
|
| 2475 |
-
12
|
| 2476 |
-
]
|
| 2477 |
-
},
|
| 2478 |
-
{
|
| 2479 |
-
"point_id": 39,
|
| 2480 |
-
"adjacent_points": [
|
| 2481 |
-
40,
|
| 2482 |
-
29
|
| 2483 |
-
],
|
| 2484 |
-
"adjacent_hexes": [
|
| 2485 |
-
13
|
| 2486 |
-
]
|
| 2487 |
-
},
|
| 2488 |
-
{
|
| 2489 |
-
"point_id": 40,
|
| 2490 |
-
"adjacent_points": [
|
| 2491 |
-
39,
|
| 2492 |
-
41,
|
| 2493 |
-
48
|
| 2494 |
-
],
|
| 2495 |
-
"adjacent_hexes": [
|
| 2496 |
-
17,
|
| 2497 |
-
13
|
| 2498 |
-
]
|
| 2499 |
-
},
|
| 2500 |
-
{
|
| 2501 |
-
"point_id": 41,
|
| 2502 |
-
"adjacent_points": [
|
| 2503 |
-
40,
|
| 2504 |
-
42,
|
| 2505 |
-
31
|
| 2506 |
-
],
|
| 2507 |
-
"adjacent_hexes": [
|
| 2508 |
-
17,
|
| 2509 |
-
14,
|
| 2510 |
-
13
|
| 2511 |
-
]
|
| 2512 |
-
},
|
| 2513 |
-
{
|
| 2514 |
-
"point_id": 42,
|
| 2515 |
-
"adjacent_points": [
|
| 2516 |
-
41,
|
| 2517 |
-
43,
|
| 2518 |
-
50
|
| 2519 |
-
],
|
| 2520 |
-
"adjacent_hexes": [
|
| 2521 |
-
18,
|
| 2522 |
-
17,
|
| 2523 |
-
14
|
| 2524 |
-
]
|
| 2525 |
-
},
|
| 2526 |
-
{
|
| 2527 |
-
"point_id": 43,
|
| 2528 |
-
"adjacent_points": [
|
| 2529 |
-
42,
|
| 2530 |
-
44,
|
| 2531 |
-
33
|
| 2532 |
-
],
|
| 2533 |
-
"adjacent_hexes": [
|
| 2534 |
-
18,
|
| 2535 |
-
15,
|
| 2536 |
-
14
|
| 2537 |
-
]
|
| 2538 |
-
},
|
| 2539 |
-
{
|
| 2540 |
-
"point_id": 44,
|
| 2541 |
-
"adjacent_points": [
|
| 2542 |
-
43,
|
| 2543 |
-
45,
|
| 2544 |
-
52
|
| 2545 |
-
],
|
| 2546 |
-
"adjacent_hexes": [
|
| 2547 |
-
19,
|
| 2548 |
-
18,
|
| 2549 |
-
15
|
| 2550 |
-
]
|
| 2551 |
-
},
|
| 2552 |
-
{
|
| 2553 |
-
"point_id": 45,
|
| 2554 |
-
"adjacent_points": [
|
| 2555 |
-
44,
|
| 2556 |
-
46,
|
| 2557 |
-
35
|
| 2558 |
-
],
|
| 2559 |
-
"adjacent_hexes": [
|
| 2560 |
-
19,
|
| 2561 |
-
16,
|
| 2562 |
-
15
|
| 2563 |
-
]
|
| 2564 |
-
},
|
| 2565 |
-
{
|
| 2566 |
-
"point_id": 46,
|
| 2567 |
-
"adjacent_points": [
|
| 2568 |
-
45,
|
| 2569 |
-
47,
|
| 2570 |
-
54
|
| 2571 |
-
],
|
| 2572 |
-
"adjacent_hexes": [
|
| 2573 |
-
19,
|
| 2574 |
-
16
|
| 2575 |
-
]
|
| 2576 |
-
},
|
| 2577 |
-
{
|
| 2578 |
-
"point_id": 47,
|
| 2579 |
-
"adjacent_points": [
|
| 2580 |
-
46,
|
| 2581 |
-
37
|
| 2582 |
-
],
|
| 2583 |
-
"adjacent_hexes": [
|
| 2584 |
-
16
|
| 2585 |
-
]
|
| 2586 |
-
},
|
| 2587 |
-
{
|
| 2588 |
-
"point_id": 48,
|
| 2589 |
-
"adjacent_points": [
|
| 2590 |
-
49,
|
| 2591 |
-
40
|
| 2592 |
-
],
|
| 2593 |
-
"adjacent_hexes": [
|
| 2594 |
-
17
|
| 2595 |
-
]
|
| 2596 |
-
},
|
| 2597 |
-
{
|
| 2598 |
-
"point_id": 49,
|
| 2599 |
-
"adjacent_points": [
|
| 2600 |
-
48,
|
| 2601 |
-
50
|
| 2602 |
-
],
|
| 2603 |
-
"adjacent_hexes": [
|
| 2604 |
-
17
|
| 2605 |
-
]
|
| 2606 |
-
},
|
| 2607 |
-
{
|
| 2608 |
-
"point_id": 50,
|
| 2609 |
-
"adjacent_points": [
|
| 2610 |
-
49,
|
| 2611 |
-
51,
|
| 2612 |
-
42
|
| 2613 |
-
],
|
| 2614 |
-
"adjacent_hexes": [
|
| 2615 |
-
18,
|
| 2616 |
-
17
|
| 2617 |
-
]
|
| 2618 |
-
},
|
| 2619 |
-
{
|
| 2620 |
-
"point_id": 51,
|
| 2621 |
-
"adjacent_points": [
|
| 2622 |
-
50,
|
| 2623 |
-
52
|
| 2624 |
-
],
|
| 2625 |
-
"adjacent_hexes": [
|
| 2626 |
-
18
|
| 2627 |
-
]
|
| 2628 |
-
},
|
| 2629 |
-
{
|
| 2630 |
-
"point_id": 52,
|
| 2631 |
-
"adjacent_points": [
|
| 2632 |
-
51,
|
| 2633 |
-
53,
|
| 2634 |
-
44
|
| 2635 |
-
],
|
| 2636 |
-
"adjacent_hexes": [
|
| 2637 |
-
19,
|
| 2638 |
-
18
|
| 2639 |
-
]
|
| 2640 |
-
},
|
| 2641 |
-
{
|
| 2642 |
-
"point_id": 53,
|
| 2643 |
-
"adjacent_points": [
|
| 2644 |
-
52,
|
| 2645 |
-
54
|
| 2646 |
-
],
|
| 2647 |
-
"adjacent_hexes": [
|
| 2648 |
-
19
|
| 2649 |
-
]
|
| 2650 |
-
},
|
| 2651 |
-
{
|
| 2652 |
-
"point_id": 54,
|
| 2653 |
-
"adjacent_points": [
|
| 2654 |
-
53,
|
| 2655 |
-
46
|
| 2656 |
-
],
|
| 2657 |
-
"adjacent_hexes": [
|
| 2658 |
-
19
|
| 2659 |
-
]
|
| 2660 |
-
}
|
| 2661 |
-
]
|
| 2662 |
-
}
|
| 2663 |
-
]
|
| 2664 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
examples/ai_testing/my_games/game_20260103_220835_full_optimized.txt
DELETED
|
@@ -1,1965 +0,0 @@
|
|
| 1 |
-
{
|
| 2 |
-
"total_states": 3,
|
| 3 |
-
"timestamp": "20260103_220835",
|
| 4 |
-
"states": [
|
| 5 |
-
{
|
| 6 |
-
"meta": {
|
| 7 |
-
"curr": "a",
|
| 8 |
-
"phase": "SETUP_FIRST_ROUND",
|
| 9 |
-
"robber": 10,
|
| 10 |
-
"dice": null
|
| 11 |
-
},
|
| 12 |
-
"H": [
|
| 13 |
-
"",
|
| 14 |
-
"W12",
|
| 15 |
-
"S5",
|
| 16 |
-
"W4",
|
| 17 |
-
"S8",
|
| 18 |
-
"B6",
|
| 19 |
-
"W3",
|
| 20 |
-
"Wh8",
|
| 21 |
-
"B10",
|
| 22 |
-
"W11",
|
| 23 |
-
"D",
|
| 24 |
-
"O3",
|
| 25 |
-
"S4",
|
| 26 |
-
"B10",
|
| 27 |
-
"Wh9",
|
| 28 |
-
"Wh6",
|
| 29 |
-
"S11",
|
| 30 |
-
"O5",
|
| 31 |
-
"Wh9",
|
| 32 |
-
"O2"
|
| 33 |
-
],
|
| 34 |
-
"N": [
|
| 35 |
-
null,
|
| 36 |
-
[
|
| 37 |
-
[
|
| 38 |
-
2,
|
| 39 |
-
9
|
| 40 |
-
],
|
| 41 |
-
[
|
| 42 |
-
1
|
| 43 |
-
]
|
| 44 |
-
],
|
| 45 |
-
[
|
| 46 |
-
[
|
| 47 |
-
1,
|
| 48 |
-
3
|
| 49 |
-
],
|
| 50 |
-
[
|
| 51 |
-
1
|
| 52 |
-
],
|
| 53 |
-
"Wh2"
|
| 54 |
-
],
|
| 55 |
-
[
|
| 56 |
-
[
|
| 57 |
-
2,
|
| 58 |
-
4,
|
| 59 |
-
11
|
| 60 |
-
],
|
| 61 |
-
[
|
| 62 |
-
2,
|
| 63 |
-
1
|
| 64 |
-
],
|
| 65 |
-
"Wh2"
|
| 66 |
-
],
|
| 67 |
-
[
|
| 68 |
-
[
|
| 69 |
-
3,
|
| 70 |
-
5
|
| 71 |
-
],
|
| 72 |
-
[
|
| 73 |
-
2
|
| 74 |
-
]
|
| 75 |
-
],
|
| 76 |
-
[
|
| 77 |
-
[
|
| 78 |
-
4,
|
| 79 |
-
6,
|
| 80 |
-
13
|
| 81 |
-
],
|
| 82 |
-
[
|
| 83 |
-
3,
|
| 84 |
-
2
|
| 85 |
-
]
|
| 86 |
-
],
|
| 87 |
-
[
|
| 88 |
-
[
|
| 89 |
-
5,
|
| 90 |
-
7
|
| 91 |
-
],
|
| 92 |
-
[
|
| 93 |
-
3
|
| 94 |
-
],
|
| 95 |
-
"B2"
|
| 96 |
-
],
|
| 97 |
-
[
|
| 98 |
-
[
|
| 99 |
-
6,
|
| 100 |
-
15
|
| 101 |
-
],
|
| 102 |
-
[
|
| 103 |
-
3
|
| 104 |
-
],
|
| 105 |
-
"B2"
|
| 106 |
-
],
|
| 107 |
-
[
|
| 108 |
-
[
|
| 109 |
-
9,
|
| 110 |
-
18
|
| 111 |
-
],
|
| 112 |
-
[
|
| 113 |
-
4
|
| 114 |
-
],
|
| 115 |
-
"?3"
|
| 116 |
-
],
|
| 117 |
-
[
|
| 118 |
-
[
|
| 119 |
-
8,
|
| 120 |
-
10,
|
| 121 |
-
1
|
| 122 |
-
],
|
| 123 |
-
[
|
| 124 |
-
4,
|
| 125 |
-
1
|
| 126 |
-
],
|
| 127 |
-
"?3"
|
| 128 |
-
],
|
| 129 |
-
[
|
| 130 |
-
[
|
| 131 |
-
9,
|
| 132 |
-
11,
|
| 133 |
-
20
|
| 134 |
-
],
|
| 135 |
-
[
|
| 136 |
-
5,
|
| 137 |
-
4,
|
| 138 |
-
1
|
| 139 |
-
]
|
| 140 |
-
],
|
| 141 |
-
[
|
| 142 |
-
[
|
| 143 |
-
10,
|
| 144 |
-
12,
|
| 145 |
-
3
|
| 146 |
-
],
|
| 147 |
-
[
|
| 148 |
-
5,
|
| 149 |
-
2,
|
| 150 |
-
1
|
| 151 |
-
]
|
| 152 |
-
],
|
| 153 |
-
[
|
| 154 |
-
[
|
| 155 |
-
11,
|
| 156 |
-
13,
|
| 157 |
-
22
|
| 158 |
-
],
|
| 159 |
-
[
|
| 160 |
-
6,
|
| 161 |
-
5,
|
| 162 |
-
2
|
| 163 |
-
]
|
| 164 |
-
],
|
| 165 |
-
[
|
| 166 |
-
[
|
| 167 |
-
12,
|
| 168 |
-
14,
|
| 169 |
-
5
|
| 170 |
-
],
|
| 171 |
-
[
|
| 172 |
-
6,
|
| 173 |
-
3,
|
| 174 |
-
2
|
| 175 |
-
]
|
| 176 |
-
],
|
| 177 |
-
[
|
| 178 |
-
[
|
| 179 |
-
13,
|
| 180 |
-
15,
|
| 181 |
-
24
|
| 182 |
-
],
|
| 183 |
-
[
|
| 184 |
-
7,
|
| 185 |
-
6,
|
| 186 |
-
3
|
| 187 |
-
]
|
| 188 |
-
],
|
| 189 |
-
[
|
| 190 |
-
[
|
| 191 |
-
14,
|
| 192 |
-
16,
|
| 193 |
-
7
|
| 194 |
-
],
|
| 195 |
-
[
|
| 196 |
-
7,
|
| 197 |
-
3
|
| 198 |
-
]
|
| 199 |
-
],
|
| 200 |
-
[
|
| 201 |
-
[
|
| 202 |
-
15,
|
| 203 |
-
26
|
| 204 |
-
],
|
| 205 |
-
[
|
| 206 |
-
7
|
| 207 |
-
],
|
| 208 |
-
"O2"
|
| 209 |
-
],
|
| 210 |
-
[
|
| 211 |
-
[
|
| 212 |
-
18,
|
| 213 |
-
28
|
| 214 |
-
],
|
| 215 |
-
[
|
| 216 |
-
8
|
| 217 |
-
],
|
| 218 |
-
"S2"
|
| 219 |
-
],
|
| 220 |
-
[
|
| 221 |
-
[
|
| 222 |
-
17,
|
| 223 |
-
19,
|
| 224 |
-
8
|
| 225 |
-
],
|
| 226 |
-
[
|
| 227 |
-
8,
|
| 228 |
-
4
|
| 229 |
-
]
|
| 230 |
-
],
|
| 231 |
-
[
|
| 232 |
-
[
|
| 233 |
-
18,
|
| 234 |
-
20,
|
| 235 |
-
30
|
| 236 |
-
],
|
| 237 |
-
[
|
| 238 |
-
9,
|
| 239 |
-
8,
|
| 240 |
-
4
|
| 241 |
-
]
|
| 242 |
-
],
|
| 243 |
-
[
|
| 244 |
-
[
|
| 245 |
-
19,
|
| 246 |
-
21,
|
| 247 |
-
10
|
| 248 |
-
],
|
| 249 |
-
[
|
| 250 |
-
9,
|
| 251 |
-
5,
|
| 252 |
-
4
|
| 253 |
-
]
|
| 254 |
-
],
|
| 255 |
-
[
|
| 256 |
-
[
|
| 257 |
-
20,
|
| 258 |
-
22,
|
| 259 |
-
32
|
| 260 |
-
],
|
| 261 |
-
[
|
| 262 |
-
10,
|
| 263 |
-
9,
|
| 264 |
-
5
|
| 265 |
-
]
|
| 266 |
-
],
|
| 267 |
-
[
|
| 268 |
-
[
|
| 269 |
-
21,
|
| 270 |
-
23,
|
| 271 |
-
12
|
| 272 |
-
],
|
| 273 |
-
[
|
| 274 |
-
10,
|
| 275 |
-
6,
|
| 276 |
-
5
|
| 277 |
-
]
|
| 278 |
-
],
|
| 279 |
-
[
|
| 280 |
-
[
|
| 281 |
-
22,
|
| 282 |
-
24,
|
| 283 |
-
34
|
| 284 |
-
],
|
| 285 |
-
[
|
| 286 |
-
11,
|
| 287 |
-
10,
|
| 288 |
-
6
|
| 289 |
-
]
|
| 290 |
-
],
|
| 291 |
-
[
|
| 292 |
-
[
|
| 293 |
-
23,
|
| 294 |
-
25,
|
| 295 |
-
14
|
| 296 |
-
],
|
| 297 |
-
[
|
| 298 |
-
11,
|
| 299 |
-
7,
|
| 300 |
-
6
|
| 301 |
-
]
|
| 302 |
-
],
|
| 303 |
-
[
|
| 304 |
-
[
|
| 305 |
-
24,
|
| 306 |
-
26,
|
| 307 |
-
36
|
| 308 |
-
],
|
| 309 |
-
[
|
| 310 |
-
12,
|
| 311 |
-
11,
|
| 312 |
-
7
|
| 313 |
-
]
|
| 314 |
-
],
|
| 315 |
-
[
|
| 316 |
-
[
|
| 317 |
-
25,
|
| 318 |
-
27,
|
| 319 |
-
16
|
| 320 |
-
],
|
| 321 |
-
[
|
| 322 |
-
12,
|
| 323 |
-
7
|
| 324 |
-
],
|
| 325 |
-
"O2"
|
| 326 |
-
],
|
| 327 |
-
[
|
| 328 |
-
[
|
| 329 |
-
26,
|
| 330 |
-
38
|
| 331 |
-
],
|
| 332 |
-
[
|
| 333 |
-
12
|
| 334 |
-
]
|
| 335 |
-
],
|
| 336 |
-
[
|
| 337 |
-
[
|
| 338 |
-
29,
|
| 339 |
-
17
|
| 340 |
-
],
|
| 341 |
-
[
|
| 342 |
-
8
|
| 343 |
-
],
|
| 344 |
-
"S2"
|
| 345 |
-
],
|
| 346 |
-
[
|
| 347 |
-
[
|
| 348 |
-
28,
|
| 349 |
-
30,
|
| 350 |
-
39
|
| 351 |
-
],
|
| 352 |
-
[
|
| 353 |
-
13,
|
| 354 |
-
8
|
| 355 |
-
]
|
| 356 |
-
],
|
| 357 |
-
[
|
| 358 |
-
[
|
| 359 |
-
29,
|
| 360 |
-
31,
|
| 361 |
-
19
|
| 362 |
-
],
|
| 363 |
-
[
|
| 364 |
-
13,
|
| 365 |
-
9,
|
| 366 |
-
8
|
| 367 |
-
]
|
| 368 |
-
],
|
| 369 |
-
[
|
| 370 |
-
[
|
| 371 |
-
30,
|
| 372 |
-
32,
|
| 373 |
-
41
|
| 374 |
-
],
|
| 375 |
-
[
|
| 376 |
-
14,
|
| 377 |
-
13,
|
| 378 |
-
9
|
| 379 |
-
]
|
| 380 |
-
],
|
| 381 |
-
[
|
| 382 |
-
[
|
| 383 |
-
31,
|
| 384 |
-
33,
|
| 385 |
-
21
|
| 386 |
-
],
|
| 387 |
-
[
|
| 388 |
-
14,
|
| 389 |
-
10,
|
| 390 |
-
9
|
| 391 |
-
]
|
| 392 |
-
],
|
| 393 |
-
[
|
| 394 |
-
[
|
| 395 |
-
32,
|
| 396 |
-
34,
|
| 397 |
-
43
|
| 398 |
-
],
|
| 399 |
-
[
|
| 400 |
-
15,
|
| 401 |
-
14,
|
| 402 |
-
10
|
| 403 |
-
]
|
| 404 |
-
],
|
| 405 |
-
[
|
| 406 |
-
[
|
| 407 |
-
33,
|
| 408 |
-
35,
|
| 409 |
-
23
|
| 410 |
-
],
|
| 411 |
-
[
|
| 412 |
-
15,
|
| 413 |
-
11,
|
| 414 |
-
10
|
| 415 |
-
]
|
| 416 |
-
],
|
| 417 |
-
[
|
| 418 |
-
[
|
| 419 |
-
34,
|
| 420 |
-
36,
|
| 421 |
-
45
|
| 422 |
-
],
|
| 423 |
-
[
|
| 424 |
-
16,
|
| 425 |
-
15,
|
| 426 |
-
11
|
| 427 |
-
]
|
| 428 |
-
],
|
| 429 |
-
[
|
| 430 |
-
[
|
| 431 |
-
35,
|
| 432 |
-
37,
|
| 433 |
-
25
|
| 434 |
-
],
|
| 435 |
-
[
|
| 436 |
-
16,
|
| 437 |
-
12,
|
| 438 |
-
11
|
| 439 |
-
]
|
| 440 |
-
],
|
| 441 |
-
[
|
| 442 |
-
[
|
| 443 |
-
36,
|
| 444 |
-
38,
|
| 445 |
-
47
|
| 446 |
-
],
|
| 447 |
-
[
|
| 448 |
-
16,
|
| 449 |
-
12
|
| 450 |
-
],
|
| 451 |
-
"?3"
|
| 452 |
-
],
|
| 453 |
-
[
|
| 454 |
-
[
|
| 455 |
-
37,
|
| 456 |
-
27
|
| 457 |
-
],
|
| 458 |
-
[
|
| 459 |
-
12
|
| 460 |
-
],
|
| 461 |
-
"?3"
|
| 462 |
-
],
|
| 463 |
-
[
|
| 464 |
-
[
|
| 465 |
-
40,
|
| 466 |
-
29
|
| 467 |
-
],
|
| 468 |
-
[
|
| 469 |
-
13
|
| 470 |
-
]
|
| 471 |
-
],
|
| 472 |
-
[
|
| 473 |
-
[
|
| 474 |
-
39,
|
| 475 |
-
41,
|
| 476 |
-
48
|
| 477 |
-
],
|
| 478 |
-
[
|
| 479 |
-
17,
|
| 480 |
-
13
|
| 481 |
-
],
|
| 482 |
-
"W2"
|
| 483 |
-
],
|
| 484 |
-
[
|
| 485 |
-
[
|
| 486 |
-
40,
|
| 487 |
-
42,
|
| 488 |
-
31
|
| 489 |
-
],
|
| 490 |
-
[
|
| 491 |
-
17,
|
| 492 |
-
14,
|
| 493 |
-
13
|
| 494 |
-
]
|
| 495 |
-
],
|
| 496 |
-
[
|
| 497 |
-
[
|
| 498 |
-
41,
|
| 499 |
-
43,
|
| 500 |
-
50
|
| 501 |
-
],
|
| 502 |
-
[
|
| 503 |
-
18,
|
| 504 |
-
17,
|
| 505 |
-
14
|
| 506 |
-
]
|
| 507 |
-
],
|
| 508 |
-
[
|
| 509 |
-
[
|
| 510 |
-
42,
|
| 511 |
-
44,
|
| 512 |
-
33
|
| 513 |
-
],
|
| 514 |
-
[
|
| 515 |
-
18,
|
| 516 |
-
15,
|
| 517 |
-
14
|
| 518 |
-
]
|
| 519 |
-
],
|
| 520 |
-
[
|
| 521 |
-
[
|
| 522 |
-
43,
|
| 523 |
-
45,
|
| 524 |
-
52
|
| 525 |
-
],
|
| 526 |
-
[
|
| 527 |
-
19,
|
| 528 |
-
18,
|
| 529 |
-
15
|
| 530 |
-
]
|
| 531 |
-
],
|
| 532 |
-
[
|
| 533 |
-
[
|
| 534 |
-
44,
|
| 535 |
-
46,
|
| 536 |
-
35
|
| 537 |
-
],
|
| 538 |
-
[
|
| 539 |
-
19,
|
| 540 |
-
16,
|
| 541 |
-
15
|
| 542 |
-
]
|
| 543 |
-
],
|
| 544 |
-
[
|
| 545 |
-
[
|
| 546 |
-
45,
|
| 547 |
-
47,
|
| 548 |
-
54
|
| 549 |
-
],
|
| 550 |
-
[
|
| 551 |
-
19,
|
| 552 |
-
16
|
| 553 |
-
]
|
| 554 |
-
],
|
| 555 |
-
[
|
| 556 |
-
[
|
| 557 |
-
46,
|
| 558 |
-
37
|
| 559 |
-
],
|
| 560 |
-
[
|
| 561 |
-
16
|
| 562 |
-
]
|
| 563 |
-
],
|
| 564 |
-
[
|
| 565 |
-
[
|
| 566 |
-
49,
|
| 567 |
-
40
|
| 568 |
-
],
|
| 569 |
-
[
|
| 570 |
-
17
|
| 571 |
-
],
|
| 572 |
-
"W2"
|
| 573 |
-
],
|
| 574 |
-
[
|
| 575 |
-
[
|
| 576 |
-
48,
|
| 577 |
-
50
|
| 578 |
-
],
|
| 579 |
-
[
|
| 580 |
-
17
|
| 581 |
-
]
|
| 582 |
-
],
|
| 583 |
-
[
|
| 584 |
-
[
|
| 585 |
-
49,
|
| 586 |
-
51,
|
| 587 |
-
42
|
| 588 |
-
],
|
| 589 |
-
[
|
| 590 |
-
18,
|
| 591 |
-
17
|
| 592 |
-
],
|
| 593 |
-
"?3"
|
| 594 |
-
],
|
| 595 |
-
[
|
| 596 |
-
[
|
| 597 |
-
50,
|
| 598 |
-
52
|
| 599 |
-
],
|
| 600 |
-
[
|
| 601 |
-
18
|
| 602 |
-
],
|
| 603 |
-
"?3"
|
| 604 |
-
],
|
| 605 |
-
[
|
| 606 |
-
[
|
| 607 |
-
51,
|
| 608 |
-
53,
|
| 609 |
-
44
|
| 610 |
-
],
|
| 611 |
-
[
|
| 612 |
-
19,
|
| 613 |
-
18
|
| 614 |
-
]
|
| 615 |
-
],
|
| 616 |
-
[
|
| 617 |
-
[
|
| 618 |
-
52,
|
| 619 |
-
54
|
| 620 |
-
],
|
| 621 |
-
[
|
| 622 |
-
19
|
| 623 |
-
],
|
| 624 |
-
"?3"
|
| 625 |
-
],
|
| 626 |
-
[
|
| 627 |
-
[
|
| 628 |
-
53,
|
| 629 |
-
46
|
| 630 |
-
],
|
| 631 |
-
[
|
| 632 |
-
19
|
| 633 |
-
],
|
| 634 |
-
"?3"
|
| 635 |
-
]
|
| 636 |
-
],
|
| 637 |
-
"state": {
|
| 638 |
-
"bld": [],
|
| 639 |
-
"rds": []
|
| 640 |
-
},
|
| 641 |
-
"players": {
|
| 642 |
-
"a": {
|
| 643 |
-
"vp": 0,
|
| 644 |
-
"res": {}
|
| 645 |
-
},
|
| 646 |
-
"b": {
|
| 647 |
-
"vp": 0,
|
| 648 |
-
"res": {}
|
| 649 |
-
},
|
| 650 |
-
"c": {
|
| 651 |
-
"vp": 0,
|
| 652 |
-
"res": {}
|
| 653 |
-
}
|
| 654 |
-
}
|
| 655 |
-
},
|
| 656 |
-
{
|
| 657 |
-
"meta": {
|
| 658 |
-
"curr": "a",
|
| 659 |
-
"phase": "SETUP_FIRST_ROUND",
|
| 660 |
-
"robber": 10,
|
| 661 |
-
"dice": null
|
| 662 |
-
},
|
| 663 |
-
"H": [
|
| 664 |
-
"",
|
| 665 |
-
"W12",
|
| 666 |
-
"S5",
|
| 667 |
-
"W4",
|
| 668 |
-
"S8",
|
| 669 |
-
"B6",
|
| 670 |
-
"W3",
|
| 671 |
-
"Wh8",
|
| 672 |
-
"B10",
|
| 673 |
-
"W11",
|
| 674 |
-
"D",
|
| 675 |
-
"O3",
|
| 676 |
-
"S4",
|
| 677 |
-
"B10",
|
| 678 |
-
"Wh9",
|
| 679 |
-
"Wh6",
|
| 680 |
-
"S11",
|
| 681 |
-
"O5",
|
| 682 |
-
"Wh9",
|
| 683 |
-
"O2"
|
| 684 |
-
],
|
| 685 |
-
"N": [
|
| 686 |
-
null,
|
| 687 |
-
[
|
| 688 |
-
[
|
| 689 |
-
2,
|
| 690 |
-
9
|
| 691 |
-
],
|
| 692 |
-
[
|
| 693 |
-
1
|
| 694 |
-
]
|
| 695 |
-
],
|
| 696 |
-
[
|
| 697 |
-
[
|
| 698 |
-
1,
|
| 699 |
-
3
|
| 700 |
-
],
|
| 701 |
-
[
|
| 702 |
-
1
|
| 703 |
-
],
|
| 704 |
-
"Wh2"
|
| 705 |
-
],
|
| 706 |
-
[
|
| 707 |
-
[
|
| 708 |
-
2,
|
| 709 |
-
4,
|
| 710 |
-
11
|
| 711 |
-
],
|
| 712 |
-
[
|
| 713 |
-
2,
|
| 714 |
-
1
|
| 715 |
-
],
|
| 716 |
-
"Wh2"
|
| 717 |
-
],
|
| 718 |
-
[
|
| 719 |
-
[
|
| 720 |
-
3,
|
| 721 |
-
5
|
| 722 |
-
],
|
| 723 |
-
[
|
| 724 |
-
2
|
| 725 |
-
]
|
| 726 |
-
],
|
| 727 |
-
[
|
| 728 |
-
[
|
| 729 |
-
4,
|
| 730 |
-
6,
|
| 731 |
-
13
|
| 732 |
-
],
|
| 733 |
-
[
|
| 734 |
-
3,
|
| 735 |
-
2
|
| 736 |
-
]
|
| 737 |
-
],
|
| 738 |
-
[
|
| 739 |
-
[
|
| 740 |
-
5,
|
| 741 |
-
7
|
| 742 |
-
],
|
| 743 |
-
[
|
| 744 |
-
3
|
| 745 |
-
],
|
| 746 |
-
"B2"
|
| 747 |
-
],
|
| 748 |
-
[
|
| 749 |
-
[
|
| 750 |
-
6,
|
| 751 |
-
15
|
| 752 |
-
],
|
| 753 |
-
[
|
| 754 |
-
3
|
| 755 |
-
],
|
| 756 |
-
"B2"
|
| 757 |
-
],
|
| 758 |
-
[
|
| 759 |
-
[
|
| 760 |
-
9,
|
| 761 |
-
18
|
| 762 |
-
],
|
| 763 |
-
[
|
| 764 |
-
4
|
| 765 |
-
],
|
| 766 |
-
"?3"
|
| 767 |
-
],
|
| 768 |
-
[
|
| 769 |
-
[
|
| 770 |
-
8,
|
| 771 |
-
10,
|
| 772 |
-
1
|
| 773 |
-
],
|
| 774 |
-
[
|
| 775 |
-
4,
|
| 776 |
-
1
|
| 777 |
-
],
|
| 778 |
-
"?3"
|
| 779 |
-
],
|
| 780 |
-
[
|
| 781 |
-
[
|
| 782 |
-
9,
|
| 783 |
-
11,
|
| 784 |
-
20
|
| 785 |
-
],
|
| 786 |
-
[
|
| 787 |
-
5,
|
| 788 |
-
4,
|
| 789 |
-
1
|
| 790 |
-
]
|
| 791 |
-
],
|
| 792 |
-
[
|
| 793 |
-
[
|
| 794 |
-
10,
|
| 795 |
-
12,
|
| 796 |
-
3
|
| 797 |
-
],
|
| 798 |
-
[
|
| 799 |
-
5,
|
| 800 |
-
2,
|
| 801 |
-
1
|
| 802 |
-
]
|
| 803 |
-
],
|
| 804 |
-
[
|
| 805 |
-
[
|
| 806 |
-
11,
|
| 807 |
-
13,
|
| 808 |
-
22
|
| 809 |
-
],
|
| 810 |
-
[
|
| 811 |
-
6,
|
| 812 |
-
5,
|
| 813 |
-
2
|
| 814 |
-
]
|
| 815 |
-
],
|
| 816 |
-
[
|
| 817 |
-
[
|
| 818 |
-
12,
|
| 819 |
-
14,
|
| 820 |
-
5
|
| 821 |
-
],
|
| 822 |
-
[
|
| 823 |
-
6,
|
| 824 |
-
3,
|
| 825 |
-
2
|
| 826 |
-
]
|
| 827 |
-
],
|
| 828 |
-
[
|
| 829 |
-
[
|
| 830 |
-
13,
|
| 831 |
-
15,
|
| 832 |
-
24
|
| 833 |
-
],
|
| 834 |
-
[
|
| 835 |
-
7,
|
| 836 |
-
6,
|
| 837 |
-
3
|
| 838 |
-
]
|
| 839 |
-
],
|
| 840 |
-
[
|
| 841 |
-
[
|
| 842 |
-
14,
|
| 843 |
-
16,
|
| 844 |
-
7
|
| 845 |
-
],
|
| 846 |
-
[
|
| 847 |
-
7,
|
| 848 |
-
3
|
| 849 |
-
]
|
| 850 |
-
],
|
| 851 |
-
[
|
| 852 |
-
[
|
| 853 |
-
15,
|
| 854 |
-
26
|
| 855 |
-
],
|
| 856 |
-
[
|
| 857 |
-
7
|
| 858 |
-
],
|
| 859 |
-
"O2"
|
| 860 |
-
],
|
| 861 |
-
[
|
| 862 |
-
[
|
| 863 |
-
18,
|
| 864 |
-
28
|
| 865 |
-
],
|
| 866 |
-
[
|
| 867 |
-
8
|
| 868 |
-
],
|
| 869 |
-
"S2"
|
| 870 |
-
],
|
| 871 |
-
[
|
| 872 |
-
[
|
| 873 |
-
17,
|
| 874 |
-
19,
|
| 875 |
-
8
|
| 876 |
-
],
|
| 877 |
-
[
|
| 878 |
-
8,
|
| 879 |
-
4
|
| 880 |
-
]
|
| 881 |
-
],
|
| 882 |
-
[
|
| 883 |
-
[
|
| 884 |
-
18,
|
| 885 |
-
20,
|
| 886 |
-
30
|
| 887 |
-
],
|
| 888 |
-
[
|
| 889 |
-
9,
|
| 890 |
-
8,
|
| 891 |
-
4
|
| 892 |
-
]
|
| 893 |
-
],
|
| 894 |
-
[
|
| 895 |
-
[
|
| 896 |
-
19,
|
| 897 |
-
21,
|
| 898 |
-
10
|
| 899 |
-
],
|
| 900 |
-
[
|
| 901 |
-
9,
|
| 902 |
-
5,
|
| 903 |
-
4
|
| 904 |
-
]
|
| 905 |
-
],
|
| 906 |
-
[
|
| 907 |
-
[
|
| 908 |
-
20,
|
| 909 |
-
22,
|
| 910 |
-
32
|
| 911 |
-
],
|
| 912 |
-
[
|
| 913 |
-
10,
|
| 914 |
-
9,
|
| 915 |
-
5
|
| 916 |
-
]
|
| 917 |
-
],
|
| 918 |
-
[
|
| 919 |
-
[
|
| 920 |
-
21,
|
| 921 |
-
23,
|
| 922 |
-
12
|
| 923 |
-
],
|
| 924 |
-
[
|
| 925 |
-
10,
|
| 926 |
-
6,
|
| 927 |
-
5
|
| 928 |
-
]
|
| 929 |
-
],
|
| 930 |
-
[
|
| 931 |
-
[
|
| 932 |
-
22,
|
| 933 |
-
24,
|
| 934 |
-
34
|
| 935 |
-
],
|
| 936 |
-
[
|
| 937 |
-
11,
|
| 938 |
-
10,
|
| 939 |
-
6
|
| 940 |
-
]
|
| 941 |
-
],
|
| 942 |
-
[
|
| 943 |
-
[
|
| 944 |
-
23,
|
| 945 |
-
25,
|
| 946 |
-
14
|
| 947 |
-
],
|
| 948 |
-
[
|
| 949 |
-
11,
|
| 950 |
-
7,
|
| 951 |
-
6
|
| 952 |
-
]
|
| 953 |
-
],
|
| 954 |
-
[
|
| 955 |
-
[
|
| 956 |
-
24,
|
| 957 |
-
26,
|
| 958 |
-
36
|
| 959 |
-
],
|
| 960 |
-
[
|
| 961 |
-
12,
|
| 962 |
-
11,
|
| 963 |
-
7
|
| 964 |
-
]
|
| 965 |
-
],
|
| 966 |
-
[
|
| 967 |
-
[
|
| 968 |
-
25,
|
| 969 |
-
27,
|
| 970 |
-
16
|
| 971 |
-
],
|
| 972 |
-
[
|
| 973 |
-
12,
|
| 974 |
-
7
|
| 975 |
-
],
|
| 976 |
-
"O2"
|
| 977 |
-
],
|
| 978 |
-
[
|
| 979 |
-
[
|
| 980 |
-
26,
|
| 981 |
-
38
|
| 982 |
-
],
|
| 983 |
-
[
|
| 984 |
-
12
|
| 985 |
-
]
|
| 986 |
-
],
|
| 987 |
-
[
|
| 988 |
-
[
|
| 989 |
-
29,
|
| 990 |
-
17
|
| 991 |
-
],
|
| 992 |
-
[
|
| 993 |
-
8
|
| 994 |
-
],
|
| 995 |
-
"S2"
|
| 996 |
-
],
|
| 997 |
-
[
|
| 998 |
-
[
|
| 999 |
-
28,
|
| 1000 |
-
30,
|
| 1001 |
-
39
|
| 1002 |
-
],
|
| 1003 |
-
[
|
| 1004 |
-
13,
|
| 1005 |
-
8
|
| 1006 |
-
]
|
| 1007 |
-
],
|
| 1008 |
-
[
|
| 1009 |
-
[
|
| 1010 |
-
29,
|
| 1011 |
-
31,
|
| 1012 |
-
19
|
| 1013 |
-
],
|
| 1014 |
-
[
|
| 1015 |
-
13,
|
| 1016 |
-
9,
|
| 1017 |
-
8
|
| 1018 |
-
]
|
| 1019 |
-
],
|
| 1020 |
-
[
|
| 1021 |
-
[
|
| 1022 |
-
30,
|
| 1023 |
-
32,
|
| 1024 |
-
41
|
| 1025 |
-
],
|
| 1026 |
-
[
|
| 1027 |
-
14,
|
| 1028 |
-
13,
|
| 1029 |
-
9
|
| 1030 |
-
]
|
| 1031 |
-
],
|
| 1032 |
-
[
|
| 1033 |
-
[
|
| 1034 |
-
31,
|
| 1035 |
-
33,
|
| 1036 |
-
21
|
| 1037 |
-
],
|
| 1038 |
-
[
|
| 1039 |
-
14,
|
| 1040 |
-
10,
|
| 1041 |
-
9
|
| 1042 |
-
]
|
| 1043 |
-
],
|
| 1044 |
-
[
|
| 1045 |
-
[
|
| 1046 |
-
32,
|
| 1047 |
-
34,
|
| 1048 |
-
43
|
| 1049 |
-
],
|
| 1050 |
-
[
|
| 1051 |
-
15,
|
| 1052 |
-
14,
|
| 1053 |
-
10
|
| 1054 |
-
]
|
| 1055 |
-
],
|
| 1056 |
-
[
|
| 1057 |
-
[
|
| 1058 |
-
33,
|
| 1059 |
-
35,
|
| 1060 |
-
23
|
| 1061 |
-
],
|
| 1062 |
-
[
|
| 1063 |
-
15,
|
| 1064 |
-
11,
|
| 1065 |
-
10
|
| 1066 |
-
]
|
| 1067 |
-
],
|
| 1068 |
-
[
|
| 1069 |
-
[
|
| 1070 |
-
34,
|
| 1071 |
-
36,
|
| 1072 |
-
45
|
| 1073 |
-
],
|
| 1074 |
-
[
|
| 1075 |
-
16,
|
| 1076 |
-
15,
|
| 1077 |
-
11
|
| 1078 |
-
]
|
| 1079 |
-
],
|
| 1080 |
-
[
|
| 1081 |
-
[
|
| 1082 |
-
35,
|
| 1083 |
-
37,
|
| 1084 |
-
25
|
| 1085 |
-
],
|
| 1086 |
-
[
|
| 1087 |
-
16,
|
| 1088 |
-
12,
|
| 1089 |
-
11
|
| 1090 |
-
]
|
| 1091 |
-
],
|
| 1092 |
-
[
|
| 1093 |
-
[
|
| 1094 |
-
36,
|
| 1095 |
-
38,
|
| 1096 |
-
47
|
| 1097 |
-
],
|
| 1098 |
-
[
|
| 1099 |
-
16,
|
| 1100 |
-
12
|
| 1101 |
-
],
|
| 1102 |
-
"?3"
|
| 1103 |
-
],
|
| 1104 |
-
[
|
| 1105 |
-
[
|
| 1106 |
-
37,
|
| 1107 |
-
27
|
| 1108 |
-
],
|
| 1109 |
-
[
|
| 1110 |
-
12
|
| 1111 |
-
],
|
| 1112 |
-
"?3"
|
| 1113 |
-
],
|
| 1114 |
-
[
|
| 1115 |
-
[
|
| 1116 |
-
40,
|
| 1117 |
-
29
|
| 1118 |
-
],
|
| 1119 |
-
[
|
| 1120 |
-
13
|
| 1121 |
-
]
|
| 1122 |
-
],
|
| 1123 |
-
[
|
| 1124 |
-
[
|
| 1125 |
-
39,
|
| 1126 |
-
41,
|
| 1127 |
-
48
|
| 1128 |
-
],
|
| 1129 |
-
[
|
| 1130 |
-
17,
|
| 1131 |
-
13
|
| 1132 |
-
],
|
| 1133 |
-
"W2"
|
| 1134 |
-
],
|
| 1135 |
-
[
|
| 1136 |
-
[
|
| 1137 |
-
40,
|
| 1138 |
-
42,
|
| 1139 |
-
31
|
| 1140 |
-
],
|
| 1141 |
-
[
|
| 1142 |
-
17,
|
| 1143 |
-
14,
|
| 1144 |
-
13
|
| 1145 |
-
]
|
| 1146 |
-
],
|
| 1147 |
-
[
|
| 1148 |
-
[
|
| 1149 |
-
41,
|
| 1150 |
-
43,
|
| 1151 |
-
50
|
| 1152 |
-
],
|
| 1153 |
-
[
|
| 1154 |
-
18,
|
| 1155 |
-
17,
|
| 1156 |
-
14
|
| 1157 |
-
]
|
| 1158 |
-
],
|
| 1159 |
-
[
|
| 1160 |
-
[
|
| 1161 |
-
42,
|
| 1162 |
-
44,
|
| 1163 |
-
33
|
| 1164 |
-
],
|
| 1165 |
-
[
|
| 1166 |
-
18,
|
| 1167 |
-
15,
|
| 1168 |
-
14
|
| 1169 |
-
]
|
| 1170 |
-
],
|
| 1171 |
-
[
|
| 1172 |
-
[
|
| 1173 |
-
43,
|
| 1174 |
-
45,
|
| 1175 |
-
52
|
| 1176 |
-
],
|
| 1177 |
-
[
|
| 1178 |
-
19,
|
| 1179 |
-
18,
|
| 1180 |
-
15
|
| 1181 |
-
]
|
| 1182 |
-
],
|
| 1183 |
-
[
|
| 1184 |
-
[
|
| 1185 |
-
44,
|
| 1186 |
-
46,
|
| 1187 |
-
35
|
| 1188 |
-
],
|
| 1189 |
-
[
|
| 1190 |
-
19,
|
| 1191 |
-
16,
|
| 1192 |
-
15
|
| 1193 |
-
]
|
| 1194 |
-
],
|
| 1195 |
-
[
|
| 1196 |
-
[
|
| 1197 |
-
45,
|
| 1198 |
-
47,
|
| 1199 |
-
54
|
| 1200 |
-
],
|
| 1201 |
-
[
|
| 1202 |
-
19,
|
| 1203 |
-
16
|
| 1204 |
-
]
|
| 1205 |
-
],
|
| 1206 |
-
[
|
| 1207 |
-
[
|
| 1208 |
-
46,
|
| 1209 |
-
37
|
| 1210 |
-
],
|
| 1211 |
-
[
|
| 1212 |
-
16
|
| 1213 |
-
]
|
| 1214 |
-
],
|
| 1215 |
-
[
|
| 1216 |
-
[
|
| 1217 |
-
49,
|
| 1218 |
-
40
|
| 1219 |
-
],
|
| 1220 |
-
[
|
| 1221 |
-
17
|
| 1222 |
-
],
|
| 1223 |
-
"W2"
|
| 1224 |
-
],
|
| 1225 |
-
[
|
| 1226 |
-
[
|
| 1227 |
-
48,
|
| 1228 |
-
50
|
| 1229 |
-
],
|
| 1230 |
-
[
|
| 1231 |
-
17
|
| 1232 |
-
]
|
| 1233 |
-
],
|
| 1234 |
-
[
|
| 1235 |
-
[
|
| 1236 |
-
49,
|
| 1237 |
-
51,
|
| 1238 |
-
42
|
| 1239 |
-
],
|
| 1240 |
-
[
|
| 1241 |
-
18,
|
| 1242 |
-
17
|
| 1243 |
-
],
|
| 1244 |
-
"?3"
|
| 1245 |
-
],
|
| 1246 |
-
[
|
| 1247 |
-
[
|
| 1248 |
-
50,
|
| 1249 |
-
52
|
| 1250 |
-
],
|
| 1251 |
-
[
|
| 1252 |
-
18
|
| 1253 |
-
],
|
| 1254 |
-
"?3"
|
| 1255 |
-
],
|
| 1256 |
-
[
|
| 1257 |
-
[
|
| 1258 |
-
51,
|
| 1259 |
-
53,
|
| 1260 |
-
44
|
| 1261 |
-
],
|
| 1262 |
-
[
|
| 1263 |
-
19,
|
| 1264 |
-
18
|
| 1265 |
-
]
|
| 1266 |
-
],
|
| 1267 |
-
[
|
| 1268 |
-
[
|
| 1269 |
-
52,
|
| 1270 |
-
54
|
| 1271 |
-
],
|
| 1272 |
-
[
|
| 1273 |
-
19
|
| 1274 |
-
],
|
| 1275 |
-
"?3"
|
| 1276 |
-
],
|
| 1277 |
-
[
|
| 1278 |
-
[
|
| 1279 |
-
53,
|
| 1280 |
-
46
|
| 1281 |
-
],
|
| 1282 |
-
[
|
| 1283 |
-
19
|
| 1284 |
-
],
|
| 1285 |
-
"?3"
|
| 1286 |
-
]
|
| 1287 |
-
],
|
| 1288 |
-
"state": {
|
| 1289 |
-
"bld": [],
|
| 1290 |
-
"rds": []
|
| 1291 |
-
},
|
| 1292 |
-
"players": {
|
| 1293 |
-
"a": {
|
| 1294 |
-
"vp": 0,
|
| 1295 |
-
"res": {}
|
| 1296 |
-
},
|
| 1297 |
-
"b": {
|
| 1298 |
-
"vp": 0,
|
| 1299 |
-
"res": {}
|
| 1300 |
-
},
|
| 1301 |
-
"c": {
|
| 1302 |
-
"vp": 0,
|
| 1303 |
-
"res": {}
|
| 1304 |
-
}
|
| 1305 |
-
}
|
| 1306 |
-
},
|
| 1307 |
-
{
|
| 1308 |
-
"meta": {
|
| 1309 |
-
"curr": "a",
|
| 1310 |
-
"phase": "SETUP_FIRST_ROUND",
|
| 1311 |
-
"robber": 10,
|
| 1312 |
-
"dice": null
|
| 1313 |
-
},
|
| 1314 |
-
"H": [
|
| 1315 |
-
"",
|
| 1316 |
-
"W12",
|
| 1317 |
-
"S5",
|
| 1318 |
-
"W4",
|
| 1319 |
-
"S8",
|
| 1320 |
-
"B6",
|
| 1321 |
-
"W3",
|
| 1322 |
-
"Wh8",
|
| 1323 |
-
"B10",
|
| 1324 |
-
"W11",
|
| 1325 |
-
"D",
|
| 1326 |
-
"O3",
|
| 1327 |
-
"S4",
|
| 1328 |
-
"B10",
|
| 1329 |
-
"Wh9",
|
| 1330 |
-
"Wh6",
|
| 1331 |
-
"S11",
|
| 1332 |
-
"O5",
|
| 1333 |
-
"Wh9",
|
| 1334 |
-
"O2"
|
| 1335 |
-
],
|
| 1336 |
-
"N": [
|
| 1337 |
-
null,
|
| 1338 |
-
[
|
| 1339 |
-
[
|
| 1340 |
-
2,
|
| 1341 |
-
9
|
| 1342 |
-
],
|
| 1343 |
-
[
|
| 1344 |
-
1
|
| 1345 |
-
]
|
| 1346 |
-
],
|
| 1347 |
-
[
|
| 1348 |
-
[
|
| 1349 |
-
1,
|
| 1350 |
-
3
|
| 1351 |
-
],
|
| 1352 |
-
[
|
| 1353 |
-
1
|
| 1354 |
-
],
|
| 1355 |
-
"Wh2"
|
| 1356 |
-
],
|
| 1357 |
-
[
|
| 1358 |
-
[
|
| 1359 |
-
2,
|
| 1360 |
-
4,
|
| 1361 |
-
11
|
| 1362 |
-
],
|
| 1363 |
-
[
|
| 1364 |
-
2,
|
| 1365 |
-
1
|
| 1366 |
-
],
|
| 1367 |
-
"Wh2"
|
| 1368 |
-
],
|
| 1369 |
-
[
|
| 1370 |
-
[
|
| 1371 |
-
3,
|
| 1372 |
-
5
|
| 1373 |
-
],
|
| 1374 |
-
[
|
| 1375 |
-
2
|
| 1376 |
-
]
|
| 1377 |
-
],
|
| 1378 |
-
[
|
| 1379 |
-
[
|
| 1380 |
-
4,
|
| 1381 |
-
6,
|
| 1382 |
-
13
|
| 1383 |
-
],
|
| 1384 |
-
[
|
| 1385 |
-
3,
|
| 1386 |
-
2
|
| 1387 |
-
]
|
| 1388 |
-
],
|
| 1389 |
-
[
|
| 1390 |
-
[
|
| 1391 |
-
5,
|
| 1392 |
-
7
|
| 1393 |
-
],
|
| 1394 |
-
[
|
| 1395 |
-
3
|
| 1396 |
-
],
|
| 1397 |
-
"B2"
|
| 1398 |
-
],
|
| 1399 |
-
[
|
| 1400 |
-
[
|
| 1401 |
-
6,
|
| 1402 |
-
15
|
| 1403 |
-
],
|
| 1404 |
-
[
|
| 1405 |
-
3
|
| 1406 |
-
],
|
| 1407 |
-
"B2"
|
| 1408 |
-
],
|
| 1409 |
-
[
|
| 1410 |
-
[
|
| 1411 |
-
9,
|
| 1412 |
-
18
|
| 1413 |
-
],
|
| 1414 |
-
[
|
| 1415 |
-
4
|
| 1416 |
-
],
|
| 1417 |
-
"?3"
|
| 1418 |
-
],
|
| 1419 |
-
[
|
| 1420 |
-
[
|
| 1421 |
-
8,
|
| 1422 |
-
10,
|
| 1423 |
-
1
|
| 1424 |
-
],
|
| 1425 |
-
[
|
| 1426 |
-
4,
|
| 1427 |
-
1
|
| 1428 |
-
],
|
| 1429 |
-
"?3"
|
| 1430 |
-
],
|
| 1431 |
-
[
|
| 1432 |
-
[
|
| 1433 |
-
9,
|
| 1434 |
-
11,
|
| 1435 |
-
20
|
| 1436 |
-
],
|
| 1437 |
-
[
|
| 1438 |
-
5,
|
| 1439 |
-
4,
|
| 1440 |
-
1
|
| 1441 |
-
]
|
| 1442 |
-
],
|
| 1443 |
-
[
|
| 1444 |
-
[
|
| 1445 |
-
10,
|
| 1446 |
-
12,
|
| 1447 |
-
3
|
| 1448 |
-
],
|
| 1449 |
-
[
|
| 1450 |
-
5,
|
| 1451 |
-
2,
|
| 1452 |
-
1
|
| 1453 |
-
]
|
| 1454 |
-
],
|
| 1455 |
-
[
|
| 1456 |
-
[
|
| 1457 |
-
11,
|
| 1458 |
-
13,
|
| 1459 |
-
22
|
| 1460 |
-
],
|
| 1461 |
-
[
|
| 1462 |
-
6,
|
| 1463 |
-
5,
|
| 1464 |
-
2
|
| 1465 |
-
]
|
| 1466 |
-
],
|
| 1467 |
-
[
|
| 1468 |
-
[
|
| 1469 |
-
12,
|
| 1470 |
-
14,
|
| 1471 |
-
5
|
| 1472 |
-
],
|
| 1473 |
-
[
|
| 1474 |
-
6,
|
| 1475 |
-
3,
|
| 1476 |
-
2
|
| 1477 |
-
]
|
| 1478 |
-
],
|
| 1479 |
-
[
|
| 1480 |
-
[
|
| 1481 |
-
13,
|
| 1482 |
-
15,
|
| 1483 |
-
24
|
| 1484 |
-
],
|
| 1485 |
-
[
|
| 1486 |
-
7,
|
| 1487 |
-
6,
|
| 1488 |
-
3
|
| 1489 |
-
]
|
| 1490 |
-
],
|
| 1491 |
-
[
|
| 1492 |
-
[
|
| 1493 |
-
14,
|
| 1494 |
-
16,
|
| 1495 |
-
7
|
| 1496 |
-
],
|
| 1497 |
-
[
|
| 1498 |
-
7,
|
| 1499 |
-
3
|
| 1500 |
-
]
|
| 1501 |
-
],
|
| 1502 |
-
[
|
| 1503 |
-
[
|
| 1504 |
-
15,
|
| 1505 |
-
26
|
| 1506 |
-
],
|
| 1507 |
-
[
|
| 1508 |
-
7
|
| 1509 |
-
],
|
| 1510 |
-
"O2"
|
| 1511 |
-
],
|
| 1512 |
-
[
|
| 1513 |
-
[
|
| 1514 |
-
18,
|
| 1515 |
-
28
|
| 1516 |
-
],
|
| 1517 |
-
[
|
| 1518 |
-
8
|
| 1519 |
-
],
|
| 1520 |
-
"S2"
|
| 1521 |
-
],
|
| 1522 |
-
[
|
| 1523 |
-
[
|
| 1524 |
-
17,
|
| 1525 |
-
19,
|
| 1526 |
-
8
|
| 1527 |
-
],
|
| 1528 |
-
[
|
| 1529 |
-
8,
|
| 1530 |
-
4
|
| 1531 |
-
]
|
| 1532 |
-
],
|
| 1533 |
-
[
|
| 1534 |
-
[
|
| 1535 |
-
18,
|
| 1536 |
-
20,
|
| 1537 |
-
30
|
| 1538 |
-
],
|
| 1539 |
-
[
|
| 1540 |
-
9,
|
| 1541 |
-
8,
|
| 1542 |
-
4
|
| 1543 |
-
]
|
| 1544 |
-
],
|
| 1545 |
-
[
|
| 1546 |
-
[
|
| 1547 |
-
19,
|
| 1548 |
-
21,
|
| 1549 |
-
10
|
| 1550 |
-
],
|
| 1551 |
-
[
|
| 1552 |
-
9,
|
| 1553 |
-
5,
|
| 1554 |
-
4
|
| 1555 |
-
]
|
| 1556 |
-
],
|
| 1557 |
-
[
|
| 1558 |
-
[
|
| 1559 |
-
20,
|
| 1560 |
-
22,
|
| 1561 |
-
32
|
| 1562 |
-
],
|
| 1563 |
-
[
|
| 1564 |
-
10,
|
| 1565 |
-
9,
|
| 1566 |
-
5
|
| 1567 |
-
]
|
| 1568 |
-
],
|
| 1569 |
-
[
|
| 1570 |
-
[
|
| 1571 |
-
21,
|
| 1572 |
-
23,
|
| 1573 |
-
12
|
| 1574 |
-
],
|
| 1575 |
-
[
|
| 1576 |
-
10,
|
| 1577 |
-
6,
|
| 1578 |
-
5
|
| 1579 |
-
]
|
| 1580 |
-
],
|
| 1581 |
-
[
|
| 1582 |
-
[
|
| 1583 |
-
22,
|
| 1584 |
-
24,
|
| 1585 |
-
34
|
| 1586 |
-
],
|
| 1587 |
-
[
|
| 1588 |
-
11,
|
| 1589 |
-
10,
|
| 1590 |
-
6
|
| 1591 |
-
]
|
| 1592 |
-
],
|
| 1593 |
-
[
|
| 1594 |
-
[
|
| 1595 |
-
23,
|
| 1596 |
-
25,
|
| 1597 |
-
14
|
| 1598 |
-
],
|
| 1599 |
-
[
|
| 1600 |
-
11,
|
| 1601 |
-
7,
|
| 1602 |
-
6
|
| 1603 |
-
]
|
| 1604 |
-
],
|
| 1605 |
-
[
|
| 1606 |
-
[
|
| 1607 |
-
24,
|
| 1608 |
-
26,
|
| 1609 |
-
36
|
| 1610 |
-
],
|
| 1611 |
-
[
|
| 1612 |
-
12,
|
| 1613 |
-
11,
|
| 1614 |
-
7
|
| 1615 |
-
]
|
| 1616 |
-
],
|
| 1617 |
-
[
|
| 1618 |
-
[
|
| 1619 |
-
25,
|
| 1620 |
-
27,
|
| 1621 |
-
16
|
| 1622 |
-
],
|
| 1623 |
-
[
|
| 1624 |
-
12,
|
| 1625 |
-
7
|
| 1626 |
-
],
|
| 1627 |
-
"O2"
|
| 1628 |
-
],
|
| 1629 |
-
[
|
| 1630 |
-
[
|
| 1631 |
-
26,
|
| 1632 |
-
38
|
| 1633 |
-
],
|
| 1634 |
-
[
|
| 1635 |
-
12
|
| 1636 |
-
]
|
| 1637 |
-
],
|
| 1638 |
-
[
|
| 1639 |
-
[
|
| 1640 |
-
29,
|
| 1641 |
-
17
|
| 1642 |
-
],
|
| 1643 |
-
[
|
| 1644 |
-
8
|
| 1645 |
-
],
|
| 1646 |
-
"S2"
|
| 1647 |
-
],
|
| 1648 |
-
[
|
| 1649 |
-
[
|
| 1650 |
-
28,
|
| 1651 |
-
30,
|
| 1652 |
-
39
|
| 1653 |
-
],
|
| 1654 |
-
[
|
| 1655 |
-
13,
|
| 1656 |
-
8
|
| 1657 |
-
]
|
| 1658 |
-
],
|
| 1659 |
-
[
|
| 1660 |
-
[
|
| 1661 |
-
29,
|
| 1662 |
-
31,
|
| 1663 |
-
19
|
| 1664 |
-
],
|
| 1665 |
-
[
|
| 1666 |
-
13,
|
| 1667 |
-
9,
|
| 1668 |
-
8
|
| 1669 |
-
]
|
| 1670 |
-
],
|
| 1671 |
-
[
|
| 1672 |
-
[
|
| 1673 |
-
30,
|
| 1674 |
-
32,
|
| 1675 |
-
41
|
| 1676 |
-
],
|
| 1677 |
-
[
|
| 1678 |
-
14,
|
| 1679 |
-
13,
|
| 1680 |
-
9
|
| 1681 |
-
]
|
| 1682 |
-
],
|
| 1683 |
-
[
|
| 1684 |
-
[
|
| 1685 |
-
31,
|
| 1686 |
-
33,
|
| 1687 |
-
21
|
| 1688 |
-
],
|
| 1689 |
-
[
|
| 1690 |
-
14,
|
| 1691 |
-
10,
|
| 1692 |
-
9
|
| 1693 |
-
]
|
| 1694 |
-
],
|
| 1695 |
-
[
|
| 1696 |
-
[
|
| 1697 |
-
32,
|
| 1698 |
-
34,
|
| 1699 |
-
43
|
| 1700 |
-
],
|
| 1701 |
-
[
|
| 1702 |
-
15,
|
| 1703 |
-
14,
|
| 1704 |
-
10
|
| 1705 |
-
]
|
| 1706 |
-
],
|
| 1707 |
-
[
|
| 1708 |
-
[
|
| 1709 |
-
33,
|
| 1710 |
-
35,
|
| 1711 |
-
23
|
| 1712 |
-
],
|
| 1713 |
-
[
|
| 1714 |
-
15,
|
| 1715 |
-
11,
|
| 1716 |
-
10
|
| 1717 |
-
]
|
| 1718 |
-
],
|
| 1719 |
-
[
|
| 1720 |
-
[
|
| 1721 |
-
34,
|
| 1722 |
-
36,
|
| 1723 |
-
45
|
| 1724 |
-
],
|
| 1725 |
-
[
|
| 1726 |
-
16,
|
| 1727 |
-
15,
|
| 1728 |
-
11
|
| 1729 |
-
]
|
| 1730 |
-
],
|
| 1731 |
-
[
|
| 1732 |
-
[
|
| 1733 |
-
35,
|
| 1734 |
-
37,
|
| 1735 |
-
25
|
| 1736 |
-
],
|
| 1737 |
-
[
|
| 1738 |
-
16,
|
| 1739 |
-
12,
|
| 1740 |
-
11
|
| 1741 |
-
]
|
| 1742 |
-
],
|
| 1743 |
-
[
|
| 1744 |
-
[
|
| 1745 |
-
36,
|
| 1746 |
-
38,
|
| 1747 |
-
47
|
| 1748 |
-
],
|
| 1749 |
-
[
|
| 1750 |
-
16,
|
| 1751 |
-
12
|
| 1752 |
-
],
|
| 1753 |
-
"?3"
|
| 1754 |
-
],
|
| 1755 |
-
[
|
| 1756 |
-
[
|
| 1757 |
-
37,
|
| 1758 |
-
27
|
| 1759 |
-
],
|
| 1760 |
-
[
|
| 1761 |
-
12
|
| 1762 |
-
],
|
| 1763 |
-
"?3"
|
| 1764 |
-
],
|
| 1765 |
-
[
|
| 1766 |
-
[
|
| 1767 |
-
40,
|
| 1768 |
-
29
|
| 1769 |
-
],
|
| 1770 |
-
[
|
| 1771 |
-
13
|
| 1772 |
-
]
|
| 1773 |
-
],
|
| 1774 |
-
[
|
| 1775 |
-
[
|
| 1776 |
-
39,
|
| 1777 |
-
41,
|
| 1778 |
-
48
|
| 1779 |
-
],
|
| 1780 |
-
[
|
| 1781 |
-
17,
|
| 1782 |
-
13
|
| 1783 |
-
],
|
| 1784 |
-
"W2"
|
| 1785 |
-
],
|
| 1786 |
-
[
|
| 1787 |
-
[
|
| 1788 |
-
40,
|
| 1789 |
-
42,
|
| 1790 |
-
31
|
| 1791 |
-
],
|
| 1792 |
-
[
|
| 1793 |
-
17,
|
| 1794 |
-
14,
|
| 1795 |
-
13
|
| 1796 |
-
]
|
| 1797 |
-
],
|
| 1798 |
-
[
|
| 1799 |
-
[
|
| 1800 |
-
41,
|
| 1801 |
-
43,
|
| 1802 |
-
50
|
| 1803 |
-
],
|
| 1804 |
-
[
|
| 1805 |
-
18,
|
| 1806 |
-
17,
|
| 1807 |
-
14
|
| 1808 |
-
]
|
| 1809 |
-
],
|
| 1810 |
-
[
|
| 1811 |
-
[
|
| 1812 |
-
42,
|
| 1813 |
-
44,
|
| 1814 |
-
33
|
| 1815 |
-
],
|
| 1816 |
-
[
|
| 1817 |
-
18,
|
| 1818 |
-
15,
|
| 1819 |
-
14
|
| 1820 |
-
]
|
| 1821 |
-
],
|
| 1822 |
-
[
|
| 1823 |
-
[
|
| 1824 |
-
43,
|
| 1825 |
-
45,
|
| 1826 |
-
52
|
| 1827 |
-
],
|
| 1828 |
-
[
|
| 1829 |
-
19,
|
| 1830 |
-
18,
|
| 1831 |
-
15
|
| 1832 |
-
]
|
| 1833 |
-
],
|
| 1834 |
-
[
|
| 1835 |
-
[
|
| 1836 |
-
44,
|
| 1837 |
-
46,
|
| 1838 |
-
35
|
| 1839 |
-
],
|
| 1840 |
-
[
|
| 1841 |
-
19,
|
| 1842 |
-
16,
|
| 1843 |
-
15
|
| 1844 |
-
]
|
| 1845 |
-
],
|
| 1846 |
-
[
|
| 1847 |
-
[
|
| 1848 |
-
45,
|
| 1849 |
-
47,
|
| 1850 |
-
54
|
| 1851 |
-
],
|
| 1852 |
-
[
|
| 1853 |
-
19,
|
| 1854 |
-
16
|
| 1855 |
-
]
|
| 1856 |
-
],
|
| 1857 |
-
[
|
| 1858 |
-
[
|
| 1859 |
-
46,
|
| 1860 |
-
37
|
| 1861 |
-
],
|
| 1862 |
-
[
|
| 1863 |
-
16
|
| 1864 |
-
]
|
| 1865 |
-
],
|
| 1866 |
-
[
|
| 1867 |
-
[
|
| 1868 |
-
49,
|
| 1869 |
-
40
|
| 1870 |
-
],
|
| 1871 |
-
[
|
| 1872 |
-
17
|
| 1873 |
-
],
|
| 1874 |
-
"W2"
|
| 1875 |
-
],
|
| 1876 |
-
[
|
| 1877 |
-
[
|
| 1878 |
-
48,
|
| 1879 |
-
50
|
| 1880 |
-
],
|
| 1881 |
-
[
|
| 1882 |
-
17
|
| 1883 |
-
]
|
| 1884 |
-
],
|
| 1885 |
-
[
|
| 1886 |
-
[
|
| 1887 |
-
49,
|
| 1888 |
-
51,
|
| 1889 |
-
42
|
| 1890 |
-
],
|
| 1891 |
-
[
|
| 1892 |
-
18,
|
| 1893 |
-
17
|
| 1894 |
-
],
|
| 1895 |
-
"?3"
|
| 1896 |
-
],
|
| 1897 |
-
[
|
| 1898 |
-
[
|
| 1899 |
-
50,
|
| 1900 |
-
52
|
| 1901 |
-
],
|
| 1902 |
-
[
|
| 1903 |
-
18
|
| 1904 |
-
],
|
| 1905 |
-
"?3"
|
| 1906 |
-
],
|
| 1907 |
-
[
|
| 1908 |
-
[
|
| 1909 |
-
51,
|
| 1910 |
-
53,
|
| 1911 |
-
44
|
| 1912 |
-
],
|
| 1913 |
-
[
|
| 1914 |
-
19,
|
| 1915 |
-
18
|
| 1916 |
-
]
|
| 1917 |
-
],
|
| 1918 |
-
[
|
| 1919 |
-
[
|
| 1920 |
-
52,
|
| 1921 |
-
54
|
| 1922 |
-
],
|
| 1923 |
-
[
|
| 1924 |
-
19
|
| 1925 |
-
],
|
| 1926 |
-
"?3"
|
| 1927 |
-
],
|
| 1928 |
-
[
|
| 1929 |
-
[
|
| 1930 |
-
53,
|
| 1931 |
-
46
|
| 1932 |
-
],
|
| 1933 |
-
[
|
| 1934 |
-
19
|
| 1935 |
-
],
|
| 1936 |
-
"?3"
|
| 1937 |
-
]
|
| 1938 |
-
],
|
| 1939 |
-
"state": {
|
| 1940 |
-
"bld": [
|
| 1941 |
-
[
|
| 1942 |
-
20,
|
| 1943 |
-
"a",
|
| 1944 |
-
"S"
|
| 1945 |
-
]
|
| 1946 |
-
],
|
| 1947 |
-
"rds": []
|
| 1948 |
-
},
|
| 1949 |
-
"players": {
|
| 1950 |
-
"a": {
|
| 1951 |
-
"vp": 1,
|
| 1952 |
-
"res": {}
|
| 1953 |
-
},
|
| 1954 |
-
"b": {
|
| 1955 |
-
"vp": 0,
|
| 1956 |
-
"res": {}
|
| 1957 |
-
},
|
| 1958 |
-
"c": {
|
| 1959 |
-
"vp": 0,
|
| 1960 |
-
"res": {}
|
| 1961 |
-
}
|
| 1962 |
-
}
|
| 1963 |
-
}
|
| 1964 |
-
]
|
| 1965 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
examples/ai_testing/my_games/prompts/a
DELETED
|
@@ -1,106 +0,0 @@
|
|
| 1 |
-
================================================================================
|
| 2 |
-
AI AGENT PROMPT - PLAYER A
|
| 3 |
-
Generated: 2026-01-03 20:17:07
|
| 4 |
-
================================================================================
|
| 5 |
-
|
| 6 |
-
📋 RESPONSE SCHEMA (Expected LLM Output Format)
|
| 7 |
-
--------------------------------------------------------------------------------
|
| 8 |
-
{
|
| 9 |
-
"type": "object",
|
| 10 |
-
"required": [
|
| 11 |
-
"internal_thinking",
|
| 12 |
-
"action"
|
| 13 |
-
],
|
| 14 |
-
"properties": {
|
| 15 |
-
"internal_thinking": {
|
| 16 |
-
"type": "string",
|
| 17 |
-
"description": "Your private reasoning about the situation, strategy, and decision-making process. This is for you only.",
|
| 18 |
-
"minLength": 50
|
| 19 |
-
},
|
| 20 |
-
"note_to_self": {
|
| 21 |
-
"type": "string",
|
| 22 |
-
"description": "A note to remember for next turn. What are you waiting for? What's your plan?",
|
| 23 |
-
"examples": [
|
| 24 |
-
"Waiting for Red's response on trade",
|
| 25 |
-
"Focus on building toward ore port next",
|
| 26 |
-
"Watch Blue's progress on longest road"
|
| 27 |
-
]
|
| 28 |
-
},
|
| 29 |
-
"say_outloud": {
|
| 30 |
-
"type": "string",
|
| 31 |
-
"description": "What you want to say to other players (chat message). Use this for negotiation, threats, or table talk.",
|
| 32 |
-
"examples": [
|
| 33 |
-
"Anyone want to trade sheep for wood?",
|
| 34 |
-
"Red, can you give me 1 Brick for 2 Sheep?",
|
| 35 |
-
"I'm so behind, don't steal from me!"
|
| 36 |
-
]
|
| 37 |
-
},
|
| 38 |
-
"action": {
|
| 39 |
-
"type": "object",
|
| 40 |
-
"required": [
|
| 41 |
-
"type",
|
| 42 |
-
"parameters"
|
| 43 |
-
],
|
| 44 |
-
"properties": {
|
| 45 |
-
"type": {
|
| 46 |
-
"type": "string",
|
| 47 |
-
"description": "The action type (must match one from allowed_actions in constraints)",
|
| 48 |
-
"examples": [
|
| 49 |
-
"BUILD_SETTLEMENT",
|
| 50 |
-
"BUILD_ROAD",
|
| 51 |
-
"OFFER_TRADE",
|
| 52 |
-
"WAIT_FOR_RESPONSE",
|
| 53 |
-
"END_TURN"
|
| 54 |
-
]
|
| 55 |
-
},
|
| 56 |
-
"parameters": {
|
| 57 |
-
"type": "object",
|
| 58 |
-
"description": "Action-specific parameters (structure matches allowed_actions examples)"
|
| 59 |
-
}
|
| 60 |
-
}
|
| 61 |
-
}
|
| 62 |
-
},
|
| 63 |
-
"example": {
|
| 64 |
-
"internal_thinking": "I have 3 Sheep and 2 Wheat. I need Wood and Brick to build. I see Red asked for Sheep in the chat. My note says to trade with Red. I will offer him a deal verbally first to see if he accepts, before committing to a formal trade action. I won't pass turn yet.",
|
| 65 |
-
"note_to_self": "Waiting for Red's response. If he says yes, I will use OFFER_TRADE action next.",
|
| 66 |
-
"say_outloud": "Red, I have plenty of sheep. Can you give me 1 Wood and 1 Brick for 2 Sheep?",
|
| 67 |
-
"action": {
|
| 68 |
-
"type": "WAIT_FOR_RESPONSE",
|
| 69 |
-
"parameters": {}
|
| 70 |
-
}
|
| 71 |
-
}
|
| 72 |
-
}
|
| 73 |
-
|
| 74 |
-
================================================================================
|
| 75 |
-
📨 PROMPT TO SEND TO LLM
|
| 76 |
-
================================================================================
|
| 77 |
-
|
| 78 |
-
{
|
| 79 |
-
"meta_data": {
|
| 80 |
-
"agent_name": "a",
|
| 81 |
-
"my_color": "Red",
|
| 82 |
-
"role": "You are player 'a' (Red). Play strategically to win."
|
| 83 |
-
},
|
| 84 |
-
"task_context": {
|
| 85 |
-
"what_just_happened": "It's your turn in the setup phase. Place your first settlement.",
|
| 86 |
-
"instructions": "Analyze the game state and select the optimal move from 'allowed_actions'. Only one action is currently available."
|
| 87 |
-
},
|
| 88 |
-
"game_state": "\nFORMAT GUIDE:\n• H array: Index=HexID, Value=Resource+Number (W=Wood, B=Brick, S=Sheep, Wh=Wheat, O=Ore, D=Desert)\n• N array: Index=NodeID, Value=[[Neighbors], [HexIDs], Port?] where Port: ?3=Any(3:1), X2=Specific(2:1)\n• bld: [NodeID, Owner, Type] where Type: S=Settlement, C=City\n• rds: [[From, To], Owner]\n• Players res: {ResourceCode: Count}\n• Players dev: {\"h\": [Hidden], \"r\": [Revealed]} - Cards: K=Knight, M=Monopoly, Y=Year of Plenty, R=Road Building, V=Victory Point\n• Players stat: [\"LR\"=Longest Road, \"LA\"=Largest Army]\n\nGAME STATE:\n{\n \"meta\": {\n \"curr\": \"a\",\n \"phase\": \"SETUP_FIRST_ROUND\",\n \"robber\": 10,\n \"dice\": null\n },\n \"H\": [\n \"\",\n \"W12\",\n \"S5\",\n \"W4\",\n \"S8\",\n \"B6\",\n \"W3\",\n \"Wh8\",\n \"B10\",\n \"W11\",\n \"D\",\n \"O3\",\n \"S4\",\n \"B10\",\n \"Wh9\",\n \"Wh6\",\n \"S11\",\n \"O5\",\n \"Wh9\",\n \"O2\"\n ],\n \"N\": [\n null,\n [\n [\n 2,\n 9\n ],\n [\n 1\n ]\n ],\n [\n [\n 1,\n 3\n ],\n [\n 1\n ],\n \"Wh2\"\n ],\n [\n [\n 2,\n 4,\n 11\n ],\n [\n 2,\n 1\n ],\n \"Wh2\"\n ],\n [\n [\n 3,\n 5\n ],\n [\n 2\n ]\n ],\n [\n [\n 4,\n 6,\n 13\n ],\n [\n 3,\n 2\n ]\n ],\n [\n [\n 5,\n 7\n ],\n [\n 3\n ],\n \"B2\"\n ],\n [\n [\n 6,\n 15\n ],\n [\n 3\n ],\n \"B2\"\n ],\n [\n [\n 9,\n 18\n ],\n [\n 4\n ],\n \"?3\"\n ],\n [\n [\n 8,\n 10,\n 1\n ],\n [\n 4,\n 1\n ],\n \"?3\"\n ],\n [\n [\n 9,\n 11,\n 20\n ],\n [\n 5,\n 4,\n 1\n ]\n ],\n [\n [\n 10,\n 12,\n 3\n ],\n [\n 5,\n 2,\n 1\n ]\n ],\n [\n [\n 11,\n 13,\n 22\n ],\n [\n 6,\n 5,\n 2\n ]\n ],\n [\n [\n 12,\n 14,\n 5\n ],\n [\n 6,\n 3,\n 2\n ]\n ],\n [\n [\n 13,\n 15,\n 24\n ],\n [\n 7,\n 6,\n 3\n ]\n ],\n [\n [\n 14,\n 16,\n 7\n ],\n [\n 7,\n 3\n ]\n ],\n [\n [\n 15,\n 26\n ],\n [\n 7\n ],\n \"O2\"\n ],\n [\n [\n 18,\n 28\n ],\n [\n 8\n ],\n \"S2\"\n ],\n [\n [\n 17,\n 19,\n 8\n ],\n [\n 8,\n 4\n ]\n ],\n [\n [\n 18,\n 20,\n 30\n ],\n [\n 9,\n 8,\n 4\n ]\n ],\n [\n [\n 19,\n 21,\n 10\n ],\n [\n 9,\n 5,\n 4\n ]\n ],\n [\n [\n 20,\n 22,\n 32\n ],\n [\n 10,\n 9,\n 5\n ]\n ],\n [\n [\n 21,\n 23,\n 12\n ],\n [\n 10,\n 6,\n 5\n ]\n ],\n [\n [\n 22,\n 24,\n 34\n ],\n [\n 11,\n 10,\n 6\n ]\n ],\n [\n [\n 23,\n 25,\n 14\n ],\n [\n 11,\n 7,\n 6\n ]\n ],\n [\n [\n 24,\n 26,\n 36\n ],\n [\n 12,\n 11,\n 7\n ]\n ],\n [\n [\n 25,\n 27,\n 16\n ],\n [\n 12,\n 7\n ],\n \"O2\"\n ],\n [\n [\n 26,\n 38\n ],\n [\n 12\n ]\n ],\n [\n [\n 29,\n 17\n ],\n [\n 8\n ],\n \"S2\"\n ],\n [\n [\n 28,\n 30,\n 39\n ],\n [\n 13,\n 8\n ]\n ],\n [\n [\n 29,\n 31,\n 19\n ],\n [\n 13,\n 9,\n 8\n ]\n ],\n [\n [\n 30,\n 32,\n 41\n ],\n [\n 14,\n 13,\n 9\n ]\n ],\n [\n [\n 31,\n 33,\n 21\n ],\n [\n 14,\n 10,\n 9\n ]\n ],\n [\n [\n 32,\n 34,\n 43\n ],\n [\n 15,\n 14,\n 10\n ]\n ],\n [\n [\n 33,\n 35,\n 23\n ],\n [\n 15,\n 11,\n 10\n ]\n ],\n [\n [\n 34,\n 36,\n 45\n ],\n [\n 16,\n 15,\n 11\n ]\n ],\n [\n [\n 35,\n 37,\n 25\n ],\n [\n 16,\n 12,\n 11\n ]\n ],\n [\n [\n 36,\n 38,\n 47\n ],\n [\n 16,\n 12\n ],\n \"?3\"\n ],\n [\n [\n 37,\n 27\n ],\n [\n 12\n ],\n \"?3\"\n ],\n [\n [\n 40,\n 29\n ],\n [\n 13\n ]\n ],\n [\n [\n 39,\n 41,\n 48\n ],\n [\n 17,\n 13\n ],\n \"W2\"\n ],\n [\n [\n 40,\n 42,\n 31\n ],\n [\n 17,\n 14,\n 13\n ]\n ],\n [\n [\n 41,\n 43,\n 50\n ],\n [\n 18,\n 17,\n 14\n ]\n ],\n [\n [\n 42,\n 44,\n 33\n ],\n [\n 18,\n 15,\n 14\n ]\n ],\n [\n [\n 43,\n 45,\n 52\n ],\n [\n 19,\n 18,\n 15\n ]\n ],\n [\n [\n 44,\n 46,\n 35\n ],\n [\n 19,\n 16,\n 15\n ]\n ],\n [\n [\n 45,\n 47,\n 54\n ],\n [\n 19,\n 16\n ]\n ],\n [\n [\n 46,\n 37\n ],\n [\n 16\n ]\n ],\n [\n [\n 49,\n 40\n ],\n [\n 17\n ],\n \"W2\"\n ],\n [\n [\n 48,\n 50\n ],\n [\n 17\n ]\n ],\n [\n [\n 49,\n 51,\n 42\n ],\n [\n 18,\n 17\n ],\n \"?3\"\n ],\n [\n [\n 50,\n 52\n ],\n [\n 18\n ],\n \"?3\"\n ],\n [\n [\n 51,\n 53,\n 44\n ],\n [\n 19,\n 18\n ]\n ],\n [\n [\n 52,\n 54\n ],\n [\n 19\n ],\n \"?3\"\n ],\n [\n [\n 53,\n 46\n ],\n [\n 19\n ],\n \"?3\"\n ]\n ],\n \"state\": {\n \"bld\": [],\n \"rds\": []\n },\n \"players\": {\n \"a\": {\n \"vp\": 0,\n \"res\": {}\n },\n \"b\": {\n \"vp\": 0,\n \"res\": {}\n },\n \"c\": {\n \"vp\": 0,\n \"res\": {}\n }\n }\n}",
|
| 89 |
-
"constraints": {
|
| 90 |
-
"usage_instructions": "Choose one action type from the list below. Populate the 'parameters' field in your response strictly according to the 'example_parameters' structure provided.",
|
| 91 |
-
"allowed_actions": [
|
| 92 |
-
{
|
| 93 |
-
"action": "place_settlement",
|
| 94 |
-
"description": "Place your starting settlement on an available node",
|
| 95 |
-
"example_parameters": {
|
| 96 |
-
"node_id": 20,
|
| 97 |
-
"reasoning": "Good resource diversity and probability"
|
| 98 |
-
}
|
| 99 |
-
}
|
| 100 |
-
]
|
| 101 |
-
}
|
| 102 |
-
}
|
| 103 |
-
|
| 104 |
-
================================================================================
|
| 105 |
-
END OF PROMPT
|
| 106 |
-
================================================================================
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
examples/ai_testing/play_with_prompts.py
CHANGED
|
@@ -33,7 +33,13 @@ def prompt_generator_thread():
|
|
| 33 |
"""
|
| 34 |
state_file = Path('examples/ai_testing/my_games/current_state_optimized.txt')
|
| 35 |
full_state_file = Path('examples/ai_testing/my_games/current_state.json')
|
|
|
|
|
|
|
| 36 |
last_modified = 0
|
|
|
|
|
|
|
|
|
|
|
|
|
| 37 |
|
| 38 |
print("\n[🤖 Prompt Generator Active - will generate prompts on state changes]")
|
| 39 |
|
|
|
|
| 33 |
"""
|
| 34 |
state_file = Path('examples/ai_testing/my_games/current_state_optimized.txt')
|
| 35 |
full_state_file = Path('examples/ai_testing/my_games/current_state.json')
|
| 36 |
+
|
| 37 |
+
# Initialize with current file times to avoid triggering on old files
|
| 38 |
last_modified = 0
|
| 39 |
+
if state_file.exists():
|
| 40 |
+
last_modified = max(last_modified, state_file.stat().st_mtime)
|
| 41 |
+
if full_state_file.exists():
|
| 42 |
+
last_modified = max(last_modified, full_state_file.stat().st_mtime)
|
| 43 |
|
| 44 |
print("\n[🤖 Prompt Generator Active - will generate prompts on state changes]")
|
| 45 |
|
examples/ai_testing/sample_states/captured_game.json
CHANGED
|
@@ -115,13 +115,7 @@
|
|
| 115 |
"has_robber": false
|
| 116 |
}
|
| 117 |
],
|
| 118 |
-
"settlements": [
|
| 119 |
-
{
|
| 120 |
-
"id": "b_20",
|
| 121 |
-
"vertex": 20,
|
| 122 |
-
"player": 1
|
| 123 |
-
}
|
| 124 |
-
],
|
| 125 |
"cities": [],
|
| 126 |
"roads": [],
|
| 127 |
"harbors": [
|
|
@@ -192,12 +186,12 @@
|
|
| 192 |
"players": [
|
| 193 |
{
|
| 194 |
"id": 0,
|
| 195 |
-
"name": "
|
| 196 |
-
"victory_points":
|
| 197 |
"total_cards": 0,
|
| 198 |
"cards_list": [],
|
| 199 |
"dev_cards_list": [],
|
| 200 |
-
"settlements":
|
| 201 |
"cities": 0,
|
| 202 |
"roads": 0,
|
| 203 |
"longest_road": 0,
|
|
@@ -208,7 +202,7 @@
|
|
| 208 |
},
|
| 209 |
{
|
| 210 |
"id": 1,
|
| 211 |
-
"name": "
|
| 212 |
"victory_points": 0,
|
| 213 |
"total_cards": 0,
|
| 214 |
"cards_list": [],
|
|
@@ -224,7 +218,7 @@
|
|
| 224 |
},
|
| 225 |
{
|
| 226 |
"id": 2,
|
| 227 |
-
"name": "
|
| 228 |
"victory_points": 0,
|
| 229 |
"total_cards": 0,
|
| 230 |
"cards_list": [],
|
|
@@ -247,7 +241,7 @@
|
|
| 247 |
],
|
| 248 |
"dice_result": null,
|
| 249 |
"allowed_actions": [
|
| 250 |
-
"
|
| 251 |
],
|
| 252 |
"points": [
|
| 253 |
{
|
|
|
|
| 115 |
"has_robber": false
|
| 116 |
}
|
| 117 |
],
|
| 118 |
+
"settlements": [],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 119 |
"cities": [],
|
| 120 |
"roads": [],
|
| 121 |
"harbors": [
|
|
|
|
| 186 |
"players": [
|
| 187 |
{
|
| 188 |
"id": 0,
|
| 189 |
+
"name": "Hadar",
|
| 190 |
+
"victory_points": 0,
|
| 191 |
"total_cards": 0,
|
| 192 |
"cards_list": [],
|
| 193 |
"dev_cards_list": [],
|
| 194 |
+
"settlements": 0,
|
| 195 |
"cities": 0,
|
| 196 |
"roads": 0,
|
| 197 |
"longest_road": 0,
|
|
|
|
| 202 |
},
|
| 203 |
{
|
| 204 |
"id": 1,
|
| 205 |
+
"name": "Shon",
|
| 206 |
"victory_points": 0,
|
| 207 |
"total_cards": 0,
|
| 208 |
"cards_list": [],
|
|
|
|
| 218 |
},
|
| 219 |
{
|
| 220 |
"id": 2,
|
| 221 |
+
"name": "Diego",
|
| 222 |
"victory_points": 0,
|
| 223 |
"total_cards": 0,
|
| 224 |
"cards_list": [],
|
|
|
|
| 241 |
],
|
| 242 |
"dice_result": null,
|
| 243 |
"allowed_actions": [
|
| 244 |
+
"PLACE_STARTING_SETTLEMENT"
|
| 245 |
],
|
| 246 |
"points": [
|
| 247 |
{
|
examples/ai_testing/sample_states/captured_game_optimized.json
DELETED
|
@@ -1,7 +0,0 @@
|
|
| 1 |
-
{
|
| 2 |
-
"meta":{"curr":"b","phase":"SETUP_FIRST_ROUND","robber":10,"dice":null},
|
| 3 |
-
"H":["","W12","S5","W4","S8","B6","W3","Wh8","B10","W11","D","O3","S4","B10","Wh9","Wh6","S11","O5","Wh9","O2"],
|
| 4 |
-
"N":[null,[[2,9],[1]],[[1,3],[1],"Wh2"],[[2,4,11],[2,1],"Wh2"],[[3,5],[2]],[[4,6,13],[3,2]],[[5,7],[3],"B2"],[[6,15],[3],"B2"],[[9,18],[4],"?3"],[[8,10,1],[4,1],"?3"],[[9,11,20],[5,4,1]],[[10,12,3],[5,2,1]],[[11,13,22],[6,5,2]],[[12,14,5],[6,3,2]],[[13,15,24],[7,6,3]],[[14,16,7],[7,3]],[[15,26],[7],"O2"],[[18,28],[8],"S2"],[[17,19,8],[8,4]],[[18,20,30],[9,8,4]],[[19,21,10],[9,5,4]],[[20,22,32],[10,9,5]],[[21,23,12],[10,6,5]],[[22,24,34],[11,10,6]],[[23,25,14],[11,7,6]],[[24,26,36],[12,11,7]],[[25,27,16],[12,7],"O2"],[[26,38],[12]],[[29,17],[8],"S2"],[[28,30,39],[13,8]],[[29,31,19],[13,9,8]],[[30,32,41],[14,13,9]],[[31,33,21],[14,10,9]],[[32,34,43],[15,14,10]],[[33,35,23],[15,11,10]],[[34,36,45],[16,15,11]],[[35,37,25],[16,12,11]],[[36,38,47],[16,12],"?3"],[[37,27],[12],"?3"],[[40,29],[13]],[[39,41,48],[17,13],"W2"],[[40,42,31],[17,14,13]],[[41,43,50],[18,17,14]],[[42,44,33],[18,15,14]],[[43,45,52],[19,18,15]],[[44,46,35],[19,16,15]],[[45,47,54],[19,16]],[[46,37],[16]],[[49,40],[17],"W2"],[[48,50],[17]],[[49,51,42],[18,17],"?3"],[[50,52],[18],"?3"],[[51,53,44],[19,18]],[[52,54],[19],"?3"],[[53,46],[19],"?3"]],
|
| 5 |
-
"state":{"bld":[[20,"a","S"]],"rds":[[[20,21],"a"]]},
|
| 6 |
-
"players":{"a":{"vp":1,"res":{}},"b":{"vp":0,"res":{}},"c":{"vp":0,"res":{}}}
|
| 7 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
examples/ai_testing/sample_states/captured_game_optimized.txt
CHANGED
|
@@ -17,9 +17,9 @@
|
|
| 17 |
|
| 18 |
JSON:
|
| 19 |
{
|
| 20 |
-
"meta":{"curr":"
|
| 21 |
"H":["","W12","S5","W4","S8","B6","W3","Wh8","B10","W11","D","O3","S4","B10","Wh9","Wh6","S11","O5","Wh9","O2"],
|
| 22 |
"N":[null,[[2,9],[1]],[[1,3],[1],"Wh2"],[[2,4,11],[2,1],"Wh2"],[[3,5],[2]],[[4,6,13],[3,2]],[[5,7],[3],"B2"],[[6,15],[3],"B2"],[[9,18],[4],"?3"],[[8,10,1],[4,1],"?3"],[[9,11,20],[5,4,1]],[[10,12,3],[5,2,1]],[[11,13,22],[6,5,2]],[[12,14,5],[6,3,2]],[[13,15,24],[7,6,3]],[[14,16,7],[7,3]],[[15,26],[7],"O2"],[[18,28],[8],"S2"],[[17,19,8],[8,4]],[[18,20,30],[9,8,4]],[[19,21,10],[9,5,4]],[[20,22,32],[10,9,5]],[[21,23,12],[10,6,5]],[[22,24,34],[11,10,6]],[[23,25,14],[11,7,6]],[[24,26,36],[12,11,7]],[[25,27,16],[12,7],"O2"],[[26,38],[12]],[[29,17],[8],"S2"],[[28,30,39],[13,8]],[[29,31,19],[13,9,8]],[[30,32,41],[14,13,9]],[[31,33,21],[14,10,9]],[[32,34,43],[15,14,10]],[[33,35,23],[15,11,10]],[[34,36,45],[16,15,11]],[[35,37,25],[16,12,11]],[[36,38,47],[16,12],"?3"],[[37,27],[12],"?3"],[[40,29],[13]],[[39,41,48],[17,13],"W2"],[[40,42,31],[17,14,13]],[[41,43,50],[18,17,14]],[[42,44,33],[18,15,14]],[[43,45,52],[19,18,15]],[[44,46,35],[19,16,15]],[[45,47,54],[19,16]],[[46,37],[16]],[[49,40],[17],"W2"],[[48,50],[17]],[[49,51,42],[18,17],"?3"],[[50,52],[18],"?3"],[[51,53,44],[19,18]],[[52,54],[19],"?3"],[[53,46],[19],"?3"]],
|
| 23 |
-
"state":{"bld":[
|
| 24 |
-
"players":{"
|
| 25 |
}
|
|
|
|
| 17 |
|
| 18 |
JSON:
|
| 19 |
{
|
| 20 |
+
"meta":{"curr":"Hadar","phase":"SETUP_FIRST_ROUND","robber":10,"dice":null},
|
| 21 |
"H":["","W12","S5","W4","S8","B6","W3","Wh8","B10","W11","D","O3","S4","B10","Wh9","Wh6","S11","O5","Wh9","O2"],
|
| 22 |
"N":[null,[[2,9],[1]],[[1,3],[1],"Wh2"],[[2,4,11],[2,1],"Wh2"],[[3,5],[2]],[[4,6,13],[3,2]],[[5,7],[3],"B2"],[[6,15],[3],"B2"],[[9,18],[4],"?3"],[[8,10,1],[4,1],"?3"],[[9,11,20],[5,4,1]],[[10,12,3],[5,2,1]],[[11,13,22],[6,5,2]],[[12,14,5],[6,3,2]],[[13,15,24],[7,6,3]],[[14,16,7],[7,3]],[[15,26],[7],"O2"],[[18,28],[8],"S2"],[[17,19,8],[8,4]],[[18,20,30],[9,8,4]],[[19,21,10],[9,5,4]],[[20,22,32],[10,9,5]],[[21,23,12],[10,6,5]],[[22,24,34],[11,10,6]],[[23,25,14],[11,7,6]],[[24,26,36],[12,11,7]],[[25,27,16],[12,7],"O2"],[[26,38],[12]],[[29,17],[8],"S2"],[[28,30,39],[13,8]],[[29,31,19],[13,9,8]],[[30,32,41],[14,13,9]],[[31,33,21],[14,10,9]],[[32,34,43],[15,14,10]],[[33,35,23],[15,11,10]],[[34,36,45],[16,15,11]],[[35,37,25],[16,12,11]],[[36,38,47],[16,12],"?3"],[[37,27],[12],"?3"],[[40,29],[13]],[[39,41,48],[17,13],"W2"],[[40,42,31],[17,14,13]],[[41,43,50],[18,17,14]],[[42,44,33],[18,15,14]],[[43,45,52],[19,18,15]],[[44,46,35],[19,16,15]],[[45,47,54],[19,16]],[[46,37],[16]],[[49,40],[17],"W2"],[[48,50],[17]],[[49,51,42],[18,17],"?3"],[[50,52],[18],"?3"],[[51,53,44],[19,18]],[[52,54],[19],"?3"],[[53,46],[19],"?3"]],
|
| 23 |
+
"state":{"bld":[],"rds":[]},
|
| 24 |
+
"players":{"Hadar":{"vp":0,"res":{}},"Shon":{"vp":0,"res":{}},"Diego":{"vp":0,"res":{}}}
|
| 25 |
}
|
examples/ai_testing/templates/viewer.html
ADDED
|
@@ -0,0 +1,642 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>🎮 AI Catan Viewer</title>
|
| 7 |
+
<style>
|
| 8 |
+
* {
|
| 9 |
+
margin: 0;
|
| 10 |
+
padding: 0;
|
| 11 |
+
box-sizing: border-box;
|
| 12 |
+
}
|
| 13 |
+
|
| 14 |
+
body {
|
| 15 |
+
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
|
| 16 |
+
background: #1e1e1e;
|
| 17 |
+
color: #d4d4d4;
|
| 18 |
+
height: 100vh;
|
| 19 |
+
overflow: hidden;
|
| 20 |
+
}
|
| 21 |
+
|
| 22 |
+
.container {
|
| 23 |
+
display: flex;
|
| 24 |
+
height: 100vh;
|
| 25 |
+
}
|
| 26 |
+
|
| 27 |
+
/* Sidebar */
|
| 28 |
+
.sidebar {
|
| 29 |
+
width: 280px;
|
| 30 |
+
background: #252526;
|
| 31 |
+
border-right: 1px solid #3e3e42;
|
| 32 |
+
display: flex;
|
| 33 |
+
flex-direction: column;
|
| 34 |
+
overflow-y: auto;
|
| 35 |
+
}
|
| 36 |
+
|
| 37 |
+
.sidebar-header {
|
| 38 |
+
padding: 20px;
|
| 39 |
+
background: #007acc;
|
| 40 |
+
color: white;
|
| 41 |
+
font-weight: bold;
|
| 42 |
+
font-size: 18px;
|
| 43 |
+
}
|
| 44 |
+
|
| 45 |
+
.sidebar-section {
|
| 46 |
+
padding: 15px;
|
| 47 |
+
border-bottom: 1px solid #3e3e42;
|
| 48 |
+
}
|
| 49 |
+
|
| 50 |
+
.sidebar-section h3 {
|
| 51 |
+
font-size: 12px;
|
| 52 |
+
color: #858585;
|
| 53 |
+
text-transform: uppercase;
|
| 54 |
+
margin-bottom: 10px;
|
| 55 |
+
font-weight: 600;
|
| 56 |
+
}
|
| 57 |
+
|
| 58 |
+
.nav-item {
|
| 59 |
+
padding: 10px 15px;
|
| 60 |
+
margin: 5px 0;
|
| 61 |
+
border-radius: 5px;
|
| 62 |
+
cursor: pointer;
|
| 63 |
+
transition: all 0.2s;
|
| 64 |
+
display: flex;
|
| 65 |
+
align-items: center;
|
| 66 |
+
gap: 10px;
|
| 67 |
+
}
|
| 68 |
+
|
| 69 |
+
.nav-item:hover {
|
| 70 |
+
background: #2a2d2e;
|
| 71 |
+
}
|
| 72 |
+
|
| 73 |
+
.nav-item.active {
|
| 74 |
+
background: #37373d;
|
| 75 |
+
border-left: 3px solid #007acc;
|
| 76 |
+
}
|
| 77 |
+
|
| 78 |
+
.nav-item .icon {
|
| 79 |
+
font-size: 18px;
|
| 80 |
+
}
|
| 81 |
+
|
| 82 |
+
.nav-item .badge {
|
| 83 |
+
margin-left: auto;
|
| 84 |
+
background: #007acc;
|
| 85 |
+
padding: 2px 8px;
|
| 86 |
+
border-radius: 10px;
|
| 87 |
+
font-size: 11px;
|
| 88 |
+
}
|
| 89 |
+
|
| 90 |
+
/* Main content */
|
| 91 |
+
.content {
|
| 92 |
+
flex: 1;
|
| 93 |
+
display: flex;
|
| 94 |
+
flex-direction: column;
|
| 95 |
+
overflow: hidden;
|
| 96 |
+
}
|
| 97 |
+
|
| 98 |
+
.content-header {
|
| 99 |
+
padding: 20px;
|
| 100 |
+
background: #2d2d30;
|
| 101 |
+
border-bottom: 1px solid #3e3e42;
|
| 102 |
+
display: flex;
|
| 103 |
+
justify-content: space-between;
|
| 104 |
+
align-items: center;
|
| 105 |
+
}
|
| 106 |
+
|
| 107 |
+
.content-header h1 {
|
| 108 |
+
font-size: 24px;
|
| 109 |
+
color: #cccccc;
|
| 110 |
+
}
|
| 111 |
+
|
| 112 |
+
.status-badge {
|
| 113 |
+
padding: 8px 16px;
|
| 114 |
+
border-radius: 20px;
|
| 115 |
+
font-size: 12px;
|
| 116 |
+
font-weight: bold;
|
| 117 |
+
display: flex;
|
| 118 |
+
align-items: center;
|
| 119 |
+
gap: 8px;
|
| 120 |
+
}
|
| 121 |
+
|
| 122 |
+
.status-badge.live {
|
| 123 |
+
background: #0e8a0e;
|
| 124 |
+
color: white;
|
| 125 |
+
}
|
| 126 |
+
|
| 127 |
+
.status-badge .pulse {
|
| 128 |
+
width: 8px;
|
| 129 |
+
height: 8px;
|
| 130 |
+
background: white;
|
| 131 |
+
border-radius: 50%;
|
| 132 |
+
animation: pulse 2s infinite;
|
| 133 |
+
}
|
| 134 |
+
|
| 135 |
+
@keyframes pulse {
|
| 136 |
+
0%, 100% { opacity: 1; }
|
| 137 |
+
50% { opacity: 0.3; }
|
| 138 |
+
}
|
| 139 |
+
|
| 140 |
+
.content-body {
|
| 141 |
+
flex: 1;
|
| 142 |
+
overflow-y: auto;
|
| 143 |
+
padding: 20px;
|
| 144 |
+
}
|
| 145 |
+
|
| 146 |
+
/* Player log view - Beautiful markdown rendering */
|
| 147 |
+
.player-log {
|
| 148 |
+
background: #1e1e1e;
|
| 149 |
+
border: 1px solid #3e3e42;
|
| 150 |
+
border-radius: 8px;
|
| 151 |
+
padding: 30px;
|
| 152 |
+
margin-bottom: 20px;
|
| 153 |
+
color: #d4d4d4;
|
| 154 |
+
line-height: 1.8;
|
| 155 |
+
max-width: 1200px;
|
| 156 |
+
}
|
| 157 |
+
|
| 158 |
+
.player-log h1 {
|
| 159 |
+
color: #4ec9b0;
|
| 160 |
+
border-bottom: 3px solid #007acc;
|
| 161 |
+
padding-bottom: 15px;
|
| 162 |
+
margin-bottom: 25px;
|
| 163 |
+
font-size: 28px;
|
| 164 |
+
}
|
| 165 |
+
|
| 166 |
+
.player-log h2 {
|
| 167 |
+
color: #4fc1ff;
|
| 168 |
+
margin-top: 35px;
|
| 169 |
+
margin-bottom: 18px;
|
| 170 |
+
font-size: 22px;
|
| 171 |
+
padding-left: 10px;
|
| 172 |
+
border-left: 4px solid #007acc;
|
| 173 |
+
}
|
| 174 |
+
|
| 175 |
+
.player-log h3 {
|
| 176 |
+
color: #ce9178;
|
| 177 |
+
margin-top: 25px;
|
| 178 |
+
margin-bottom: 12px;
|
| 179 |
+
font-size: 18px;
|
| 180 |
+
}
|
| 181 |
+
|
| 182 |
+
.player-log hr {
|
| 183 |
+
border: none;
|
| 184 |
+
border-top: 2px solid #3e3e42;
|
| 185 |
+
margin: 30px 0;
|
| 186 |
+
}
|
| 187 |
+
|
| 188 |
+
.player-log p {
|
| 189 |
+
margin-bottom: 15px;
|
| 190 |
+
}
|
| 191 |
+
|
| 192 |
+
.player-log pre {
|
| 193 |
+
background: #2d2d30;
|
| 194 |
+
padding: 20px;
|
| 195 |
+
border-radius: 8px;
|
| 196 |
+
overflow-x: auto;
|
| 197 |
+
font-size: 13px;
|
| 198 |
+
line-height: 1.6;
|
| 199 |
+
border-left: 4px solid #007acc;
|
| 200 |
+
margin: 20px 0;
|
| 201 |
+
}
|
| 202 |
+
|
| 203 |
+
.player-log code {
|
| 204 |
+
font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
|
| 205 |
+
background: #2d2d30;
|
| 206 |
+
padding: 3px 8px;
|
| 207 |
+
border-radius: 4px;
|
| 208 |
+
color: #ce9178;
|
| 209 |
+
font-size: 13px;
|
| 210 |
+
}
|
| 211 |
+
|
| 212 |
+
.player-log pre code {
|
| 213 |
+
background: transparent;
|
| 214 |
+
padding: 0;
|
| 215 |
+
color: #d4d4d4;
|
| 216 |
+
}
|
| 217 |
+
|
| 218 |
+
.player-log strong {
|
| 219 |
+
color: #4ec9b0;
|
| 220 |
+
font-weight: 600;
|
| 221 |
+
}
|
| 222 |
+
|
| 223 |
+
.player-log em {
|
| 224 |
+
color: #ce9178;
|
| 225 |
+
font-style: italic;
|
| 226 |
+
}
|
| 227 |
+
|
| 228 |
+
.player-log ul, .player-log ol {
|
| 229 |
+
margin-left: 25px;
|
| 230 |
+
margin-bottom: 18px;
|
| 231 |
+
}
|
| 232 |
+
|
| 233 |
+
.player-log li {
|
| 234 |
+
margin-bottom: 10px;
|
| 235 |
+
}
|
| 236 |
+
|
| 237 |
+
.player-log details {
|
| 238 |
+
background: #252526;
|
| 239 |
+
border: 1px solid #3e3e42;
|
| 240 |
+
border-radius: 6px;
|
| 241 |
+
padding: 15px;
|
| 242 |
+
margin: 20px 0;
|
| 243 |
+
}
|
| 244 |
+
|
| 245 |
+
.player-log summary {
|
| 246 |
+
cursor: pointer;
|
| 247 |
+
font-weight: bold;
|
| 248 |
+
color: #4fc1ff;
|
| 249 |
+
padding: 8px;
|
| 250 |
+
user-select: none;
|
| 251 |
+
}
|
| 252 |
+
|
| 253 |
+
.player-log summary:hover {
|
| 254 |
+
color: #9cdcfe;
|
| 255 |
+
background: #2a2d2e;
|
| 256 |
+
border-radius: 4px;
|
| 257 |
+
}
|
| 258 |
+
|
| 259 |
+
.player-log details[open] summary {
|
| 260 |
+
margin-bottom: 15px;
|
| 261 |
+
}
|
| 262 |
+
|
| 263 |
+
/* Chat view */
|
| 264 |
+
.chat-container {
|
| 265 |
+
background: #1e1e1e;
|
| 266 |
+
border: 1px solid #3e3e42;
|
| 267 |
+
border-radius: 8px;
|
| 268 |
+
padding: 20px;
|
| 269 |
+
max-width: 900px;
|
| 270 |
+
}
|
| 271 |
+
|
| 272 |
+
.chat-message {
|
| 273 |
+
padding: 15px;
|
| 274 |
+
margin: 10px 0;
|
| 275 |
+
border-radius: 8px;
|
| 276 |
+
background: #2d2d30;
|
| 277 |
+
border-left: 4px solid #007acc;
|
| 278 |
+
}
|
| 279 |
+
|
| 280 |
+
.chat-message .meta {
|
| 281 |
+
display: flex;
|
| 282 |
+
justify-content: space-between;
|
| 283 |
+
margin-bottom: 10px;
|
| 284 |
+
font-size: 12px;
|
| 285 |
+
color: #858585;
|
| 286 |
+
}
|
| 287 |
+
|
| 288 |
+
.chat-message .player {
|
| 289 |
+
font-weight: bold;
|
| 290 |
+
color: #4ec9b0;
|
| 291 |
+
}
|
| 292 |
+
|
| 293 |
+
.chat-message .text {
|
| 294 |
+
color: #d4d4d4;
|
| 295 |
+
font-size: 14px;
|
| 296 |
+
}
|
| 297 |
+
|
| 298 |
+
/* Memories view */
|
| 299 |
+
.memory-card {
|
| 300 |
+
background: #2d2d30;
|
| 301 |
+
border: 1px solid #3e3e42;
|
| 302 |
+
border-radius: 8px;
|
| 303 |
+
padding: 20px;
|
| 304 |
+
margin-bottom: 18px;
|
| 305 |
+
max-width: 900px;
|
| 306 |
+
}
|
| 307 |
+
|
| 308 |
+
.memory-card .player-name {
|
| 309 |
+
font-size: 18px;
|
| 310 |
+
font-weight: bold;
|
| 311 |
+
color: #4ec9b0;
|
| 312 |
+
margin-bottom: 12px;
|
| 313 |
+
}
|
| 314 |
+
|
| 315 |
+
.memory-card .memory-text {
|
| 316 |
+
color: #d4d4d4;
|
| 317 |
+
font-style: italic;
|
| 318 |
+
line-height: 1.6;
|
| 319 |
+
}
|
| 320 |
+
|
| 321 |
+
/* Loading spinner */
|
| 322 |
+
.loading {
|
| 323 |
+
display: flex;
|
| 324 |
+
justify-content: center;
|
| 325 |
+
align-items: center;
|
| 326 |
+
padding: 40px;
|
| 327 |
+
}
|
| 328 |
+
|
| 329 |
+
.spinner {
|
| 330 |
+
width: 40px;
|
| 331 |
+
height: 40px;
|
| 332 |
+
border: 4px solid #3e3e42;
|
| 333 |
+
border-top-color: #007acc;
|
| 334 |
+
border-radius: 50%;
|
| 335 |
+
animation: spin 1s linear infinite;
|
| 336 |
+
}
|
| 337 |
+
|
| 338 |
+
@keyframes spin {
|
| 339 |
+
to { transform: rotate(360deg); }
|
| 340 |
+
}
|
| 341 |
+
|
| 342 |
+
/* Empty state */
|
| 343 |
+
.empty-state {
|
| 344 |
+
text-align: center;
|
| 345 |
+
padding: 60px 20px;
|
| 346 |
+
color: #858585;
|
| 347 |
+
}
|
| 348 |
+
|
| 349 |
+
.empty-state .icon {
|
| 350 |
+
font-size: 48px;
|
| 351 |
+
margin-bottom: 20px;
|
| 352 |
+
}
|
| 353 |
+
|
| 354 |
+
/* Scrollbar styling */
|
| 355 |
+
::-webkit-scrollbar {
|
| 356 |
+
width: 12px;
|
| 357 |
+
height: 12px;
|
| 358 |
+
}
|
| 359 |
+
|
| 360 |
+
::-webkit-scrollbar-track {
|
| 361 |
+
background: #1e1e1e;
|
| 362 |
+
}
|
| 363 |
+
|
| 364 |
+
::-webkit-scrollbar-thumb {
|
| 365 |
+
background: #424242;
|
| 366 |
+
border-radius: 6px;
|
| 367 |
+
}
|
| 368 |
+
|
| 369 |
+
::-webkit-scrollbar-thumb:hover {
|
| 370 |
+
background: #4e4e4e;
|
| 371 |
+
}
|
| 372 |
+
</style>
|
| 373 |
+
</head>
|
| 374 |
+
<body>
|
| 375 |
+
<div class="container">
|
| 376 |
+
<!-- Sidebar -->
|
| 377 |
+
<div class="sidebar">
|
| 378 |
+
<div class="sidebar-header">
|
| 379 |
+
🎮 AI Catan Viewer
|
| 380 |
+
</div>
|
| 381 |
+
|
| 382 |
+
<div class="sidebar-section">
|
| 383 |
+
<h3>Players</h3>
|
| 384 |
+
<div id="players-nav"></div>
|
| 385 |
+
</div>
|
| 386 |
+
|
| 387 |
+
<div class="sidebar-section">
|
| 388 |
+
<h3>Views</h3>
|
| 389 |
+
<div class="nav-item" onclick="showView('chat')">
|
| 390 |
+
<span class="icon">💬</span>
|
| 391 |
+
<span>Chat History</span>
|
| 392 |
+
<span class="badge" id="chat-count">0</span>
|
| 393 |
+
</div>
|
| 394 |
+
<div class="nav-item" onclick="showView('memories')">
|
| 395 |
+
<span class="icon">📝</span>
|
| 396 |
+
<span>Agent Memories</span>
|
| 397 |
+
</div>
|
| 398 |
+
</div>
|
| 399 |
+
|
| 400 |
+
<div class="sidebar-section">
|
| 401 |
+
<h3>Session</h3>
|
| 402 |
+
<div id="session-info" style="font-size: 12px; color: #858585;"></div>
|
| 403 |
+
</div>
|
| 404 |
+
</div>
|
| 405 |
+
|
| 406 |
+
<!-- Main content -->
|
| 407 |
+
<div class="content">
|
| 408 |
+
<div class="content-header">
|
| 409 |
+
<h1 id="content-title">Loading...</h1>
|
| 410 |
+
<div class="status-badge live">
|
| 411 |
+
<div class="pulse"></div>
|
| 412 |
+
<span>LIVE</span>
|
| 413 |
+
</div>
|
| 414 |
+
</div>
|
| 415 |
+
|
| 416 |
+
<div class="content-body" id="content-body">
|
| 417 |
+
<div class="loading">
|
| 418 |
+
<div class="spinner"></div>
|
| 419 |
+
</div>
|
| 420 |
+
</div>
|
| 421 |
+
</div>
|
| 422 |
+
</div>
|
| 423 |
+
|
| 424 |
+
<script>
|
| 425 |
+
let currentView = null;
|
| 426 |
+
let currentPlayer = null;
|
| 427 |
+
let sessionData = null;
|
| 428 |
+
|
| 429 |
+
// Load data every second
|
| 430 |
+
async function loadData() {
|
| 431 |
+
try {
|
| 432 |
+
const response = await fetch('/api/current');
|
| 433 |
+
if (!response.ok) {
|
| 434 |
+
throw new Error('No active session');
|
| 435 |
+
}
|
| 436 |
+
|
| 437 |
+
sessionData = await response.json();
|
| 438 |
+
updateUI();
|
| 439 |
+
} catch (error) {
|
| 440 |
+
showEmptyState('No active game session', 'Start a game to see data here');
|
| 441 |
+
}
|
| 442 |
+
}
|
| 443 |
+
|
| 444 |
+
function updateUI() {
|
| 445 |
+
if (!sessionData) return;
|
| 446 |
+
|
| 447 |
+
// Update session info
|
| 448 |
+
document.getElementById('session-info').innerHTML = `
|
| 449 |
+
<strong>${sessionData.session_name}</strong><br>
|
| 450 |
+
Players: ${Object.keys(sessionData.players).length}<br>
|
| 451 |
+
Messages: ${sessionData.chat.length}
|
| 452 |
+
`;
|
| 453 |
+
|
| 454 |
+
// Update players nav
|
| 455 |
+
const playersNav = document.getElementById('players-nav');
|
| 456 |
+
playersNav.innerHTML = '';
|
| 457 |
+
|
| 458 |
+
Object.keys(sessionData.players).sort().forEach(player => {
|
| 459 |
+
const item = document.createElement('div');
|
| 460 |
+
item.className = 'nav-item' + (currentPlayer === player ? ' active' : '');
|
| 461 |
+
item.onclick = () => showPlayer(player);
|
| 462 |
+
item.innerHTML = `
|
| 463 |
+
<span class="icon">🤖</span>
|
| 464 |
+
<span>Player ${player}</span>
|
| 465 |
+
`;
|
| 466 |
+
playersNav.appendChild(item);
|
| 467 |
+
});
|
| 468 |
+
|
| 469 |
+
// Update chat count
|
| 470 |
+
document.getElementById('chat-count').textContent = sessionData.chat.length;
|
| 471 |
+
|
| 472 |
+
// Show default view if none selected
|
| 473 |
+
if (!currentView && Object.keys(sessionData.players).length > 0) {
|
| 474 |
+
showPlayer(Object.keys(sessionData.players).sort()[0]);
|
| 475 |
+
}
|
| 476 |
+
}
|
| 477 |
+
|
| 478 |
+
function renderMarkdown(text) {
|
| 479 |
+
// Simple markdown rendering for better display
|
| 480 |
+
let html = escapeHtml(text);
|
| 481 |
+
|
| 482 |
+
// Code blocks (must be before inline code)
|
| 483 |
+
html = html.replace(/```(\w*)\n([\s\S]*?)```/g, '<pre><code>$2</code></pre>');
|
| 484 |
+
|
| 485 |
+
// Headers
|
| 486 |
+
html = html.replace(/^### (.+)$/gm, '<h3>$1</h3>');
|
| 487 |
+
html = html.replace(/^## (.+)$/gm, '<h2>$1</h2>');
|
| 488 |
+
html = html.replace(/^# (.+)$/gm, '<h1>$1</h1>');
|
| 489 |
+
|
| 490 |
+
// Horizontal rules
|
| 491 |
+
html = html.replace(/^---+$/gm, '<hr>');
|
| 492 |
+
|
| 493 |
+
// Bold
|
| 494 |
+
html = html.replace(/\*\*(.+?)\*\*/g, '<strong>$1</strong>');
|
| 495 |
+
|
| 496 |
+
// Italic
|
| 497 |
+
html = html.replace(/\*(.+?)\*/g, '<em>$1</em>');
|
| 498 |
+
|
| 499 |
+
// Inline code
|
| 500 |
+
html = html.replace(/`([^`]+)`/g, '<code>$1</code>');
|
| 501 |
+
|
| 502 |
+
// Details/Summary
|
| 503 |
+
html = html.replace(/<details>/g, '<details>');
|
| 504 |
+
html = html.replace(/<\/details>/g, '</details>');
|
| 505 |
+
html = html.replace(/<summary>(.+?)<\/summary>/g, '<summary>$1</summary>');
|
| 506 |
+
|
| 507 |
+
// Paragraphs
|
| 508 |
+
html = html.replace(/\n\n/g, '</p><p>');
|
| 509 |
+
html = '<p>' + html + '</p>';
|
| 510 |
+
|
| 511 |
+
// Clean up empty paragraphs
|
| 512 |
+
html = html.replace(/<p><\/p>/g, '');
|
| 513 |
+
html = html.replace(/<p>\s*<(h[123]|hr|pre|details)/g, '<$1');
|
| 514 |
+
html = html.replace(/<\/(h[123]|hr|pre|details)>\s*<\/p>/g, '</$1>');
|
| 515 |
+
|
| 516 |
+
return html;
|
| 517 |
+
}
|
| 518 |
+
|
| 519 |
+
function showPlayer(player) {
|
| 520 |
+
currentView = 'player';
|
| 521 |
+
currentPlayer = player;
|
| 522 |
+
updateActiveNav();
|
| 523 |
+
|
| 524 |
+
const playerData = sessionData.players[player];
|
| 525 |
+
if (!playerData) return;
|
| 526 |
+
|
| 527 |
+
document.getElementById('content-title').textContent = `Player ${player} - AI Log`;
|
| 528 |
+
const renderedContent = renderMarkdown(playerData.content);
|
| 529 |
+
document.getElementById('content-body').innerHTML = `
|
| 530 |
+
<div class="player-log">
|
| 531 |
+
${renderedContent}
|
| 532 |
+
</div>
|
| 533 |
+
`;
|
| 534 |
+
}
|
| 535 |
+
|
| 536 |
+
function showView(view) {
|
| 537 |
+
currentView = view;
|
| 538 |
+
currentPlayer = null;
|
| 539 |
+
updateActiveNav();
|
| 540 |
+
|
| 541 |
+
if (view === 'chat') {
|
| 542 |
+
showChat();
|
| 543 |
+
} else if (view === 'memories') {
|
| 544 |
+
showMemories();
|
| 545 |
+
}
|
| 546 |
+
}
|
| 547 |
+
|
| 548 |
+
function showChat() {
|
| 549 |
+
document.getElementById('content-title').textContent = 'Chat History';
|
| 550 |
+
|
| 551 |
+
if (sessionData.chat.length === 0) {
|
| 552 |
+
document.getElementById('content-body').innerHTML = `
|
| 553 |
+
<div class="empty-state">
|
| 554 |
+
<div class="icon">💬</div>
|
| 555 |
+
<h3>No messages yet</h3>
|
| 556 |
+
<p>Chat messages will appear here when players communicate</p>
|
| 557 |
+
</div>
|
| 558 |
+
`;
|
| 559 |
+
return;
|
| 560 |
+
}
|
| 561 |
+
|
| 562 |
+
const chatHTML = sessionData.chat.map(msg => `
|
| 563 |
+
<div class="chat-message">
|
| 564 |
+
<div class="meta">
|
| 565 |
+
<span class="player">Player ${msg.player.toUpperCase()}</span>
|
| 566 |
+
<span class="msg-num">#${msg.msg || '?'}</span>
|
| 567 |
+
</div>
|
| 568 |
+
<div class="text">${escapeHtml(msg.message)}</div>
|
| 569 |
+
</div>
|
| 570 |
+
`).join('');
|
| 571 |
+
|
| 572 |
+
document.getElementById('content-body').innerHTML = `
|
| 573 |
+
<div class="chat-container">
|
| 574 |
+
${chatHTML}
|
| 575 |
+
</div>
|
| 576 |
+
`;
|
| 577 |
+
}
|
| 578 |
+
|
| 579 |
+
function showMemories() {
|
| 580 |
+
document.getElementById('content-title').textContent = 'Agent Memories';
|
| 581 |
+
|
| 582 |
+
if (Object.keys(sessionData.memories).length === 0) {
|
| 583 |
+
document.getElementById('content-body').innerHTML = `
|
| 584 |
+
<div class="empty-state">
|
| 585 |
+
<div class="icon">📝</div>
|
| 586 |
+
<h3>No memories stored</h3>
|
| 587 |
+
<p>AI agents haven't saved any notes yet</p>
|
| 588 |
+
</div>
|
| 589 |
+
`;
|
| 590 |
+
return;
|
| 591 |
+
}
|
| 592 |
+
|
| 593 |
+
const memoriesHTML = Object.entries(sessionData.memories).map(([player, memory]) => `
|
| 594 |
+
<div class="memory-card">
|
| 595 |
+
<div class="player-name">Player ${player.toUpperCase()}</div>
|
| 596 |
+
<div class="memory-text">"${escapeHtml(memory)}"</div>
|
| 597 |
+
</div>
|
| 598 |
+
`).join('');
|
| 599 |
+
|
| 600 |
+
document.getElementById('content-body').innerHTML = memoriesHTML;
|
| 601 |
+
}
|
| 602 |
+
|
| 603 |
+
function updateActiveNav() {
|
| 604 |
+
// Remove all active classes
|
| 605 |
+
document.querySelectorAll('.nav-item').forEach(item => {
|
| 606 |
+
item.classList.remove('active');
|
| 607 |
+
});
|
| 608 |
+
|
| 609 |
+
// Add active class to current view
|
| 610 |
+
if (currentView === 'chat' || currentView === 'memories') {
|
| 611 |
+
const items = document.querySelectorAll('.nav-item');
|
| 612 |
+
items.forEach(item => {
|
| 613 |
+
if (item.textContent.includes(currentView === 'chat' ? 'Chat' : 'Memories')) {
|
| 614 |
+
item.classList.add('active');
|
| 615 |
+
}
|
| 616 |
+
});
|
| 617 |
+
}
|
| 618 |
+
}
|
| 619 |
+
|
| 620 |
+
function showEmptyState(title, message) {
|
| 621 |
+
document.getElementById('content-title').textContent = 'AI Catan Viewer';
|
| 622 |
+
document.getElementById('content-body').innerHTML = `
|
| 623 |
+
<div class="empty-state">
|
| 624 |
+
<div class="icon">🎮</div>
|
| 625 |
+
<h3>${title}</h3>
|
| 626 |
+
<p>${message}</p>
|
| 627 |
+
</div>
|
| 628 |
+
`;
|
| 629 |
+
}
|
| 630 |
+
|
| 631 |
+
function escapeHtml(text) {
|
| 632 |
+
const div = document.createElement('div');
|
| 633 |
+
div.textContent = text;
|
| 634 |
+
return div.innerHTML;
|
| 635 |
+
}
|
| 636 |
+
|
| 637 |
+
// Initial load and auto-refresh
|
| 638 |
+
loadData();
|
| 639 |
+
setInterval(loadData, 1000);
|
| 640 |
+
</script>
|
| 641 |
+
</body>
|
| 642 |
+
</html>
|
examples/ai_testing/test_ai_live.py
ADDED
|
@@ -0,0 +1,541 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
AI Agent Live Testing - Watch AI Think and Respond!
|
| 3 |
+
---------------------------------------------------
|
| 4 |
+
|
| 5 |
+
This script:
|
| 6 |
+
1. Monitors for new prompts generated during gameplay
|
| 7 |
+
2. Sends prompts to Gemini AI for each player
|
| 8 |
+
3. Displays the AI's thinking and decisions in real-time
|
| 9 |
+
4. Saves chat messages and memories
|
| 10 |
+
5. Waits for you to execute moves manually
|
| 11 |
+
|
| 12 |
+
Setup:
|
| 13 |
+
- Run play_with_prompts.py to start a game
|
| 14 |
+
- This script will automatically process AI responses
|
| 15 |
+
"""
|
| 16 |
+
|
| 17 |
+
import sys
|
| 18 |
+
import json
|
| 19 |
+
import time
|
| 20 |
+
import logging
|
| 21 |
+
from pathlib import Path
|
| 22 |
+
from typing import Dict, Any, Optional, List
|
| 23 |
+
from datetime import datetime
|
| 24 |
+
from dataclasses import dataclass
|
| 25 |
+
|
| 26 |
+
# Add parent directory to path
|
| 27 |
+
sys.path.insert(0, str(Path(__file__).parent.parent.parent))
|
| 28 |
+
|
| 29 |
+
# Import our AI components
|
| 30 |
+
from pycatan.ai.llm_client import GeminiClient, LLMResponse
|
| 31 |
+
from pycatan.ai.response_parser import ResponseParser, ParseResult
|
| 32 |
+
from pycatan.ai.schemas import ResponseType
|
| 33 |
+
|
| 34 |
+
# Configure logging - will be set up in main with file output
|
| 35 |
+
logger = logging.getLogger(__name__)
|
| 36 |
+
|
| 37 |
+
|
| 38 |
+
# ============================================================================
|
| 39 |
+
# Configuration
|
| 40 |
+
# ============================================================================
|
| 41 |
+
|
| 42 |
+
GEMINI_API_KEY = "AIzaSyAAdbl5LtljM8PGy5iqChAP70cn9Ua35p0"
|
| 43 |
+
GEMINI_MODEL = "models/gemini-2.5-flash" # As requested by user
|
| 44 |
+
|
| 45 |
+
LOGS_DIR = Path("examples/ai_testing/my_games/ai_logs")
|
| 46 |
+
|
| 47 |
+
# Make sure directories exist
|
| 48 |
+
LOGS_DIR.mkdir(parents=True, exist_ok=True)
|
| 49 |
+
|
| 50 |
+
|
| 51 |
+
# ============================================================================
|
| 52 |
+
# Data Management
|
| 53 |
+
# ============================================================================
|
| 54 |
+
|
| 55 |
+
class ChatManager:
|
| 56 |
+
"""Manages chat history between players."""
|
| 57 |
+
|
| 58 |
+
def __init__(self, file_path: Path):
|
| 59 |
+
self.file_path = file_path
|
| 60 |
+
self.messages: List[Dict[str, Any]] = []
|
| 61 |
+
self.load()
|
| 62 |
+
|
| 63 |
+
def load(self):
|
| 64 |
+
"""Load chat history from file."""
|
| 65 |
+
if self.file_path.exists():
|
| 66 |
+
try:
|
| 67 |
+
with open(self.file_path, 'r', encoding='utf-8') as f:
|
| 68 |
+
data = json.load(f)
|
| 69 |
+
self.messages = data.get("messages", [])
|
| 70 |
+
logger.info(f"Loaded {len(self.messages)} chat messages")
|
| 71 |
+
except Exception as e:
|
| 72 |
+
logger.warning(f"Could not load chat history: {e}")
|
| 73 |
+
self.messages = []
|
| 74 |
+
|
| 75 |
+
def add_message(self, player: str, message: str):
|
| 76 |
+
"""Add a new chat message."""
|
| 77 |
+
# Use simple incrementing message number instead of timestamp
|
| 78 |
+
msg_num = len(self.messages) + 1
|
| 79 |
+
self.messages.append({
|
| 80 |
+
"msg": msg_num,
|
| 81 |
+
"player": player,
|
| 82 |
+
"message": message
|
| 83 |
+
})
|
| 84 |
+
self.save()
|
| 85 |
+
logger.info(f"💬 {player}: {message}")
|
| 86 |
+
|
| 87 |
+
def save(self):
|
| 88 |
+
"""Save chat history to file."""
|
| 89 |
+
try:
|
| 90 |
+
with open(self.file_path, 'w', encoding='utf-8') as f:
|
| 91 |
+
json.dump({"messages": self.messages}, f, indent=2, ensure_ascii=False)
|
| 92 |
+
except Exception as e:
|
| 93 |
+
logger.error(f"Failed to save chat history: {e}")
|
| 94 |
+
|
| 95 |
+
def get_recent(self, limit: int = 10) -> List[Dict[str, Any]]:
|
| 96 |
+
"""Get recent messages."""
|
| 97 |
+
return self.messages[-limit:] if self.messages else []
|
| 98 |
+
|
| 99 |
+
|
| 100 |
+
class MemoryManager:
|
| 101 |
+
"""Manages agent memories (note_to_self)."""
|
| 102 |
+
|
| 103 |
+
def __init__(self, file_path: Path):
|
| 104 |
+
self.file_path = file_path
|
| 105 |
+
self.memories: Dict[str, str] = {}
|
| 106 |
+
self.load()
|
| 107 |
+
|
| 108 |
+
def load(self):
|
| 109 |
+
"""Load memories from file."""
|
| 110 |
+
if self.file_path.exists():
|
| 111 |
+
try:
|
| 112 |
+
with open(self.file_path, 'r', encoding='utf-8') as f:
|
| 113 |
+
self.memories = json.load(f)
|
| 114 |
+
logger.info(f"Loaded memories for {len(self.memories)} agents")
|
| 115 |
+
except Exception as e:
|
| 116 |
+
logger.warning(f"Could not load memories: {e}")
|
| 117 |
+
self.memories = {}
|
| 118 |
+
|
| 119 |
+
def update_memory(self, player: str, note: str):
|
| 120 |
+
"""Update agent's memory."""
|
| 121 |
+
self.memories[player] = note
|
| 122 |
+
self.save()
|
| 123 |
+
logger.info(f"📝 {player} updated memory: {note[:50]}...")
|
| 124 |
+
|
| 125 |
+
def get_memory(self, player: str) -> Optional[str]:
|
| 126 |
+
"""Get agent's current memory."""
|
| 127 |
+
return self.memories.get(player)
|
| 128 |
+
|
| 129 |
+
def save(self):
|
| 130 |
+
"""Save memories to file."""
|
| 131 |
+
try:
|
| 132 |
+
with open(self.file_path, 'w', encoding='utf-8') as f:
|
| 133 |
+
json.dump(self.memories, f, indent=2, ensure_ascii=False)
|
| 134 |
+
except Exception as e:
|
| 135 |
+
logger.error(f"Failed to save memories: {e}")
|
| 136 |
+
|
| 137 |
+
|
| 138 |
+
# ============================================================================
|
| 139 |
+
# AI Response Handler
|
| 140 |
+
# ============================================================================
|
| 141 |
+
|
| 142 |
+
class AITester:
|
| 143 |
+
"""Handles AI testing - sends prompts and displays responses."""
|
| 144 |
+
|
| 145 |
+
def __init__(self, session_dir: Path):
|
| 146 |
+
self.llm_client = GeminiClient(
|
| 147 |
+
model=GEMINI_MODEL,
|
| 148 |
+
api_key=GEMINI_API_KEY,
|
| 149 |
+
temperature=0.8,
|
| 150 |
+
response_format="json"
|
| 151 |
+
)
|
| 152 |
+
self.parser = ResponseParser(enable_fallbacks=True, strict_mode=False)
|
| 153 |
+
|
| 154 |
+
# Create chat and memory files INSIDE the session directory
|
| 155 |
+
session_chat_file = session_dir / "chat_history.json"
|
| 156 |
+
session_memory_file = session_dir / "agent_memories.json"
|
| 157 |
+
|
| 158 |
+
self.chat_manager = ChatManager(session_chat_file)
|
| 159 |
+
self.memory_manager = MemoryManager(session_memory_file)
|
| 160 |
+
self.session_dir = session_dir
|
| 161 |
+
self.player_logs = {} # Will store file handles per player
|
| 162 |
+
self.consecutive_failures = 0 # Track consecutive failures
|
| 163 |
+
self.max_consecutive_failures = 5 # Stop after 5 failures in a row
|
| 164 |
+
|
| 165 |
+
logger.info(f"🤖 AI Tester initialized with model: {GEMINI_MODEL}")
|
| 166 |
+
logger.info(f"📁 Session logs: {session_dir}")
|
| 167 |
+
logger.info(f"💬 Chat history: {session_chat_file}")
|
| 168 |
+
logger.info(f"📝 Agent memories: {session_memory_file}")
|
| 169 |
+
|
| 170 |
+
def _get_player_log_file(self, player_name: str) -> Path:
|
| 171 |
+
"""Get or create log file for specific player."""
|
| 172 |
+
if player_name not in self.player_logs:
|
| 173 |
+
log_file = self.session_dir / f"player_{player_name}.md"
|
| 174 |
+
self.player_logs[player_name] = log_file
|
| 175 |
+
|
| 176 |
+
# Write Markdown header
|
| 177 |
+
with open(log_file, 'w', encoding='utf-8') as f:
|
| 178 |
+
f.write(f"# 🤖 AI Agent Log - Player {player_name.upper()}\n\n")
|
| 179 |
+
f.write(f"---\n\n")
|
| 180 |
+
f.write(f"**Session:** `{self.session_dir.name}`\n\n")
|
| 181 |
+
f.write(f"**Model:** `{GEMINI_MODEL}`\n\n")
|
| 182 |
+
f.write(f"**Started:** {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n\n")
|
| 183 |
+
f.write(f"---\n\n")
|
| 184 |
+
|
| 185 |
+
return self.player_logs[player_name]
|
| 186 |
+
|
| 187 |
+
def _log_to_player_file(self, player_name: str, text: str):
|
| 188 |
+
"""Write text to player's log file."""
|
| 189 |
+
try:
|
| 190 |
+
log_file = self._get_player_log_file(player_name)
|
| 191 |
+
with open(log_file, 'a', encoding='utf-8') as f:
|
| 192 |
+
f.write(text + '\n')
|
| 193 |
+
except Exception as e:
|
| 194 |
+
pass
|
| 195 |
+
|
| 196 |
+
def _log_structured_response(self, player_name: str, data: Dict[str, Any]):
|
| 197 |
+
"""Format and log AI response in a beautiful structured way."""
|
| 198 |
+
self._log_to_player_file(player_name, "\n### 🎯 AI Response\n")
|
| 199 |
+
|
| 200 |
+
# Internal Thinking
|
| 201 |
+
if "internal_thinking" in data and data["internal_thinking"]:
|
| 202 |
+
self._log_to_player_file(player_name, "#### 💭 Internal Thinking\n")
|
| 203 |
+
self._log_to_player_file(player_name, f"> {data['internal_thinking']}\n")
|
| 204 |
+
|
| 205 |
+
# Note to Self
|
| 206 |
+
if "note_to_self" in data and data["note_to_self"]:
|
| 207 |
+
self._log_to_player_file(player_name, "#### 📝 Note to Self\n")
|
| 208 |
+
self._log_to_player_file(player_name, f"*\"{data['note_to_self']}\"*\n")
|
| 209 |
+
|
| 210 |
+
# Say Out Loud (Chat)
|
| 211 |
+
if "say_outloud" in data and data["say_outloud"]:
|
| 212 |
+
self._log_to_player_file(player_name, "#### 💬 Says Out Loud\n")
|
| 213 |
+
self._log_to_player_file(player_name, f"**\"{data['say_outloud']}\"**\n")
|
| 214 |
+
|
| 215 |
+
# Action
|
| 216 |
+
if "action" in data and data["action"]:
|
| 217 |
+
self._log_to_player_file(player_name, "#### 🎮 Action\n")
|
| 218 |
+
action = data["action"]
|
| 219 |
+
self._log_to_player_file(player_name, f"- **Type:** `{action.get('type', 'N/A')}`\n")
|
| 220 |
+
if action.get("parameters"):
|
| 221 |
+
self._log_to_player_file(player_name, f"- **Parameters:** `{action['parameters']}`\n")
|
| 222 |
+
|
| 223 |
+
# Raw JSON in collapsible section for debugging
|
| 224 |
+
self._log_to_player_file(player_name, "\n<details>")
|
| 225 |
+
self._log_to_player_file(player_name, "<summary><strong>🔍 Raw JSON (Debug)</strong></summary>\n")
|
| 226 |
+
self._log_to_player_file(player_name, "```json")
|
| 227 |
+
self._log_to_player_file(player_name, json.dumps(data, indent=2, ensure_ascii=False))
|
| 228 |
+
self._log_to_player_file(player_name, "```")
|
| 229 |
+
self._log_to_player_file(player_name, "</details>\n")
|
| 230 |
+
|
| 231 |
+
def process_prompt(self, prompt_file: Path) -> Optional[Dict[str, Any]]:
|
| 232 |
+
"""
|
| 233 |
+
Process a single prompt file.
|
| 234 |
+
|
| 235 |
+
Args:
|
| 236 |
+
prompt_file: Path to prompt file
|
| 237 |
+
|
| 238 |
+
Returns:
|
| 239 |
+
Processed response data or None if failed
|
| 240 |
+
"""
|
| 241 |
+
# Extract player name from filename (e.g., "prompt_player_a.txt" -> "a")
|
| 242 |
+
player_name = prompt_file.stem.replace("prompt_player_", "")
|
| 243 |
+
|
| 244 |
+
separator = "="*80
|
| 245 |
+
header = f"🤖 PROCESSING AI AGENT - Player {player_name.upper()}"
|
| 246 |
+
|
| 247 |
+
logger.info(separator)
|
| 248 |
+
logger.info(header)
|
| 249 |
+
logger.info(separator)
|
| 250 |
+
|
| 251 |
+
timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
| 252 |
+
request_num = len([k for k in self.player_logs.keys() if player_name in str(k)]) + 1
|
| 253 |
+
|
| 254 |
+
# Use JSON file instead of TXT for actual prompt
|
| 255 |
+
json_file = prompt_file.with_suffix('.json')
|
| 256 |
+
if not json_file.exists():
|
| 257 |
+
logger.error(f"JSON prompt file not found: {json_file}")
|
| 258 |
+
return None
|
| 259 |
+
|
| 260 |
+
# Read prompt JSON file directly
|
| 261 |
+
try:
|
| 262 |
+
with open(json_file, 'r', encoding='utf-8') as f:
|
| 263 |
+
prompt_json = json.load(f)
|
| 264 |
+
except Exception as e:
|
| 265 |
+
logger.error(f"Failed to read JSON prompt file: {e}")
|
| 266 |
+
return None
|
| 267 |
+
|
| 268 |
+
# Extract the actual prompt (the nested 'prompt' field)
|
| 269 |
+
actual_prompt = prompt_json.get("prompt", prompt_json)
|
| 270 |
+
|
| 271 |
+
# Display prompt info
|
| 272 |
+
logger.info(f"📤 Sending prompt to Gemini...")
|
| 273 |
+
logger.info(f" Model: {GEMINI_MODEL}")
|
| 274 |
+
logger.info(f" Player: {player_name}")
|
| 275 |
+
|
| 276 |
+
# Write Markdown formatted log
|
| 277 |
+
self._log_to_player_file(player_name, f"\n## 🔄 Request #{request_num}\n")
|
| 278 |
+
self._log_to_player_file(player_name, f"**Timestamp:** {timestamp}\n\n")
|
| 279 |
+
|
| 280 |
+
# Add schema section
|
| 281 |
+
response_schema = prompt_json.get("response_schema", {})
|
| 282 |
+
self._log_to_player_file(player_name, "<details>")
|
| 283 |
+
self._log_to_player_file(player_name, "<summary><strong>📋 Expected Response Schema</strong></summary>\n")
|
| 284 |
+
self._log_to_player_file(player_name, "```json")
|
| 285 |
+
self._log_to_player_file(player_name, json.dumps(response_schema, indent=2, ensure_ascii=False))
|
| 286 |
+
self._log_to_player_file(player_name, "```")
|
| 287 |
+
self._log_to_player_file(player_name, "</details>\n")
|
| 288 |
+
|
| 289 |
+
# Add prompt sent section
|
| 290 |
+
self._log_to_player_file(player_name, "<details>")
|
| 291 |
+
self._log_to_player_file(player_name, "<summary><strong>📤 Prompt Sent to Gemini</strong></summary>\n")
|
| 292 |
+
self._log_to_player_file(player_name, "```json")
|
| 293 |
+
self._log_to_player_file(player_name, json.dumps(actual_prompt, indent=2, ensure_ascii=False))
|
| 294 |
+
self._log_to_player_file(player_name, "```")
|
| 295 |
+
self._log_to_player_file(player_name, "</details>\n")
|
| 296 |
+
|
| 297 |
+
# Send to LLM (schema is already in correct format from prompt_templates.py)
|
| 298 |
+
start_time = time.time()
|
| 299 |
+
llm_response = self.llm_client.generate_with_retry(
|
| 300 |
+
prompt=json.dumps(actual_prompt),
|
| 301 |
+
max_retries=3,
|
| 302 |
+
response_schema=response_schema
|
| 303 |
+
)
|
| 304 |
+
|
| 305 |
+
if not llm_response.success:
|
| 306 |
+
error_msg = f"❌ LLM request failed: {llm_response.error}"
|
| 307 |
+
logger.error(error_msg)
|
| 308 |
+
self._log_to_player_file(player_name, f"\n{error_msg}")
|
| 309 |
+
|
| 310 |
+
# Track consecutive failures
|
| 311 |
+
self.consecutive_failures += 1
|
| 312 |
+
|
| 313 |
+
# If it's a schema error, stop immediately to prevent repeated failures
|
| 314 |
+
if "Unknown field for Schema" in str(llm_response.error):
|
| 315 |
+
logger.critical("\n" + "="*80)
|
| 316 |
+
logger.critical("🛑 CRITICAL ERROR: Schema validation failed!")
|
| 317 |
+
logger.critical(f"Error: {llm_response.error}")
|
| 318 |
+
logger.critical("The response schema contains fields that Gemini doesn't support.")
|
| 319 |
+
logger.critical("Gemini only supports: type, properties, required, description, items, enum")
|
| 320 |
+
logger.critical("Stopping to prevent repeated failures.")
|
| 321 |
+
logger.critical("="*80 + "\n")
|
| 322 |
+
raise RuntimeError("Schema validation error - stopping")
|
| 323 |
+
|
| 324 |
+
return None
|
| 325 |
+
|
| 326 |
+
# Reset failure counter on success
|
| 327 |
+
self.consecutive_failures = 0
|
| 328 |
+
|
| 329 |
+
logger.info(f"✅ Response received ({llm_response.latency_seconds:.2f}s)")
|
| 330 |
+
logger.info(f" Tokens: {llm_response.total_tokens} (prompt: {llm_response.prompt_tokens}, completion: {llm_response.completion_tokens})")
|
| 331 |
+
|
| 332 |
+
# Log response metadata
|
| 333 |
+
self._log_to_player_file(player_name, "\n### ✅ Response Received\n")
|
| 334 |
+
self._log_to_player_file(player_name, f"- **Latency:** {llm_response.latency_seconds:.2f}s")
|
| 335 |
+
self._log_to_player_file(player_name, f"- **Tokens:** {llm_response.total_tokens} (prompt: {llm_response.prompt_tokens}, completion: {llm_response.completion_tokens})\n")
|
| 336 |
+
|
| 337 |
+
# Log raw response
|
| 338 |
+
self._log_to_player_file(player_name, "<details>")
|
| 339 |
+
self._log_to_player_file(player_name, "<summary><strong>📥 Raw Response from Gemini</strong></summary>\n")
|
| 340 |
+
self._log_to_player_file(player_name, "```json")
|
| 341 |
+
self._log_to_player_file(player_name, llm_response.content)
|
| 342 |
+
self._log_to_player_file(player_name, "```")
|
| 343 |
+
self._log_to_player_file(player_name, "</details>\n")
|
| 344 |
+
|
| 345 |
+
# Parse response
|
| 346 |
+
parse_result = self.parser.parse(llm_response.content, ResponseType.OBSERVING)
|
| 347 |
+
|
| 348 |
+
if not parse_result.success:
|
| 349 |
+
error_msg = f"❌ Failed to parse response: {parse_result.error_message}"
|
| 350 |
+
logger.error(error_msg)
|
| 351 |
+
logger.error(f"Raw response: {llm_response.content[:500]}...")
|
| 352 |
+
self._log_to_player_file(player_name, f"\n### ❌ Parse Error\n")
|
| 353 |
+
self._log_to_player_file(player_name, f"**Error:** {parse_result.error_message}\n")
|
| 354 |
+
self._log_to_player_file(player_name, f"**Raw response preview:** `{llm_response.content[:500]}...`\n")
|
| 355 |
+
return None
|
| 356 |
+
|
| 357 |
+
logger.info("✅ Response parsed successfully")
|
| 358 |
+
self._log_to_player_file(player_name, "\n### ✅ Parse Success\n")
|
| 359 |
+
|
| 360 |
+
# Display structured response
|
| 361 |
+
self._log_structured_response(player_name, parse_result.data)
|
| 362 |
+
|
| 363 |
+
# Display the response
|
| 364 |
+
self._display_response(player_name, parse_result.data, llm_response)
|
| 365 |
+
|
| 366 |
+
# Handle chat and memory
|
| 367 |
+
if "say_outloud" in parse_result.data and parse_result.data["say_outloud"]:
|
| 368 |
+
self.chat_manager.add_message(player_name, parse_result.data["say_outloud"])
|
| 369 |
+
|
| 370 |
+
if "note_to_self" in parse_result.data and parse_result.data["note_to_self"]:
|
| 371 |
+
self.memory_manager.update_memory(player_name, parse_result.data["note_to_self"])
|
| 372 |
+
|
| 373 |
+
return parse_result.data
|
| 374 |
+
|
| 375 |
+
def _display_response(self, player: str, data: Dict[str, Any], llm_response: LLMResponse):
|
| 376 |
+
"""Display the parsed response in a nice format."""
|
| 377 |
+
print("\n" + "="*80)
|
| 378 |
+
print(f"🎯 AI RESPONSE - Player {player.upper()}")
|
| 379 |
+
print("="*80)
|
| 380 |
+
|
| 381 |
+
# Display thinking
|
| 382 |
+
if "internal_thinking" in data:
|
| 383 |
+
print(f"\n💭 Internal Thinking:")
|
| 384 |
+
print(f" {data['internal_thinking'][:200]}...")
|
| 385 |
+
|
| 386 |
+
# Display note to self
|
| 387 |
+
if "note_to_self" in data and data["note_to_self"]:
|
| 388 |
+
print(f"\n📝 Note to Self:")
|
| 389 |
+
print(f" {data['note_to_self']}")
|
| 390 |
+
|
| 391 |
+
# Display say outloud
|
| 392 |
+
if "say_outloud" in data and data["say_outloud"]:
|
| 393 |
+
print(f"\n💬 Says Out Loud:")
|
| 394 |
+
print(f" \"{data['say_outloud']}\"")
|
| 395 |
+
|
| 396 |
+
# Display action
|
| 397 |
+
if "action" in data:
|
| 398 |
+
print(f"\n🎮 Action:")
|
| 399 |
+
print(f" Type: {data['action'].get('type', 'N/A')}")
|
| 400 |
+
if data['action'].get('parameters'):
|
| 401 |
+
print(f" Parameters: {data['action']['parameters']}")
|
| 402 |
+
|
| 403 |
+
print("\n" + "="*80 + "\n")
|
| 404 |
+
|
| 405 |
+
def get_stats(self):
|
| 406 |
+
"""Display statistics."""
|
| 407 |
+
stats = self.llm_client.get_stats()
|
| 408 |
+
print("\n" + "="*80)
|
| 409 |
+
print("📊 AI TESTER STATISTICS")
|
| 410 |
+
print("="*80)
|
| 411 |
+
for key, value in stats.items():
|
| 412 |
+
print(f" {key}: {value}")
|
| 413 |
+
print("="*80 + "\n")
|
| 414 |
+
|
| 415 |
+
|
| 416 |
+
# ============================================================================
|
| 417 |
+
# Main Monitoring Loop
|
| 418 |
+
# ============================================================================
|
| 419 |
+
|
| 420 |
+
def get_or_create_session():
|
| 421 |
+
"""Get existing session or create new one."""
|
| 422 |
+
# Use same path as generate_prompts_from_state.py
|
| 423 |
+
current_session_file = Path("examples/ai_testing/my_games/current_session.txt")
|
| 424 |
+
|
| 425 |
+
# Try to use existing session first
|
| 426 |
+
if current_session_file.exists():
|
| 427 |
+
try:
|
| 428 |
+
with open(current_session_file, 'r') as f:
|
| 429 |
+
session_path = f.read().strip()
|
| 430 |
+
session_dir = Path(session_path)
|
| 431 |
+
if session_dir.exists():
|
| 432 |
+
logger.info(f"📂 Using existing session: {session_dir.name}")
|
| 433 |
+
return session_dir
|
| 434 |
+
except Exception as e:
|
| 435 |
+
logger.warning(f"Could not read existing session: {e}")
|
| 436 |
+
|
| 437 |
+
# Create new session if none exists
|
| 438 |
+
session_time = datetime.now().strftime("%Y%m%d_%H%M%S")
|
| 439 |
+
session_dir = LOGS_DIR / f"session_{session_time}"
|
| 440 |
+
session_dir.mkdir(parents=True, exist_ok=True)
|
| 441 |
+
|
| 442 |
+
# Save current session path for other scripts to find
|
| 443 |
+
# Write with flush to ensure it's immediately visible
|
| 444 |
+
with open(current_session_file, 'w') as f:
|
| 445 |
+
f.write(str(session_dir.absolute()))
|
| 446 |
+
f.flush()
|
| 447 |
+
|
| 448 |
+
logger.info(f"📂 Created new session: {session_dir.name}")
|
| 449 |
+
logger.info(f"📄 Session file: {current_session_file.absolute()}")
|
| 450 |
+
return session_dir
|
| 451 |
+
|
| 452 |
+
|
| 453 |
+
def monitor_prompts():
|
| 454 |
+
"""Monitor for new prompts and process them."""
|
| 455 |
+
session_dir = get_or_create_session()
|
| 456 |
+
|
| 457 |
+
# Create prompts directory inside session
|
| 458 |
+
prompts_dir = session_dir / 'prompts'
|
| 459 |
+
prompts_dir.mkdir(exist_ok=True)
|
| 460 |
+
|
| 461 |
+
tester = AITester(session_dir)
|
| 462 |
+
processed_files = {} # Dictionary: filename -> mtime when processed
|
| 463 |
+
|
| 464 |
+
print("="*80)
|
| 465 |
+
print("🎮 AI AGENT LIVE TESTER")
|
| 466 |
+
print("="*80)
|
| 467 |
+
print(f"📁 Watching: {prompts_dir}")
|
| 468 |
+
print(f"🤖 Model: {GEMINI_MODEL}")
|
| 469 |
+
print(f"📝 Session logs: {session_dir}")
|
| 470 |
+
print(f"⏳ Waiting for NEW prompts to be generated...")
|
| 471 |
+
print("="*80 + "\n")
|
| 472 |
+
|
| 473 |
+
try:
|
| 474 |
+
while True:
|
| 475 |
+
# Check for prompt files in SESSION prompts directory
|
| 476 |
+
if prompts_dir.exists():
|
| 477 |
+
prompt_files = sorted(prompts_dir.glob("prompt_player_*.txt"))
|
| 478 |
+
|
| 479 |
+
for prompt_file in prompt_files:
|
| 480 |
+
# Get current modification time
|
| 481 |
+
file_mtime = prompt_file.stat().st_mtime
|
| 482 |
+
|
| 483 |
+
# Check if file has been updated or is new
|
| 484 |
+
filename = prompt_file.name
|
| 485 |
+
is_new_or_updated = (
|
| 486 |
+
filename not in processed_files or
|
| 487 |
+
file_mtime > processed_files.get(filename, 0)
|
| 488 |
+
)
|
| 489 |
+
|
| 490 |
+
if is_new_or_updated:
|
| 491 |
+
# New or updated prompt file
|
| 492 |
+
logger.info(f"🆕 Detected new prompt: {prompt_file.name}")
|
| 493 |
+
|
| 494 |
+
# Small delay to ensure file is fully written
|
| 495 |
+
time.sleep(0.2)
|
| 496 |
+
|
| 497 |
+
# Process it (will raise RuntimeError on critical schema errors)
|
| 498 |
+
try:
|
| 499 |
+
result = tester.process_prompt(prompt_file)
|
| 500 |
+
except RuntimeError as e:
|
| 501 |
+
# Critical error - stop immediately
|
| 502 |
+
print("\n" + "="*80)
|
| 503 |
+
print("🛑 CRITICAL ERROR DETECTED")
|
| 504 |
+
print("="*80)
|
| 505 |
+
print(f"Error: {e}")
|
| 506 |
+
print("\nStopping AI Tester to prevent repeated failures.")
|
| 507 |
+
print("Please fix the schema issue and restart.")
|
| 508 |
+
print("="*80 + "\n")
|
| 509 |
+
tester.get_stats()
|
| 510 |
+
print(f"\n📝 Session logs saved to: {session_dir}")
|
| 511 |
+
print(f" Files: {', '.join([f.name for f in session_dir.glob('*.md')])}")
|
| 512 |
+
return # Exit the function
|
| 513 |
+
|
| 514 |
+
if result:
|
| 515 |
+
processed_files[filename] = file_mtime
|
| 516 |
+
|
| 517 |
+
# Show stats periodically
|
| 518 |
+
if len(processed_files) % 5 == 0 and len(processed_files) > 0:
|
| 519 |
+
tester.get_stats()
|
| 520 |
+
|
| 521 |
+
# Sleep before next check
|
| 522 |
+
time.sleep(0.5)
|
| 523 |
+
|
| 524 |
+
except KeyboardInterrupt:
|
| 525 |
+
print("\n\n✅ AI Tester stopped")
|
| 526 |
+
tester.get_stats()
|
| 527 |
+
print(f"\n📝 Session logs saved to: {session_dir}")
|
| 528 |
+
print(f" Files: {', '.join([f.name for f in session_dir.glob('*.md')])}")
|
| 529 |
+
|
| 530 |
+
|
| 531 |
+
if __name__ == '__main__':
|
| 532 |
+
# Setup logging
|
| 533 |
+
logging.basicConfig(
|
| 534 |
+
level=logging.INFO,
|
| 535 |
+
format='%(message)s',
|
| 536 |
+
handlers=[
|
| 537 |
+
logging.StreamHandler()
|
| 538 |
+
]
|
| 539 |
+
)
|
| 540 |
+
|
| 541 |
+
monitor_prompts()
|
examples/ai_testing/web_viewer.py
ADDED
|
@@ -0,0 +1,182 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
Real-Time AI Game Viewer
|
| 3 |
+
-------------------------
|
| 4 |
+
Web interface to monitor AI agents, chat, and game state in real-time.
|
| 5 |
+
"""
|
| 6 |
+
|
| 7 |
+
import json
|
| 8 |
+
from pathlib import Path
|
| 9 |
+
from datetime import datetime
|
| 10 |
+
from flask import Flask, render_template, jsonify
|
| 11 |
+
import html
|
| 12 |
+
|
| 13 |
+
app = Flask(__name__,
|
| 14 |
+
template_folder='templates',
|
| 15 |
+
static_folder='static')
|
| 16 |
+
|
| 17 |
+
LOGS_DIR = Path("examples/ai_testing/my_games/ai_logs")
|
| 18 |
+
SESSION_FILE = Path("examples/ai_testing/my_games/current_session.txt")
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
def get_current_session():
|
| 22 |
+
"""Get current session directory."""
|
| 23 |
+
if SESSION_FILE.exists():
|
| 24 |
+
try:
|
| 25 |
+
with open(SESSION_FILE, 'r', encoding='utf-8') as f:
|
| 26 |
+
session_path = f.read().strip()
|
| 27 |
+
session_dir = Path(session_path)
|
| 28 |
+
if session_dir.exists():
|
| 29 |
+
print(f"✓ Found current session: {session_dir.name}")
|
| 30 |
+
return session_dir
|
| 31 |
+
except Exception as e:
|
| 32 |
+
print(f"Error reading session file: {e}")
|
| 33 |
+
|
| 34 |
+
# Fallback: get most recent session
|
| 35 |
+
if LOGS_DIR.exists():
|
| 36 |
+
sessions = sorted(LOGS_DIR.glob("session_*"), reverse=True)
|
| 37 |
+
if sessions:
|
| 38 |
+
print(f"✓ Using most recent session: {sessions[0].name}")
|
| 39 |
+
return sessions[0]
|
| 40 |
+
|
| 41 |
+
print("⚠ No session found")
|
| 42 |
+
return None
|
| 43 |
+
|
| 44 |
+
|
| 45 |
+
def get_all_sessions():
|
| 46 |
+
"""Get list of all session directories."""
|
| 47 |
+
if not LOGS_DIR.exists():
|
| 48 |
+
return []
|
| 49 |
+
|
| 50 |
+
sessions = []
|
| 51 |
+
current_session_path = get_current_session()
|
| 52 |
+
|
| 53 |
+
for session_dir in sorted(LOGS_DIR.glob("session_*"), reverse=True):
|
| 54 |
+
sessions.append({
|
| 55 |
+
"name": session_dir.name,
|
| 56 |
+
"path": str(session_dir.absolute()),
|
| 57 |
+
"is_current": current_session_path and str(session_dir.absolute()) == str(current_session_path.absolute())
|
| 58 |
+
})
|
| 59 |
+
return sessions
|
| 60 |
+
|
| 61 |
+
|
| 62 |
+
def get_session_data(session_path):
|
| 63 |
+
"""Get all data for a specific session."""
|
| 64 |
+
session_dir = Path(session_path)
|
| 65 |
+
|
| 66 |
+
if not session_dir.exists():
|
| 67 |
+
return None
|
| 68 |
+
|
| 69 |
+
print(f"Loading session data from: {session_dir}")
|
| 70 |
+
|
| 71 |
+
# Get player logs
|
| 72 |
+
players = {}
|
| 73 |
+
for player_file in session_dir.glob("player_*.md"):
|
| 74 |
+
player_name = player_file.stem.replace("player_", "").upper()
|
| 75 |
+
try:
|
| 76 |
+
with open(player_file, 'r', encoding='utf-8') as f:
|
| 77 |
+
content = f.read()
|
| 78 |
+
players[player_name] = {
|
| 79 |
+
"name": player_name,
|
| 80 |
+
"content": content,
|
| 81 |
+
"html": html.escape(content)
|
| 82 |
+
}
|
| 83 |
+
print(f" ✓ Loaded player: {player_name}")
|
| 84 |
+
except Exception as e:
|
| 85 |
+
print(f" ✗ Error loading {player_name}: {e}")
|
| 86 |
+
players[player_name] = {
|
| 87 |
+
"name": player_name,
|
| 88 |
+
"content": f"Error loading: {e}",
|
| 89 |
+
"html": html.escape(f"Error loading: {e}")
|
| 90 |
+
}
|
| 91 |
+
|
| 92 |
+
# Get chat history
|
| 93 |
+
chat_file = session_dir / "chat_history.json"
|
| 94 |
+
chat_messages = []
|
| 95 |
+
if chat_file.exists():
|
| 96 |
+
try:
|
| 97 |
+
with open(chat_file, 'r', encoding='utf-8') as f:
|
| 98 |
+
data = json.load(f)
|
| 99 |
+
chat_messages = data.get("messages", [])
|
| 100 |
+
print(f" ✓ Loaded {len(chat_messages)} chat messages")
|
| 101 |
+
except Exception as e:
|
| 102 |
+
print(f" ✗ Error loading chat: {e}")
|
| 103 |
+
chat_messages = [{"error": str(e)}]
|
| 104 |
+
else:
|
| 105 |
+
print(f" ℹ No chat history file")
|
| 106 |
+
|
| 107 |
+
# Get agent memories
|
| 108 |
+
memory_file = session_dir / "agent_memories.json"
|
| 109 |
+
memories = {}
|
| 110 |
+
if memory_file.exists():
|
| 111 |
+
try:
|
| 112 |
+
with open(memory_file, 'r', encoding='utf-8') as f:
|
| 113 |
+
memories = json.load(f)
|
| 114 |
+
print(f" ✓ Loaded memories for {len(memories)} players")
|
| 115 |
+
except Exception as e:
|
| 116 |
+
print(f" ✗ Error loading memories: {e}")
|
| 117 |
+
memories = {}
|
| 118 |
+
else:
|
| 119 |
+
print(f" ℹ No memories file")
|
| 120 |
+
|
| 121 |
+
return {
|
| 122 |
+
"session_name": session_dir.name,
|
| 123 |
+
"session_path": str(session_dir),
|
| 124 |
+
"players": players,
|
| 125 |
+
"chat": chat_messages,
|
| 126 |
+
"memories": memories
|
| 127 |
+
}
|
| 128 |
+
|
| 129 |
+
|
| 130 |
+
@app.route('/')
|
| 131 |
+
def index():
|
| 132 |
+
"""Main page."""
|
| 133 |
+
sessions = get_all_sessions()
|
| 134 |
+
current_session = get_current_session()
|
| 135 |
+
|
| 136 |
+
return render_template('viewer.html',
|
| 137 |
+
sessions=sessions,
|
| 138 |
+
current_session=str(current_session) if current_session else None)
|
| 139 |
+
|
| 140 |
+
|
| 141 |
+
@app.route('/api/sessions')
|
| 142 |
+
def api_sessions():
|
| 143 |
+
"""Get list of all sessions."""
|
| 144 |
+
return jsonify(get_all_sessions())
|
| 145 |
+
|
| 146 |
+
|
| 147 |
+
@app.route('/api/session/<path:session_path>')
|
| 148 |
+
def api_session(session_path):
|
| 149 |
+
"""Get data for specific session."""
|
| 150 |
+
data = get_session_data(session_path)
|
| 151 |
+
if data is None:
|
| 152 |
+
return jsonify({"error": "Session not found"}), 404
|
| 153 |
+
return jsonify(data)
|
| 154 |
+
|
| 155 |
+
|
| 156 |
+
@app.route('/api/current')
|
| 157 |
+
def api_current():
|
| 158 |
+
"""Get current session data."""
|
| 159 |
+
current = get_current_session()
|
| 160 |
+
if current is None:
|
| 161 |
+
return jsonify({"error": "No active session"}), 404
|
| 162 |
+
|
| 163 |
+
data = get_session_data(str(current))
|
| 164 |
+
if data is None:
|
| 165 |
+
return jsonify({"error": "Session not found"}), 404
|
| 166 |
+
|
| 167 |
+
return jsonify(data)
|
| 168 |
+
|
| 169 |
+
|
| 170 |
+
if __name__ == '__main__':
|
| 171 |
+
print("="*80)
|
| 172 |
+
print("🌐 AI Game Viewer Starting...")
|
| 173 |
+
print("="*80)
|
| 174 |
+
print(f"\n📁 Watching: {LOGS_DIR.absolute()}")
|
| 175 |
+
print(f"📄 Session file: {SESSION_FILE.absolute()}")
|
| 176 |
+
print(f"\n🔗 Open in browser: http://localhost:5000")
|
| 177 |
+
print("\n" + "="*80 + "\n")
|
| 178 |
+
|
| 179 |
+
# Check current session on startup
|
| 180 |
+
get_current_session()
|
| 181 |
+
|
| 182 |
+
app.run(debug=False, host='0.0.0.0', port=5000)
|
install_web_viewer.bat
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
@echo off
|
| 2 |
+
echo Installing Flask for Web Viewer...
|
| 3 |
+
echo.
|
| 4 |
+
|
| 5 |
+
.venv\Scripts\pip.exe install flask
|
| 6 |
+
|
| 7 |
+
echo.
|
| 8 |
+
echo ✅ Installation complete!
|
| 9 |
+
echo.
|
| 10 |
+
echo You can now run: start.bat
|
| 11 |
+
echo.
|
| 12 |
+
pause
|
pycatan/ai/llm_client.py
ADDED
|
@@ -0,0 +1,349 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
LLM Client for AI Agents.
|
| 3 |
+
|
| 4 |
+
This module provides abstraction for different LLM providers.
|
| 5 |
+
Currently supports:
|
| 6 |
+
- Google Gemini
|
| 7 |
+
"""
|
| 8 |
+
|
| 9 |
+
import logging
|
| 10 |
+
import time
|
| 11 |
+
import json
|
| 12 |
+
from abc import ABC, abstractmethod
|
| 13 |
+
from typing import Dict, Any, Optional, List
|
| 14 |
+
from dataclasses import dataclass, field
|
| 15 |
+
from datetime import datetime
|
| 16 |
+
|
| 17 |
+
logger = logging.getLogger(__name__)
|
| 18 |
+
|
| 19 |
+
|
| 20 |
+
@dataclass
|
| 21 |
+
class LLMResponse:
|
| 22 |
+
"""Response from LLM API call."""
|
| 23 |
+
success: bool
|
| 24 |
+
content: Optional[str] = None
|
| 25 |
+
raw_response: Optional[Any] = None
|
| 26 |
+
error: Optional[str] = None
|
| 27 |
+
|
| 28 |
+
# Metadata
|
| 29 |
+
model: str = ""
|
| 30 |
+
prompt_tokens: int = 0
|
| 31 |
+
completion_tokens: int = 0
|
| 32 |
+
total_tokens: int = 0
|
| 33 |
+
latency_seconds: float = 0.0
|
| 34 |
+
timestamp: str = field(default_factory=lambda: datetime.now().isoformat())
|
| 35 |
+
|
| 36 |
+
def to_dict(self) -> Dict[str, Any]:
|
| 37 |
+
"""Convert to dictionary for logging."""
|
| 38 |
+
return {
|
| 39 |
+
"success": self.success,
|
| 40 |
+
"content": self.content[:200] + "..." if self.content and len(self.content) > 200 else self.content,
|
| 41 |
+
"error": self.error,
|
| 42 |
+
"model": self.model,
|
| 43 |
+
"tokens": {
|
| 44 |
+
"prompt": self.prompt_tokens,
|
| 45 |
+
"completion": self.completion_tokens,
|
| 46 |
+
"total": self.total_tokens
|
| 47 |
+
},
|
| 48 |
+
"latency_seconds": round(self.latency_seconds, 2),
|
| 49 |
+
"timestamp": self.timestamp
|
| 50 |
+
}
|
| 51 |
+
|
| 52 |
+
|
| 53 |
+
@dataclass
|
| 54 |
+
class LLMStats:
|
| 55 |
+
"""Statistics for LLM usage."""
|
| 56 |
+
total_requests: int = 0
|
| 57 |
+
successful_requests: int = 0
|
| 58 |
+
failed_requests: int = 0
|
| 59 |
+
total_tokens: int = 0
|
| 60 |
+
total_cost_usd: float = 0.0
|
| 61 |
+
total_latency: float = 0.0
|
| 62 |
+
|
| 63 |
+
def add_request(self, response: LLMResponse, cost: float = 0.0):
|
| 64 |
+
"""Add a request to statistics."""
|
| 65 |
+
self.total_requests += 1
|
| 66 |
+
if response.success:
|
| 67 |
+
self.successful_requests += 1
|
| 68 |
+
else:
|
| 69 |
+
self.failed_requests += 1
|
| 70 |
+
self.total_tokens += response.total_tokens
|
| 71 |
+
self.total_cost_usd += cost
|
| 72 |
+
self.total_latency += response.latency_seconds
|
| 73 |
+
|
| 74 |
+
def to_dict(self) -> Dict[str, Any]:
|
| 75 |
+
"""Convert to dictionary."""
|
| 76 |
+
return {
|
| 77 |
+
"total_requests": self.total_requests,
|
| 78 |
+
"successful": self.successful_requests,
|
| 79 |
+
"failed": self.failed_requests,
|
| 80 |
+
"success_rate": f"{self.successful_requests / self.total_requests * 100:.1f}%" if self.total_requests > 0 else "0%",
|
| 81 |
+
"total_tokens": self.total_tokens,
|
| 82 |
+
"total_cost_usd": f"${self.total_cost_usd:.4f}",
|
| 83 |
+
"avg_latency": f"{self.total_latency / self.total_requests:.2f}s" if self.total_requests > 0 else "0s"
|
| 84 |
+
}
|
| 85 |
+
|
| 86 |
+
|
| 87 |
+
class LLMClient(ABC):
|
| 88 |
+
"""Abstract base class for LLM clients."""
|
| 89 |
+
|
| 90 |
+
def __init__(self, model: str, api_key: str, **kwargs):
|
| 91 |
+
self.model = model
|
| 92 |
+
self.api_key = api_key
|
| 93 |
+
self.stats = LLMStats()
|
| 94 |
+
self.config = kwargs
|
| 95 |
+
|
| 96 |
+
@abstractmethod
|
| 97 |
+
def generate(self, prompt: str, **kwargs) -> LLMResponse:
|
| 98 |
+
"""Generate response from LLM."""
|
| 99 |
+
pass
|
| 100 |
+
|
| 101 |
+
def get_stats(self) -> Dict[str, Any]:
|
| 102 |
+
"""Get usage statistics."""
|
| 103 |
+
return self.stats.to_dict()
|
| 104 |
+
|
| 105 |
+
|
| 106 |
+
class GeminiClient(LLMClient):
|
| 107 |
+
"""
|
| 108 |
+
Google Gemini LLM Client.
|
| 109 |
+
|
| 110 |
+
Supports Gemini models through the Google Generative AI API.
|
| 111 |
+
"""
|
| 112 |
+
|
| 113 |
+
def __init__(self,
|
| 114 |
+
model: str = "models/gemini-2.5-flash",
|
| 115 |
+
api_key: str = "",
|
| 116 |
+
temperature: float = 0.7,
|
| 117 |
+
max_tokens: Optional[int] = None,
|
| 118 |
+
response_format: str = "json",
|
| 119 |
+
**kwargs):
|
| 120 |
+
"""
|
| 121 |
+
Initialize Gemini client.
|
| 122 |
+
|
| 123 |
+
Args:
|
| 124 |
+
model: Model name (e.g., "models/gemini-2.5-flash")
|
| 125 |
+
api_key: Google API key
|
| 126 |
+
temperature: Sampling temperature (0.0-1.0)
|
| 127 |
+
max_tokens: Maximum tokens to generate
|
| 128 |
+
response_format: Response format ("json" or "text")
|
| 129 |
+
**kwargs: Additional configuration
|
| 130 |
+
"""
|
| 131 |
+
super().__init__(model, api_key, **kwargs)
|
| 132 |
+
|
| 133 |
+
self.temperature = temperature
|
| 134 |
+
self.max_tokens = max_tokens
|
| 135 |
+
self.response_format = response_format
|
| 136 |
+
|
| 137 |
+
# Initialize Gemini client
|
| 138 |
+
try:
|
| 139 |
+
import google.generativeai as genai
|
| 140 |
+
self.genai = genai
|
| 141 |
+
self.genai.configure(api_key=api_key)
|
| 142 |
+
self.model_instance = genai.GenerativeModel(model)
|
| 143 |
+
logger.info(f"Initialized Gemini client with model: {model}")
|
| 144 |
+
except ImportError:
|
| 145 |
+
logger.error("google-generativeai package not installed. Install with: pip install google-generativeai")
|
| 146 |
+
raise
|
| 147 |
+
except Exception as e:
|
| 148 |
+
logger.error(f"Failed to initialize Gemini client: {e}")
|
| 149 |
+
raise
|
| 150 |
+
|
| 151 |
+
def generate(self, prompt: str, **kwargs) -> LLMResponse:
|
| 152 |
+
"""
|
| 153 |
+
Generate response from Gemini.
|
| 154 |
+
|
| 155 |
+
Args:
|
| 156 |
+
prompt: Prompt text (can be JSON string or plain text)
|
| 157 |
+
**kwargs: Override default generation parameters
|
| 158 |
+
- response_schema: JSON schema to enforce structure
|
| 159 |
+
|
| 160 |
+
Returns:
|
| 161 |
+
LLMResponse object with result
|
| 162 |
+
"""
|
| 163 |
+
start_time = time.time()
|
| 164 |
+
|
| 165 |
+
# Prepare generation config
|
| 166 |
+
generation_config = {
|
| 167 |
+
"temperature": kwargs.get("temperature", self.temperature),
|
| 168 |
+
}
|
| 169 |
+
|
| 170 |
+
if self.max_tokens:
|
| 171 |
+
generation_config["max_output_tokens"] = kwargs.get("max_tokens", self.max_tokens)
|
| 172 |
+
|
| 173 |
+
# Set response format
|
| 174 |
+
response_format = kwargs.get("response_format", self.response_format)
|
| 175 |
+
if response_format == "json":
|
| 176 |
+
generation_config["response_mime_type"] = "application/json"
|
| 177 |
+
|
| 178 |
+
# Add response_schema if provided (enforces structure)
|
| 179 |
+
if "response_schema" in kwargs:
|
| 180 |
+
# NOTE: propertyOrdering works in AI Studio but NOT in Python SDK
|
| 181 |
+
# We need to remove it for the SDK to accept the schema
|
| 182 |
+
schema = kwargs["response_schema"]
|
| 183 |
+
cleaned_schema = self._remove_unsupported_fields(schema)
|
| 184 |
+
generation_config["response_schema"] = cleaned_schema
|
| 185 |
+
|
| 186 |
+
try:
|
| 187 |
+
logger.info(f"Sending request to Gemini ({self.model})...")
|
| 188 |
+
logger.debug(f"Prompt length: {len(prompt)} chars")
|
| 189 |
+
|
| 190 |
+
# DEBUG: Print what we're sending to Gemini
|
| 191 |
+
print("\n" + "="*80)
|
| 192 |
+
print("🔍 DEBUG: SENDING TO GEMINI")
|
| 193 |
+
print("="*80)
|
| 194 |
+
print(f"📤 Prompt (first 500 chars): {prompt[:500]}...")
|
| 195 |
+
print(f"� Response Schema Keys: {list(generation_config.get('response_schema', {}).keys())}")
|
| 196 |
+
if 'response_schema' in generation_config:
|
| 197 |
+
print(f"📋 Required Fields: {generation_config['response_schema'].get('required', [])}")
|
| 198 |
+
print(f"📋 Properties: {list(generation_config['response_schema'].get('properties', {}).keys())}")
|
| 199 |
+
print("="*80 + "\n")
|
| 200 |
+
|
| 201 |
+
# Generate response
|
| 202 |
+
response = self.model_instance.generate_content(
|
| 203 |
+
prompt,
|
| 204 |
+
generation_config=generation_config
|
| 205 |
+
)
|
| 206 |
+
|
| 207 |
+
latency = time.time() - start_time
|
| 208 |
+
|
| 209 |
+
# Extract content
|
| 210 |
+
content = response.text
|
| 211 |
+
|
| 212 |
+
# Token counting (approximate - Gemini doesn't always provide exact counts)
|
| 213 |
+
prompt_tokens = self._estimate_tokens(prompt)
|
| 214 |
+
completion_tokens = self._estimate_tokens(content)
|
| 215 |
+
total_tokens = prompt_tokens + completion_tokens
|
| 216 |
+
|
| 217 |
+
# Calculate cost (Gemini 2.5 Flash pricing - approximate)
|
| 218 |
+
# Input: $0.00001875 per 1K tokens, Output: $0.000075 per 1K tokens
|
| 219 |
+
cost = (prompt_tokens / 1000 * 0.00001875) + (completion_tokens / 1000 * 0.000075)
|
| 220 |
+
|
| 221 |
+
llm_response = LLMResponse(
|
| 222 |
+
success=True,
|
| 223 |
+
content=content,
|
| 224 |
+
raw_response=response,
|
| 225 |
+
model=self.model,
|
| 226 |
+
prompt_tokens=prompt_tokens,
|
| 227 |
+
completion_tokens=completion_tokens,
|
| 228 |
+
total_tokens=total_tokens,
|
| 229 |
+
latency_seconds=latency
|
| 230 |
+
)
|
| 231 |
+
|
| 232 |
+
self.stats.add_request(llm_response, cost)
|
| 233 |
+
|
| 234 |
+
logger.info(f"✅ Response received: {completion_tokens} tokens, {latency:.2f}s")
|
| 235 |
+
logger.debug(f"Response preview: {content[:100]}...")
|
| 236 |
+
|
| 237 |
+
return llm_response
|
| 238 |
+
|
| 239 |
+
except Exception as e:
|
| 240 |
+
latency = time.time() - start_time
|
| 241 |
+
error_msg = str(e)
|
| 242 |
+
|
| 243 |
+
logger.error(f"❌ Gemini API error: {error_msg}")
|
| 244 |
+
|
| 245 |
+
llm_response = LLMResponse(
|
| 246 |
+
success=False,
|
| 247 |
+
error=error_msg,
|
| 248 |
+
model=self.model,
|
| 249 |
+
latency_seconds=latency
|
| 250 |
+
)
|
| 251 |
+
|
| 252 |
+
self.stats.add_request(llm_response, 0.0)
|
| 253 |
+
|
| 254 |
+
return llm_response
|
| 255 |
+
|
| 256 |
+
def _estimate_tokens(self, text: str) -> int:
|
| 257 |
+
"""
|
| 258 |
+
Estimate token count for text.
|
| 259 |
+
|
| 260 |
+
Rough approximation: 1 token ≈ 4 characters for English text.
|
| 261 |
+
This is not exact but sufficient for cost estimation.
|
| 262 |
+
"""
|
| 263 |
+
return len(text) // 4
|
| 264 |
+
|
| 265 |
+
def _remove_unsupported_fields(self, schema: Any) -> Any:
|
| 266 |
+
"""
|
| 267 |
+
Remove fields that are not supported by the Python SDK.
|
| 268 |
+
|
| 269 |
+
The Google AI Studio interface supports propertyOrdering, but the
|
| 270 |
+
Python SDK (google-generativeai) does NOT support it and will error.
|
| 271 |
+
|
| 272 |
+
Also removes: minLength, maxLength (validation constraints not enforced by Gemini)
|
| 273 |
+
|
| 274 |
+
Args:
|
| 275 |
+
schema: Schema dict or any nested structure
|
| 276 |
+
|
| 277 |
+
Returns:
|
| 278 |
+
Cleaned schema without unsupported fields
|
| 279 |
+
"""
|
| 280 |
+
if not isinstance(schema, dict):
|
| 281 |
+
return schema
|
| 282 |
+
|
| 283 |
+
# Fields to remove for Python SDK compatibility
|
| 284 |
+
unsupported = ['propertyOrdering', 'minLength', 'maxLength']
|
| 285 |
+
|
| 286 |
+
cleaned = {}
|
| 287 |
+
for key, value in schema.items():
|
| 288 |
+
if key in unsupported:
|
| 289 |
+
continue
|
| 290 |
+
|
| 291 |
+
# Recursively clean nested structures
|
| 292 |
+
if isinstance(value, dict):
|
| 293 |
+
cleaned[key] = self._remove_unsupported_fields(value)
|
| 294 |
+
elif isinstance(value, list):
|
| 295 |
+
cleaned[key] = [
|
| 296 |
+
self._remove_unsupported_fields(item) if isinstance(item, dict) else item
|
| 297 |
+
for item in value
|
| 298 |
+
]
|
| 299 |
+
else:
|
| 300 |
+
cleaned[key] = value
|
| 301 |
+
|
| 302 |
+
return cleaned
|
| 303 |
+
|
| 304 |
+
def generate_with_retry(self,
|
| 305 |
+
prompt: str,
|
| 306 |
+
max_retries: int = 3,
|
| 307 |
+
retry_delay: float = 1.0,
|
| 308 |
+
**kwargs) -> LLMResponse:
|
| 309 |
+
"""
|
| 310 |
+
Generate with automatic retry on failure.
|
| 311 |
+
|
| 312 |
+
Args:
|
| 313 |
+
prompt: Prompt text
|
| 314 |
+
max_retries: Maximum number of retry attempts
|
| 315 |
+
retry_delay: Delay between retries (seconds)
|
| 316 |
+
**kwargs: Generation parameters
|
| 317 |
+
|
| 318 |
+
Returns:
|
| 319 |
+
LLMResponse object
|
| 320 |
+
"""
|
| 321 |
+
for attempt in range(max_retries):
|
| 322 |
+
response = self.generate(prompt, **kwargs)
|
| 323 |
+
|
| 324 |
+
if response.success:
|
| 325 |
+
return response
|
| 326 |
+
|
| 327 |
+
if attempt < max_retries - 1:
|
| 328 |
+
logger.warning(f"Retry {attempt + 1}/{max_retries} after {retry_delay}s...")
|
| 329 |
+
time.sleep(retry_delay)
|
| 330 |
+
retry_delay *= 2 # Exponential backoff
|
| 331 |
+
|
| 332 |
+
return response
|
| 333 |
+
|
| 334 |
+
|
| 335 |
+
def create_llm_client(provider: str = "gemini", **kwargs) -> LLMClient:
|
| 336 |
+
"""
|
| 337 |
+
Factory function to create LLM client.
|
| 338 |
+
|
| 339 |
+
Args:
|
| 340 |
+
provider: Provider name ("gemini", "openai", etc.)
|
| 341 |
+
**kwargs: Provider-specific configuration
|
| 342 |
+
|
| 343 |
+
Returns:
|
| 344 |
+
LLMClient instance
|
| 345 |
+
"""
|
| 346 |
+
if provider.lower() == "gemini":
|
| 347 |
+
return GeminiClient(**kwargs)
|
| 348 |
+
else:
|
| 349 |
+
raise ValueError(f"Unknown provider: {provider}")
|
start.bat
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
@echo off
|
| 2 |
+
REM Start AI Tester, Web Viewer, and Game in parallel
|
| 3 |
+
|
| 4 |
+
echo ================================================================================
|
| 5 |
+
echo 🎮 Starting AI Catan System
|
| 6 |
+
echo ================================================================================
|
| 7 |
+
echo.
|
| 8 |
+
echo Opening THREE windows:
|
| 9 |
+
echo 1. AI Tester (monitoring AI responses)
|
| 10 |
+
echo 2. Web Viewer (http://localhost:5000)
|
| 11 |
+
echo 3. Catan Game (the actual game)
|
| 12 |
+
echo.
|
| 13 |
+
echo ================================================================================
|
| 14 |
+
echo.
|
| 15 |
+
|
| 16 |
+
REM Start AI Tester in a new window
|
| 17 |
+
start "AI Tester - Monitoring" cmd /k ".venv\Scripts\python.exe examples\ai_testing\test_ai_live.py"
|
| 18 |
+
|
| 19 |
+
REM Wait a moment for AI tester to initialize
|
| 20 |
+
timeout /t 2 /nobreak >nul
|
| 21 |
+
|
| 22 |
+
echo ✅ AI Tester started in separate window
|
| 23 |
+
echo.
|
| 24 |
+
|
| 25 |
+
REM Start Web Viewer in a new window
|
| 26 |
+
start "Web Viewer - http://localhost:5000" cmd /k ".venv\Scripts\python.exe examples\ai_testing\web_viewer.py"
|
| 27 |
+
|
| 28 |
+
timeout /t 2 /nobreak >nul
|
| 29 |
+
|
| 30 |
+
echo ✅ Web Viewer started at http://localhost:5000
|
| 31 |
+
echo.
|
| 32 |
+
echo 🌐 Opening browser...
|
| 33 |
+
timeout /t 3 /nobreak >nul
|
| 34 |
+
start http://localhost:5000
|
| 35 |
+
echo.
|
| 36 |
+
echo Starting game in this window...
|
| 37 |
+
echo.
|
| 38 |
+
|
| 39 |
+
REM Start the game in this window
|
| 40 |
+
.venv\Scripts\python.exe examples\ai_testing\play_with_prompts.py
|
| 41 |
+
|
| 42 |
+
pause
|
temp_viz_console.py
CHANGED
|
@@ -4,7 +4,7 @@ import sys
|
|
| 4 |
import time
|
| 5 |
import os
|
| 6 |
|
| 7 |
-
log_file = r"
|
| 8 |
|
| 9 |
print("PyCatan - Game Visualization Console")
|
| 10 |
print("=" * 50)
|
|
|
|
| 4 |
import time
|
| 5 |
import os
|
| 6 |
|
| 7 |
+
log_file = r"C:\GIT_new\PyCatan_AI\logs\game_viz.log"
|
| 8 |
|
| 9 |
print("PyCatan - Game Visualization Console")
|
| 10 |
print("=" * 50)
|