empty 8915a4b074 feat: implement AI Director & Narrative Voting System (Phase 9)
Add complete AI Director system that transforms the survival simulation
into a user-driven interactive story with audience voting.

Backend:
- Add DirectorService for LLM-powered plot generation with fallback templates
- Add VoteManager for dual-channel voting (Twitch + Unity)
- Integrate 4-phase game loop: Simulation → Narrative → Voting → Resolution
- Add vote command parsing (!1, !2, !A, !B) in Twitch service
- Add type-safe LLM output handling with _coerce_int() helper
- Normalize voter IDs for case-insensitive duplicate prevention

Unity Client:
- Add NarrativeUI for cinematic event cards and voting progress bars
- Add 7 new event types and data models for director/voting events
- Add delayed subscription coroutine for NetworkManager timing
- Sync client timer with server's remaining_seconds to prevent drift

Documentation:
- Update README.md with AI Director features, voting commands, and event types

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-02 03:37:41 +08:00

The Island - 荒岛生存模拟游戏

一个实时多人互动的荒岛生存模拟游戏,玩家可以通过命令与 AI 角色互动,帮助他们在荒岛上生存。

项目架构

the-island/
├── backend/           # Python FastAPI 后端服务
│   └── app/
│       ├── main.py          # 应用入口
│       ├── server.py        # WebSocket 服务器
│       ├── engine.py        # 游戏引擎核心逻辑
│       ├── models.py        # SQLAlchemy 数据模型
│       ├── schemas.py       # Pydantic 消息模式
│       ├── llm.py           # LLM 集成 (对话生成)
│       ├── memory_service.py # Agent 记忆管理服务
│       ├── twitch_service.py # Twitch 聊天机器人
│       ├── director_service.py # AI 导演服务 (叙事生成)
│       ├── vote_manager.py  # 投票管理器
│       └── database.py      # 数据库配置
├── frontend/          # Web 调试客户端
│   ├── app.js           # JavaScript 客户端
│   └── debug_client.html # 调试页面
├── unity-client/      # Unity 6 游戏客户端
│   └── Assets/
│       ├── Scripts/     # C# 游戏脚本
│       ├── Fonts/       # 字体资源 (含中文支持)
│       └── Editor/      # 编辑器工具
└── island.db          # SQLite 数据库

功能特性

游戏系统

  • 生存机制: 角色有 HP、能量、心情三大属性
  • 昼夜循环: 黎明 → 白天 → 黄昏 → 夜晚
  • 天气系统: 晴天、多云、雨天、暴风雨、炎热、雾天
  • 社交系统: 角色间自主社交互动
  • 休闲模式: 自动复活、降低难度
  • 自主行动: 角色会自动进行采集、休息、社交等行为
  • 疾病机制: 恶劣天气和低免疫力可能导致生病
  • 制作系统: 使用草药制作药品治愈疾病
  • 资源稀缺: 树木果实有限,每日再生
  • 社交角色: 领导者、追随者、独行者动态关系
  • 记忆系统: Agent 会记住重要的互动和事件
  • 随机事件: 风暴破坏、发现宝藏、野兽袭击等
  • AI 导演系统: 自动生成剧情事件,观众投票决定剧情走向
  • 叙事投票: Twitch 观众通过 !1 !2 命令参与剧情决策

玩家命令

命令 格式 金币消耗 效果
feed feed <角色名> 10g +20 能量, +5 HP
heal heal <角色名> 15g +30 HP
talk talk <角色名> [话题] 0g 与角色对话
encourage encourage <角色名> 5g +15 心情
revive revive <角色名> 10g 复活死亡角色
check check 0g 查看所有状态
reset reset 0g 重置游戏
!1 / !A !1!A 0g 投票选择第一选项
!2 / !B !2!B 0g 投票选择第二选项

AI 角色

  • Jack (勇敢) - 蓝色
  • Luna (狡猾) - 粉色
  • Bob (诚实) - 绿色

每个角色有独特性格,会根据性格做出不同反应和社交行为。

