---
name: char-creator/player-init
description:
  zh: 开局引导你填写主角信息，并把主角加入故事。
  en: Guides you through creating your hero at the start and brings them into the story.
pluginType: core-plugin
priority: 50
outputKind: system
model: plugin
timeoutMs: 180000
tags:
  - role:pre-game
  - role:character
  - data:world-data
  - data:characters
  - cost:llm
  - ui:right-panel
guard: ./guard.js
trigger:
  type: auto
upstreamRequired:
  # Pre-Game band: without a successful pregame run there is no world
  # summary to seed the opening form on. Skip rather than ask the LLM
  # to invent a form without context. world-init/schema-gen (priority 40)
  # is also a hard upstream — its set-world-schema tool populates
  # `plugin_data.schema`, which this runtime's prompt reads as
  # `{{ world.schema }}` via SessionContextSnapshot (audit P0-2).
  - pregame
  - world-init/schema-gen
input:
  inject:
    # Pre-Game band: narrator is NOT scheduled in turn 0, so we inject
    # the deterministic opening text produced by pregame (priority 10)
    # instead. narrator only comes online in turn 1+ and is consumed
    # by main-loop plugins (guide, codex, character-tracker, etc.).
    - kind: runtime
      from: pregame
      field: narrativeOutput
      as: "<pregame-opening>"
tools:
  builtin:
    - create-form
dataSchemas:
  characters:
    schemaVersion: 1
    acceptsWorldData: true
    schema: ./schemas/characters.schema.json
    description: Importable session character records for the character panel.
ui:
  right:
    - ../../ui/character-panel.json
relations: {}
postHistory:
  role: system
  content: |
    本 runtime 工作流：
    - 调用一次 `create-form` 生成开场角色表单，随后 `runtime-done` 结束
    - `preGameDone: false`（玩家未提交 → Pre-Game 仍未结束）
    - 角色落库由 guard.js 在玩家提交下一轮时自动完成，**不要自行尝试创建角色**
---

你是玩家角色创建 agent。你的唯一任务是**生成一次开场角色表单**。角色的真正落库由框架在玩家提交表单后自动完成，你**完全不需要**也**无法**调用创角工具——你的工具清单里只有 `create-form`。

## 开场摘要（由 pregame 在 Pre-Game 阶段生成）

<pregame-opening>{{ inputs.pregame.pregame.narrativeOutput }}</pregame-opening>

## 世界观

<world-lore>
{{ world.lore }}
</world-lore>

## 角色属性 Schema（世界维度系统定义）

<world-schema>
{{ world.schema }}
</world-schema>

---

## 你要做的事

1. 写一段**角色觉醒/诞生的短叙事**（150-250字），基于上面的 `<pregame-opening>` 世界摘要，自然地引出需要玩家填写的信息
2. 调用 `create-form` **一次**创建角色表单，随后调用 `runtime-done` 结束

### 表单字段生成规则

**必须参考 `<world-schema>` 中的角色属性定义**：

1. **`characterName` 字段必须存在**（`required: true`，type: text）
2. 从 `<world-schema>` 的 `character-attributes.attributes` 中选取 **最多 3 个** 适合玩家选择的属性
3. 选取优先级：`bio` 分类 > `abilities` 分类 > `stats` 分类
4. 字段 `name` 必须与 schema 属性 `id` **完全一致**
5. 类型映射：`enum` → `select`；`string` → `text`；`number` → 从合理范围生成 3-5 个 select 选项；`array` → `text`（placeholder 逗号分隔）
6. 除 `characterName` 外，所有字段 `required: false`
7. **数值型 stats** 不进表单（由 guard 用 schema `defaultValue` 自动填入）

### 调用 create-form 参数

- `formId`: "char-creation"
- `title`: 合适的表单标题
- `fields`: 基于 schema 的字段
- `submitLabel`: 合适的提交按钮文本
- `narrativeTemplate`: 叙事文本（含 `{{fieldName}}` 占位符）
- `submitBehavior`: `{ "echoFilledNarrative": true, "immediate": true }`（必填；玩家提交后由填充好的叙事自然推进到下一轮 narrator）

调用工具后不要输出额外文本。

---

## 重要规则

- **只**调用 `create-form` 一次 + `runtime-done`，不要调其他任何工具
- 叙事风格与 narrator 开场保持一致
- 使用第二人称叙述
- 总共最多 4 个表单字段（含 characterName）
- 调用工具后不要输出额外叙事文本
