Add environment documentation from Openverse builder
This commit is contained in:
231
environment.md
Normal file
231
environment.md
Normal file
@@ -0,0 +1,231 @@
|
||||
# **TextArena Game Design Document: “Runic Grid”**
|
||||
|
||||
*(Design stage only – no code yet)*
|
||||
This design invents an original game, **Runic Grid**, inspired structurally by turn-based spatial strategy but **completely distinct** in theme, background, and terminology from any tic-tac-toe or negotiation examples.
|
||||
|
||||
---
|
||||
|
||||
## 1. Concept Paragraph
|
||||
|
||||
In **Runic Grid**, two rival mystics, the **Solar Scribe** and the **Lunar Scribe**, compete to inscribe magical runes onto a sacred 3×3 **Runic Tablet**. Each cell of the Tablet can bear only one rune, either a **Sun Rune (☼)** or a **Moon Rune (☽)**. The goal is to channel divine alignment by creating a continuous triad of your own rune horizontally, vertically, or diagonally before your opponent does. This design has no themes of trade, debate, or negotiation—it is a deterministic puzzle duel of pattern claiming. The core actions are **[Inscribe:x,y]**, where each player selects a tile to mark on their turn.
|
||||
|
||||
---
|
||||
|
||||
## 2. Roles and Win Condition
|
||||
|
||||
- **Players**:
|
||||
- Player 1: *Solar Scribe* (places **Sun Runes, ☼**)
|
||||
- Player 2: *Lunar Scribe* (places **Moon Runes, ☽**)
|
||||
|
||||
- **Win Condition**:
|
||||
A player wins immediately upon forming three of their runes in a continuous line—horizontal, vertical, or diagonal—on the Runic Tablet.
|
||||
|
||||
- **Loss Condition**:
|
||||
The opponent achieves a triad alignment first.
|
||||
|
||||
- **Draw Condition**:
|
||||
All nine cells are occupied with no winning triad.
|
||||
|
||||
---
|
||||
|
||||
## 3. Turn Structure and Determinism
|
||||
|
||||
- Turns alternate between Solar and Lunar Scribe starting with Solar Scribe.
|
||||
- One action per turn.
|
||||
- Deterministic: No randomness; the entire environment is reproducible from the same sequence of moves and initial seed.
|
||||
- Maximum turn count: **9** (since there are 9 cells).
|
||||
- Each step is deterministic; random seed affects only initial player ordering if randomized (optional).
|
||||
|
||||
---
|
||||
|
||||
## 4. Action Grammar (Machine-Parseable)
|
||||
|
||||
**Allowed Action Format**:
|
||||
Each player submits an action inside `\boxed{{}}`.
|
||||
Inside the braces, the content must follow one of the following patterns:
|
||||
|
||||
### 4.1 `[Inscribe:x,y]`
|
||||
|
||||
Places the player's rune at coordinates `(x, y)` on the 3×3 Runic Tablet.
|
||||
|
||||
- **Pattern**:
|
||||
```
|
||||
^\[Inscribe:(?:[0-2]),(?:[0-2])\]$
|
||||
```
|
||||
where `x` and `y` are integers 0, 1, or 2 representing row and column indexes.
|
||||
|
||||
- **Interpretation**:
|
||||
(0,0) = top-left, (2,2) = bottom-right.
|
||||
|
||||
- **Example Valid Action**:
|
||||
```
|
||||
[Inscribe:1,2]
|
||||
```
|
||||
→ Marks the middle-right cell.
|
||||
|
||||
- **Example Invalid Action**:
|
||||
```
|
||||
[draw:1,2]
|
||||
```
|
||||
→ Invalid because the verb “draw” does not match required token “Inscribe”.
|
||||
|
||||
Another invalid example:
|
||||
```
|
||||
[Inscribe:3,0]
|
||||
```
|
||||
→ Invalid because coordinate 3 is outside permitted range 0–2.
|
||||
|
||||
**Only one grammar token exists**; the rest of the system enforces availability, legality, and turn order.
|
||||
|
||||
---
|
||||
|
||||
## 5. Game State Schema
|
||||
|
||||
Full run-time `game_state` example:
|
||||
|
||||
```json
|
||||
{
|
||||
"turn_count": 4,
|
||||
"current_player": "Solar Scribe",
|
||||
"board": [
|
||||
["☼", "☽", null],
|
||||
[null, "☼", null],
|
||||
["☽", null, null]
|
||||
],
|
||||
"players": {
|
||||
"Solar Scribe": {
|
||||
"symbol": "☼",
|
||||
"actions": ["[Inscribe:0,0]", "[Inscribe:1,1]"]
|
||||
},
|
||||
"Lunar Scribe": {
|
||||
"symbol": "☽",
|
||||
"actions": ["[Inscribe:0,1]", "[Inscribe:2,0]"]
|
||||
}
|
||||
},
|
||||
"winner": null,
|
||||
"outcome": "ongoing",
|
||||
"observations": [
|
||||
{"player": "Solar Scribe", "action": "[Inscribe:0,0]"},
|
||||
{"player": "Lunar Scribe", "action": "[Inscribe:0,1]"},
|
||||
{"player": "Solar Scribe", "action": "[Inscribe:1,1]"},
|
||||
{"player": "Lunar Scribe", "action": "[Inscribe:2,0]"}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. Initialization Rules
|
||||
|
||||
- The board initializes as a 3×3 matrix of `null`.
|
||||
- Turn count = 0.
|
||||
- `current_player` defaults to *Solar Scribe*, unless overridden by a deterministic seed-controlled random choice.
|
||||
- No randomness affects board contents.
|
||||
- `game_state["observations"]` starts empty.
|
||||
- At reset, the first observation returned describes player identities, symbol assignments, and available actions.
|
||||
|
||||
---
|
||||
|
||||
## 7. Validation and Error Handling
|
||||
|
||||
On each step, before updating the state:
|
||||
|
||||
1. **Extract content** between `\boxed{{}}` using `_extract_answer_content(action: str) → str`.
|
||||
If missing or malformed, mark move invalid with reason `"Malformed boxed syntax"`.
|
||||
|
||||
2. **Check Regex Pattern**:
|
||||
Must match `^\[Inscribe:[0-2],[0-2]\]$`.
|
||||
If not, invalid with reason `"Action does not match grammar [Inscribe:x,y]"`.
|
||||
|
||||
3. **Check Turn Ownership**:
|
||||
If action comes from incorrect player, invalid with reason `"Action out of turn"`.
|
||||
|
||||
4. **Check Tile Availability**:
|
||||
If the chosen cell is already marked, invalid with reason `"Tile already inscribed"`.
|
||||
|
||||
Invalid actions trigger `set_invalid_move(player, reason)` and the turn passes without board change.
|
||||
|
||||
---
|
||||
|
||||
## 8. Terminal Conditions and Scoring
|
||||
|
||||
**Terminal Checks each turn:**
|
||||
|
||||
1. **Triad Alignment**:
|
||||
After a valid inscription, check all possible lines for three identical rune symbols belonging to the acting player.
|
||||
- If true → `winner = that player`, `outcome = "win"`.
|
||||
2. **Draw**:
|
||||
If the board is full (`9 moves`) and no winner → `outcome = "draw"`.
|
||||
3. **Otherwise** → `outcome = "ongoing"`.
|
||||
|
||||
**Scoring Rules**:
|
||||
- Win: +1 point to the winner, 0 to loser.
|
||||
- Draw: 0 points both sides.
|
||||
|
||||
No fractional or cumulative scoring beyond the single session.
|
||||
|
||||
**Tie-Breaker**: None; draw is final.
|
||||
|
||||
---
|
||||
|
||||
## 9. Player Prompt Specification
|
||||
|
||||
### Prompt Outline for `_generate_player_prompt`
|
||||
|
||||
Identity:
|
||||
> You are a **mystic scribe** engraving the sacred **Runic Tablet** to align divine energies.
|
||||
> On your turn, you use the `[Inscribe:x,y]` action to claim an empty slot on the 3×3 grid.
|
||||
> Your goal: form a continuous line of your rune symbols before your opponent does.
|
||||
|
||||
Rules Recap:
|
||||
- Solar Scribe marks **☼**, Lunar Scribe marks **☽**.
|
||||
- Valid format: `\boxed{{[Inscribe:x,y]}}` where `x` and `y` are 0–2.
|
||||
- You may not inscribe an already-occupied tile.
|
||||
- Example grid coordinate map:
|
||||
```
|
||||
(0,0) (0,1) (0,2)
|
||||
(1,0) (1,1) (1,2)
|
||||
(2,0) (2,1) (2,2)
|
||||
```
|
||||
|
||||
Response Format Requirement:
|
||||
- Provide any reasoning text first.
|
||||
- Conclude with your action token within `\boxed{{}}`.
|
||||
|
||||
### Few-Shot Examples
|
||||
|
||||
```
|
||||
Example valid response:
|
||||
I shall inscribe my rune on the center tile for strength.
|
||||
\boxed{{[Inscribe:1,1]}}
|
||||
|
||||
Example invalid response:
|
||||
I think I will go middle-right.
|
||||
\boxed{{Move:1,2}}
|
||||
```
|
||||
|
||||
Ensure every response ends with exactly one `\boxed{{}}` block containing the action token.
|
||||
|
||||
---
|
||||
|
||||
## 10. API Mapping Plan
|
||||
|
||||
| Method | Purpose | Reads / Writes | Outcome Handling |
|
||||
|---------|----------|----------------|------------------|
|
||||
| **`reset(seed)`** | Initializes `game_state`, applies seed (e.g., random start player if supported), returns initial observation of empty board and player roles. | Sets `turn_count=0`, clears `observations`, resets `winner/outcome`. | Returns observation for both players with board layout and available format instructions. |
|
||||
| **`step(player_id, action)`** | Processes player’s action each turn, updates `board`, verifies legality, appends to `observations`, checks for terminal conditions. | Reads current board, writes updated cell, increments `turn_count`, flips `current_player`. | Returns updated observation, `done` flag if terminal, and optional reward dictionary `{+1,0}`. |
|
||||
| **`_generate_player_prompt(player_id)`** | Constructs human-readable prompt describing game status, coordinates, runes, and legal actions. | Reads entire `game_state` to present board, current turn, valid syntax. | Ensures prompt ends with instruction: *“Put your final answer within \boxed{{}} at the end of your response.”* |
|
||||
|
||||
---
|
||||
|
||||
## 11. Copy-Check Against Example
|
||||
|
||||
- **Theme Check**: Distinct from negotiation example—no trading, communication, or offers.
|
||||
- **Objective Check**: Pattern-alignment on a Runic Tablet vs. any negotiation outcomes.
|
||||
- **Terminology**: Original names—*Runic Tablet*, *Solar Rune*, *Lunar Rune*, *Inscribe*—entirely unique.
|
||||
- **Game state keys**: `"board"`, `"players"`, `"observations"`, `"turn_count"`, `"winner"`, `"outcome"` are original to this schema.
|
||||
- **Prompt and grammar**: Use custom `[Inscribe:x,y]` format unseen in example sources.
|
||||
|
||||
---
|
||||
|
||||
**End of Design Document for “Runic Grid”**
|
||||
Reference in New Issue
Block a user