工单 #8 编年史上限+分页: - engine.ts: slice(-50)→slice(-200) - ChronicleDialog.tsx: 加分页(每页10条)+上一页/下一页+页码显示 工单 #5 限时挑战 (subagent 10-a): - beacon.ts: BeaconTimedChallenge + getTimedSlotKey(4h时段) + generateTimedChallenge - BeaconPanel.tsx: amber主题限时区块 + 倒计时 + <30min紧急状态 - gameStore: trackBeacon 加 timedJustCompleted + claimTimedBeacon action 工单 #3 星潮类型深化 (subagent 10-a): - starTide.ts: +3种星潮 surge(emerald)/eclipse(rose)/prism(fuchsia) - TideModifiers: +targetLenBonus/bossWinRateBonus/autoDecodeIntervalMult - decode.ts: generatePuzzle 加 targetLenBonus 参数 - achievements: ach_tides_all 阈值 6→9 工单 #4/P2 云排行榜 (subagent 10-b): - mini-services/leaderboard-service/ (端口3030, Hono+bun, 内存1000条) - API: GET/POST /api/leaderboard + /stats + CORS + 防刷 - beacon.ts: fetchCloudLeaderboard/submitCloudScore - BeaconPanel: 本地Top20/全球Top100 双tab + YOU徽章高亮 工单 #9 手写叙事 (subagent 10-c): - chronicle.ts: EPOCH_LORE 5纪元×3节点=15段手写叙事(80-150字/段) - buildLore 优先手写节点, fallback 模板, 11个变量替换 P3 socket 多人星潮 (subagent 10-c): - mini-services/star-tide-service/ (端口3031, socket.io) - 每10-15min广播global-tide, 60s持续, 6种类型权重 - useGlobalTide hook + triggerGlobalTide action - StarTideIndicator 加 🌐 全球星潮标记 P2 UI打磨: - page.tsx: CrystalOrb 区加装饰全息环(3层旋转) + 四角标记 + 顶部状态条 + 底部铭文 QA: lint零错误 + dev HTTP200 + VLM 8/10 + 2个mini-service运行中(3030/3031)
76 lines
2.6 KiB
Markdown
76 lines
2.6 KiB
Markdown
# star-tide-service · 全球星潮同步 mini-service
|
||
|
||
> 回响星核 / Echo Nexus · P3 工单 #10-c
|
||
>
|
||
> socket.io 多人同步星潮 —— 所有在线玩家同时经历同一道全球星潮 60 秒。
|
||
|
||
## 设计
|
||
|
||
- **端口**:固定 `3031`
|
||
- **网关**:Caddy 通过 `?XTransformPort=3031` 转发;前端用 `io("/?XTransformPort=3031")`
|
||
- **运行时**:bun + socket.io 4
|
||
- **存储**:纯内存(无状态,重启不影响前端游戏)
|
||
|
||
## 星潮节奏
|
||
|
||
- 首次星潮:服务端启动后 **60 秒**(可由 env `FIRST_TIDE_DELAY_MS` 覆盖,便于 QA)
|
||
- 后续星潮:**10-15 分钟随机间隔**
|
||
- 每次持续:**60 秒**
|
||
- 类型:从 6 种星潮按权重随机抽取(与前端 `TIDE_EVENTS` 一致)
|
||
- 晶体潮 22 / 谐振风暴 20 / 遗迹共振 16 / 虚空低语 18 / 星核悸动 14 / 寂静期 10
|
||
|
||
## socket.io 事件
|
||
|
||
### 服务端 → 客户端
|
||
|
||
| 事件 | 载荷 | 触发时机 |
|
||
|------|------|---------|
|
||
| `tide-state` | `{ current: GlobalTideState \| null, nextTideAt, serverTime }` | 客户端连接时立即推送 |
|
||
| `global-tide` | `{ type, name, startedAt, endsAt, durationSec }` | 全球星潮开始 |
|
||
| `tide-ended` | `{ endedAt, nextTideAt }` | 全球星潮结束 |
|
||
| `next-tide-info` | `{ current, nextTideAt, serverTime, remainingMs }` | 响应客户端 `get-next-tide` |
|
||
|
||
### 客户端 → 服务端
|
||
|
||
| 事件 | 载荷 | 行为 |
|
||
|------|------|------|
|
||
| `get-next-tide` | — | 查询下次星潮剩余时间 |
|
||
| `admin-trigger-tide` | — | **dev/QA 用**:立即触发一次全球星潮 |
|
||
|
||
## HTTP 端点
|
||
|
||
socket.io `path: '/'` 拦截所有 HTTP 请求,因此本服务不提供独立 HTTP 健康检查端点。
|
||
|
||
- `GET /` —— socket.io 默认握手响应(`{"code":0,"message":"Transport unknown"}` 表示服务在线)
|
||
|
||
## 启动
|
||
|
||
```bash
|
||
cd mini-services/star-tide-service
|
||
bun run dev # bun --hot index.ts,热重载
|
||
# 或
|
||
bun run start # bun index.ts,无热重载
|
||
```
|
||
|
||
## QA 验证
|
||
|
||
```bash
|
||
# socket.io 在线验证(收到 JSON 响应即表示服务在线)
|
||
curl http://localhost:3031/
|
||
# 预期:{"code":0,"message":"Transport unknown"}
|
||
```
|
||
|
||
前端可在浏览器 console 触发全球星潮(QA 用):
|
||
|
||
```js
|
||
const sock = io("/?XTransformPort=3031");
|
||
sock.on("tide-state", (s) => console.log("当前状态:", s));
|
||
sock.emit("admin-trigger-tide"); // 立即触发一次全球星潮
|
||
```
|
||
|
||
## 离线容错
|
||
|
||
- 服务端宕机 → 前端 `useGlobalTide` 自动重连(socket.io 默认行为)
|
||
- 断连期间 → 前端本地 `tickTide` 继续按原节奏工作,玩家不会卡住
|
||
- 全球星潮进行中 → 前端本地 `tickTide` 暂停触发(避免冲突)
|