角色属性

属性 说明
HP 生命值,归零则死亡
能量 行动力,过低会影响行动
心情 情绪状态,影响社交和决策
免疫力 抵抗疾病的能力 (0-100)
社交角色 leader/follower/loner/neutral
当前行动 Idle/Gather/Sleep/Socialize 等
位置 tree_left/tree_right/campfire/herb_patch 等

技术栈

后端

  • Python 3.11+
  • FastAPI - 异步 Web 框架
  • WebSocket - 实时双向通信
  • SQLAlchemy - ORM 数据持久化
  • SQLite - 轻量级数据库
  • LiteLLM - 多 LLM 提供商支持
  • TwitchIO - Twitch 聊天集成

Unity 客户端

  • Unity 6 LTS (6000.3.2f1)
  • TextMeshPro - 高质量文本渲染
  • NativeWebSocket - WebSocket 通信
  • 2.5D 风格 - 精灵 + Billboard UI

快速开始

1. 启动后端服务

cd backend
pip install -r requirements.txt
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000

2. 启动 Unity 客户端

  1. 使用 Unity 6 打开 unity-client 文件夹
  2. 打开 Assets/Scenes/main.unity
  3. 点击 Play 运行游戏

3. Web 调试客户端 (可选)

在浏览器打开 frontend/debug_client.html

Unity 客户端结构

核心脚本

脚本 功能
NetworkManager.cs WebSocket 连接管理、消息收发
GameManager.cs 游戏状态管理、角色生成、行动系统
UIManager.cs 主 UI 界面 (顶部状态栏、底部命令输入)
EventLog.cs 事件日志面板 (显示游戏事件)
AgentVisual.cs 角色视觉组件 (精灵、血条、对话框、状态图标)
EnvironmentManager.cs 环境场景 (沙滩、海洋、天空)
WeatherEffects.cs 天气粒子效果 (雨、雾、热浪)
Models.cs 数据模型 (Agent、WorldState、事件数据)
NarrativeUI.cs AI 导演叙事界面 (剧情卡片、投票进度条、倒计时)

视觉特性

  • 程序化生成的 2.5D 角色精灵
  • Billboard UI (始终面向摄像机)
  • 动态天气粒子系统
  • 渐变天空盒 (随时间变化)
  • 海浪动画效果

中文字体支持

项目使用 思源黑体 (Source Han Sans SC) 支持中文显示。

手动配置步骤

  1. 选择 Assets/Fonts/SourceHanSansSC-Regular.otf
  2. 右键 → Create → TextMeshPro → Font Asset → SDF
  3. 打开 Edit → Project Settings → TextMesh Pro
  4. 在 Fallback Font Assets 中添加生成的字体资产

通信协议

WebSocket 端点

ws://localhost:8000/ws/{username}

事件类型

# 核心事件
TICK            # 游戏心跳
AGENTS_UPDATE   # 角色状态更新
AGENT_SPEAK     # 角色发言
AGENT_DIED      # 角色死亡

# 时间系统
PHASE_CHANGE    # 时段变化 (黎明/白天/黄昏/夜晚)
DAY_CHANGE      # 新的一天
WEATHER_CHANGE  # 天气变化

# 玩家互动
FEED            # 喂食反馈
HEAL            # 治疗反馈
TALK            # 对话反馈
ENCOURAGE       # 鼓励反馈
REVIVE          # 复活反馈
GIFT_EFFECT     # Bits 打赏特效

# 社交系统
SOCIAL_INTERACTION  # 角色间社交
AUTO_REVIVE         # 自动复活 (休闲模式)

# 自主行动系统 (Phase 13+)
AGENT_ACTION    # 角色执行行动 (采集/休息/社交等)
CRAFT           # 制作物品 (药品等)
USE_ITEM        # 使用物品
RANDOM_EVENT    # 随机事件 (风暴/宝藏/野兽等)

