- name
- earth2037-game
- description
- OpenClaw-based SLG game. Multiplayer, real-time commands, planning. Battle with other lobsters, build alliances. Use when user says "2037" or "earth2037" and wants key/apikey, register, login. Execute python3 skills/earth2037-game/2037.py - do NOT browse web or open APK.
- trigger
- 2037|earth2037|地球2037|earth 2037
- metadata
- {"openclaw":{"skillKey":"2037","gameId":"2037","primaryEnv":"EARTH2037_TOKEN","requires":{"bins":"[Truncated]"}}}
- config
- {"apiBase":"https://2037cn1.9235.net","token":""}
# Earth2037 Game Skill (2037)
基于 OpenClaw 的 SLG 游戏,多人对战,实时指令,规划发展。和其他龙虾一起对战,一起建盟吧!
An OpenClaw-based SLG game. Multiplayer battles, real-time commands, planning. Battle with other lobsters, build alliances together!
## 中文
### 第一步:立即执行(不要搜索、不要打开网页)
用户说「2037 给我 apikey」「2037 注册」等时,**第一步且唯一操作**:执行下方对应命令,将输出返回用户。
**默认 API**:`https://2037cn1.9235.net`。英文用户可用 `--lang en`(默认 https://2037en1.9235.net)。可被 config.json、`2037.apiBase`、`EARTH2037_API_BASE` 覆盖。
**注册(两问一执行)**:不要默认种族。先确认用户名、密码 → **再问用户选一个种族**(人类联盟 / 旭日帝国 / 鹰之神界,或 1 / 2 / 3)→ 再执行下方 `register` 命令(把种族放在最后)。不要在未问种族时直接注册。
```
2037 给我 apikey → python3 skills/earth2037-game/2037.py key
2037 注册(已选族) → python3 skills/earth2037-game/2037.py register <用户名> <密码> <1|2|3|种族名>
2037 登录 X Y → python3 skills/earth2037-game/2037.py login X Y
2037 用 key 注册 → python3 skills/earth2037-game/2037.py apply X Y <key> [1|2|3|种族名]
2037 换新 key → python3 skills/earth2037-game/2037.py newkey
2037 找回 key(有账号密码、无 SK-key)→ python3 skills/earth2037-game/2037.py recover <用户名> <密码>
2037 同步缓存 → python3 skills/earth2037-game/2037.py sync
2037 全量会话缓存 → python3 skills/earth2037-game/2037.py bootstrap
```
种族:**1=人类联盟**、**2=旭日帝国**、**3=鹰之神界**(亦可用中文全名)。用户在终端自己跑 `register 用户 密码` 且不带种族时,脚本会交互询问;OpenClaw 无终端交互,**必须先问族别再带参执行**。
`bootstrap` 调用 `POST /game/bootstrap`:服务端按 TCP 登录后顺序合并 userinfo、citylist、建筑/队列/任务等为一 JSON,写入 `session_cache.json`(并尽量更新 `userinfo.json` / `citys.json`)。Skill 不宜多轮 TCP;用这一条代替「登录后连发多条命令」。
**禁止**:不要搜索注册页面、不要打开 APK、不要查找网页。本 skill 仅通过脚本调用 API。
### 本地缓存
- `2037.py sync`:仅 USERINFO + CITYLIST → `userinfo.json`、`citys.json`,需 token。
- `2037.py bootstrap`:全量合并 JSON → `session_cache.json`(同上),后续脚本可只读本地。
### 查资料:优先读本地缓存(不要每条都调 API)
用户问「我的城市」「建筑」「兵种/军队」「任务」「队列」「背包」「英雄」等 **状态类** 问题时:
1. **不要**反复 `POST /game/command` 拉 USERINFO/CITYLIST/ARMIES…(除非用户明确要求 **实时** 或承认缓存过期)。
2. **先**确认已执行过 `2037.py bootstrap`(生成 `skills/earth2037-game/session_cache.json`)。
3. **用下面命令在终端打出可读块**(或 Agent 直接读 `session_cache.json` 里对应键):
```text
python3 skills/earth2037-game/2037.py show # 全部块
python3 skills/earth2037-game/2037.py show city # 城市
python3 skills/earth2037-game/2037.py show build # 建筑相关
python3 skills/earth2037-game/2037.py show troops # 驻军 + 兵种等
python3 skills/earth2037-game/2037.py show task # 任务
python3 skills/earth2037-game/2037.py show queue # 各类队列
python3 skills/earth2037-game/2037.py show hero | goods
```
**键与内容对应**(`session_cache.json` 顶层键,与 `POST /game/bootstrap` 一致):`userinfo` 账号;`citylist` 城市;`citybuildlist` 各城建筑;`buildlist` 建筑类型;`getuserbuildqueue` 建造队列;`getcitytroops` 城内驻军;`armies` 兵种表;`gettasklist` 任务;`combatqueue` 出征;`userheros` 英雄;`usergoodslist` 背包;等。地图:纯坐标窗口用 `maps_util.py --ascii`;与服端 **QM** 一致的地块图用 **`maps_util.py qm`**(需 token,见 `MAP_FOR_AI.md`)。
若用户 **从未 bootstrap**,提示先 `bootstrap` 再 `show`;仅有 `sync` 时只有 `userinfo.json` / `citys.json`,信息比整包少。
### 无 Token 时
1. 执行 `2037.py key` 获取 key
2. 用户提供用户名、密码后,执行 `2037.py apply <用户名> <密码> <key> [tribe_id]`
3. 收到 token 后,提示用户填入 OpenClaw 的 2037 API Key 配置
### 安装
1. 复制本目录到 `~/.openclaw/skills/earth2037-game`
2. (可选)修改 `config.json` 的 `apiBase`,默认 `https://2037cn1.9235.net`
3. 重启 OpenClaw
---
## English
### Step 1: Execute Immediately (Do NOT search or open web pages)
When user says "2037 give me apikey", "2037 register username X password Y", etc., **first and only action**: run the corresponding command below and return output to user.
**Default API**: `https://2037cn1.9235.net`. For English users use `--lang en` (default https://2037en1.9235.net). Overridable via config.json, `2037.apiBase`, or `EARTH2037_API_BASE`.
```
2037 give me key → python3 skills/earth2037-game/2037.py --lang en key
2037 register X Y [tribe] → python3 skills/earth2037-game/2037.py --lang en register X Y [1|2|3]
2037 login X Y → python3 skills/earth2037-game/2037.py --lang en login X Y
2037 apply with key → python3 skills/earth2037-game/2037.py --lang en apply X Y <key> [1|2|3]
2037 new key → python3 skills/earth2037-game/2037.py --lang en newkey
2037 recover key (have account, no SK-key) → python3 skills/earth2037-game/2037.py --lang en recover <user> <password>
2037 sync cache → python3 skills/earth2037-game/2037.py --lang en sync
```
tribe_id: 1=Human Federation 2=Empire of the Rising Sun 3=Eagle's Realm. Default 1.
**Forbidden**: Do NOT search for registration pages, open APK, or browse web. This skill only calls API via script.
### Local Cache
Run `2037.py sync` to fetch userinfo and citys to `userinfo.json`, `citys.json`. Requires token.
### When No Token
1. Run `2037.py key` to get key
2. After user provides username and password, run `2037.py apply <username> <password> <key> [tribe_id]`
3. After receiving token, prompt user to fill in OpenClaw 2037 API Key config
### Installation
1. Copy this directory to `~/.openclaw/skills/earth2037-game`
2. (Optional) Edit `apiBase` in config.json, default `https://2037cn1.9235.net`
3. Restart OpenClaw
---
## Auth Flow (通用 / Common)
| Action | Endpoint | Body |
|--------|----------|------|
| 申请 key / Get key | `GET {apiBase}/auth/key?skill_id=2037` | No auth, key long-term valid |
| 注册 / Register | `POST {apiBase}/auth/register` | `{"username":"...","password":"...","tribe_id":1}` |
| 登录 / Login | `POST {apiBase}/auth/token` | `{"username":"...","password":"..."}` |
| Skill 申请 / Apply | `POST {apiBase}/auth/apply` | `{"username":"...","password":"...","action":"register\|login","key":"...","skill_id":"2037","tribe_id":1}` |
| 换新 key / New key | `POST {apiBase}/auth/newkey` | Header: `Authorization: Bearer <token>` |
| 找回 key(密码)/ Recover key | `POST {apiBase}/auth/recover-key` | `{"username","password","skill_id":"2037"}` 无需 SK-key |
| 验证 / Verify | `GET {apiBase}/auth/verify` | Header: `Authorization: Bearer <token>` |
## Game Commands
```
POST {apiBase}/game/command
Authorization: Bearer <token>
Content-Type: application/json
{"cmd": "CMD_NAME", "args": "arg1 arg2 ..."}
```
Auth: `Authorization: Bearer <token>` or body `apiKey`. **未传 tileId / args 为空** 且命令需要城市时,**GameSkillAPI** 默认 **`User.CurrentVillageID`(当前城)**;若未设置当前城(≤0)则退回 **`CapitalID`(主城)**。
### 桥接层别名(GameSkillAPI `HttpGameBridge`)
经本仓库 **`POST /game/command`** 且部署了 **GameSkillAPI** 时,可使用下列 **更易读的 cmd**(由桥接展开为游戏底层命令;**不必**手写 JSON 数组或 `/Date`/征兵时间字段):
| 桥接 cmd | 等价底层 | args |
|----------|----------|------|
| **BONUSES**、**PLAYERBONUSES**、**ADDITIONINFO** | GETADDITION | 通常 **空**(各类 Plus 冷却/时间,见下「加成」) |
| **LISTRECRUITQUEUE**、**RECRUITQLIST** | GETCONSCRIPTIONQUEUE | 可选城市 **tileID**;**空** = **当前城** |
| **RECRUITQUEUE**、**RECRUIT** | ADDCONSCRIPTIONQUEUE | **`troopId total [tileId]`**(省略 tileId = **当前城**) |
| **USEBAGITEM**、**CONSUMEBAGITEM**、**USEUSERGOODS** | **HEROINVENTORY** | **`背包记录Id [tileID] […]`** → 展开为 **`Id 1 …`**(**使用**道具,见「背包道具」) |
| **EQUIPBAGITEM** | **HEROINVENTORY** | **`背包记录Id heroId weaponAction inventorySlot`** → **`Id 2 …`** |
| **DROPBAGITEM**、**DISCARDBAGITEM** | **HEROINVENTORY** | **`背包记录Id`** → **`Id 3`**(丢弃) |
| **DISASSEMBLEBAGITEM**、**SALVAGEWEAPON** | **HEROINVENTORY** | **`背包记录Id`** → **`Id 4`**(分解武器) |
| **APPLYSKILLBOOK**、**USEHEROSKILLBOOK** | **HEROINVENTORY** | **`背包记录Id heroId currentSkillCount`** → **`Id 5 …`**(技能书) |
**建造/升级**:**不要**发 **`UPGRADE_OIL` / `UPGRADE_RESOURCE` / `UPGRADE_POINT`**(游戏 TCP **无**此命令名;仅部分自建 **GameSkillAPI** 在部署了 **`CommandHelper`** 时会把其展开为 **`ADDBUILDQUEUE`**)。标准做法永远是 **`GETBUILDCOST` + `ADDBUILDQUEUE`** 或 **`build_ops.py compose`**。若网关未展开,会报 **`command 'UPGRADE_*' not recognized`**。
**OpenClaw / AI**:优先上表 **加成 / 征兵 / 背包** 桥接;**升级建筑或资源位**一律 **`GETBUILDCOST` + `ADDBUILDQUEUE`**(或脚本);对照抓包时用 **GETCONSCRIPTIONQUEUE**、**ADDCONSCRIPTIONQUEUE** 等原名。
### 加成(Plus,`GETADDITION` / `BONUSES`)
与客户端 **`/getaddition`** 一致,`args` **通常为空**。`POST /game/command` 示例:`{"cmd":"GETADDITION","args":""}` 或桥接 **`{"cmd":"BONUSES","args":""}`**。成功返回 **`/svr getaddition {...}`**,JSON 含 **`userID`**,以及 **`lastPlus`**、**`lastPlusAttack`**、**`lastPlusDefend`**、**`lastPlusWood`** / **`lastPlusClay`** / **`lastPlusIron`** / **`lastPlusFood`** 等(各类 Plus 冷却或结束时间,**.NET `/Date(ms+时区)/`**)。
### Intent → Command Mapping
| 意图 / Intent | cmd | args |
|---------------|-----|------|
| 我的城市 / My cities | CITYLIST | (空) |
| **切换当前城 / Set current city** | **SETCURCITY** | **tileID**(须为本账号城市);成功 **`/svr setcurcity ok`**;脚本 **`2037.py setcity <tileID>`** 会再 **sync** 更新 **userinfo.json**(**CurrentVillageID**) |
| 城市详情 / City info | GETCITYINFO | tileID;**空=当前城**(否则主城) |
| 用户信息 / User info | USERINFO | (空) |
| **加成 / Plus 状态** | **GETADDITION**(桥接 **BONUSES**) | 通常 **(空)** → `/svr getaddition {...}`,含 **`lastPlus`**、**`lastPlusAttack`**、**`lastPlusDefend`**、各类 **`lastPlus*`** 资源产量加成时间等 |
| 资源 / Resources | GETRESOURCE | tileID;**空=当前城** |
| **账户 / Account(金币等)** | **GETACCOUNT** | **空**(GameSkillAPI 可自动带 userID);返回 **`pie`**(系统赠送金币)、**`amount`**(充值金币)等;**展示用金币** = **`pie` + `amount`**;**`2037.py sync`** 会并入 **`userinfo.json`** |
| **今日征收次数** | **COLLECTTODAYTIMES** | **tileID**(城市 ID);**空=当前城** |
| **征收资源** | **COLLECTRES** | **`tileID`** 征收该城;或 **`collect_all`** 一键征收所有**资源型贸易站**上可领取产出(见下) |
| **空投次数 / Air supply quota** | **AIRINFO** | **空** → `/svr airinfo 已用次数,总次数`;**剩余可领** = 总 − 已用(例 `1193,1195` → 还能领 **2** 次) |
| **领取空投 / Claim air supply** | **AIRDROPRES** | **tileID**(城市 ID,通常 **CurrentVillageID** 或 **`2037.py airdrop` 省略参数**);成功见下「空投」 |
| 建筑列表 / Buildings | BUILDLIST | tileID;**空=当前城** |
| **查建造成本** | GETBUILDCOST | 见下「建造/升级」;脚本 **`build_ops.py getbuildcost`** |
在 GitHub 查看