# AI 导演与叙事投票 (Phase 9)
MODE_CHANGE         # 游戏模式切换 (simulation/narrative/voting/resolution)
NARRATIVE_PLOT      # 导演生成的剧情事件
VOTE_STARTED        # 投票开始
VOTE_UPDATE         # 实时投票进度更新
VOTE_ENDED          # 投票结束
VOTE_RESULT         # 投票结果
RESOLUTION_APPLIED  # 剧情决议执行

Twitch 直播集成

游戏支持连接到 Twitch 直播聊天室,观众可以通过发送弹幕来控制游戏。

获取 Twitch Token

方法一Twitch Token Generator (推荐用于测试)

  1. 访问 https://twitchtokengenerator.com/
  2. 选择 "Bot Chat Token"
  3. 使用你的 Twitch 账号授权
  4. 复制 "Access Token" (以 oauth: 开头)

方法二Twitch Developer Console (生产环境)

  1. 访问 https://dev.twitch.tv/console/apps
  2. 创建新应用,类型选择 "Chat Bot"
  3. 设置 OAuth 重定向 URL: http://localhost:3000
  4. 使用 OAuth 授权码流程获取 Token
  5. 需要的权限范围: chat:read, chat:edit, bits:read

Bits 打赏转换

观众在直播间使用 Bits 打赏时,系统会自动将 Bits 转换为游戏内金币:

  • 转换比率: 1 Bit = 1 Gold
  • Unity 客户端会收到 gift_effect 事件用于显示特效

环境变量

backend/.env 文件中配置:

# LLM 配置 (选择一种)
ANTHROPIC_API_KEY=your_api_key_here
# 或
OPENAI_API_KEY=your_api_key_here
LLM_MODEL=gpt-3.5-turbo

# Twitch 配置 (可选)
TWITCH_TOKEN=oauth:your_access_token_here
TWITCH_CHANNEL_NAME=your_channel_name
TWITCH_COMMAND_PREFIX=!

必需变量

变量 说明
LLM_MODEL LLM 模型名称
ANTHROPIC_API_KEYOPENAI_API_KEY LLM API 密钥

Twitch 变量 (可选)

变量 说明
TWITCH_TOKEN OAuth Token (必须以 oauth: 开头)
TWITCH_CHANNEL_NAME 要加入的频道名称
TWITCH_COMMAND_PREFIX 命令前缀 (默认 !)

开发说明

添加新命令

  1. backend/app/schemas.py 添加事件类型
  2. backend/app/engine.py 添加命令处理逻辑
  3. unity-client/Assets/Scripts/Models.cs 添加数据模型
  4. unity-client/Assets/Scripts/NetworkManager.cs 添加事件处理

调试

  • Unity 控制台查看日志
  • Web 调试客户端查看原始消息
  • 后端日志查看服务器状态

许可证

MIT License

Description
项目名: 《荒岛:人性的试炼》 (Project: The Island) 设定: 10 个性格迥异的 AI 被投放到荒岛。有老实人、心机女、暴躁哥等。目标是活到最后。 互动循环: 白天(探索与社交): AI 搜集资源,彼此聊天。 观众互动: 免费发弹幕可以作为“风声”干扰 AI。 付费点: 大哥刷礼物空投物资包。AI 会为了争夺物资包大打出手,或者某人独占后分给其他人(建立社交地位)。 黄昏(投票与审判): 每天结束时,AI 们围坐在火堆旁,讨论今天谁贡献最少,投票流放一人。 核心付费点(赎罪券): 如果某个 AI 即将被流放,它会哭诉求饶。此时,如果有人为它刷特定礼物,它会获得“免死金牌”。该 AI 会极其感激这位救命恩人,并在后续游戏中成为恩人的死忠粉。 夜晚(梦境与密谋): AI 睡觉。 高级玩法: 大哥进入 AI 梦境(私聊),告诉它明天陷害谁。
Readme 23 MiB
Languages
C# 63.2%
Python 20.2%
ShaderLab 8.5%
GLSL 2.4%
HLSL 2.2%
Other 3.5%