# 事件书

OMate的事件书功能让您可以创建和管理复杂的剧情流程、任务系统或交互式内容,增强AI聊天体验的深度和趣味性。

视频教程

# 事件书概述

事件书是由一系列事件组成的集合,每个事件都有自己的解锁条件、属性和完成条件。通过事件书,您可以:

  • 创建有序的剧情线和任务流程
  • 设计基于状态变化的事件触发机制
  • 构建复杂的交互式故事体验

# 事件书管理

# 查看事件书

事件书管理页面展示了所有可用的事件书,每个事件书卡片包含以下信息:

  • 事件书名称
  • 作者信息
  • 事件书描述
  • 包含的事件数量

# 创建新的事件书

创建一个新的事件书非常简单:

  1. 导航至「事件书」页面
  2. 点击右上角的「+」按钮
  3. 在弹出的对话框中:
    • 输入事件书名称
    • 填写作者信息(可选)
    • 添加事件书描述
  4. 点击「创建」按钮完成

# 事件管理

# 事件列表

事件列表页面展示了当前事件书中的所有事件,按照事件编号排序。每个事件卡片包含:

  • 事件编号
  • 事件标题
  • 事件描述摘要
  • 事件状态(锁定/解锁/已完成)

# 创建新事件

添加一个新事件到事件书中:

  1. 在事件书详情页面,点击「添加事件」按钮
  2. 在事件编辑页面中:
    • 输入事件标题
    • 添加事件描述
    • 设置解锁条件
    • 设置完成条件
  3. 点击「保存」按钮完成创建

# 编辑事件

您可以随时修改现有事件的内容:

  1. 在事件列表中点击要编辑的事件
  2. 在事件详情页面,点击「编辑」按钮
  3. 修改事件内容
  4. 点击「保存」按钮应用更改

# 解锁条件类型

事件可以通过两种不同的方式解锁:

# 无需解锁

该事件没有解锁条件,创建后按编号顺序可以依次触发。适用于:

  • 故事的起始事件
  • 独立的、不依赖其他事件的内容

# 其他事件完成后

当指定的一个或多个其他事件完成后解锁。适用于:

  • 剧情的顺序推进
  • 依赖于前置任务的后续内容
  • 分支故事线的汇合点

# 完成条件类型

事件可以通过三种不同的方式完成:

# 手动完成

该事件没有自动完成条件,需要用户手动标记为完成。适用于:

  • 需要玩家主观判断的任务
  • 多种完成方式的开放性任务
  • 需要人工确认的关键节点

# 状态值条件

基于聊天中状态栏的状态值自动完成。适用于:

  • 基于角色属性的事件(如健康值低于特定值)
  • 资源收集类任务(如金币达到特定数量)
  • 进度追踪(如完成度达到100%)

OMate支持多种状态比较操作符:

  • 等于/不等于
  • 大于/小于
  • 大于等于/小于等于
  • 包含/不包含
  • 为空/不为空

# 提示词识别

当聊天中出现特定提示词时自动完成事件。适用于:

  • 剧情推进检测
  • 特定对话内容的识别
  • 关键词触发的事件

# 在聊天中使用事件

事件系统与聊天功能紧密集成,可以实现动态的剧情和任务体验:

# 事件解锁与完成通知

当事件被解锁或完成时,系统会在聊天界面显示相应通知:

  • 事件解锁通知会显示新可用的事件
  • 事件完成通知会显示已完成的事件

# 状态栏的使用

要触发基于状态条件的事件完成,需要在AI回复中使用<statusBar>标签:

<statusBar>
<健康>❤️|100</健康>
<金钱>💰|500</金钱>
<能量>⚡|80</能量>
</statusBar>

系统会自动提取这些状态值,并与事件的完成条件进行比较。

# 事件查看

在聊天界面,您可以:

  1. 点击右上角的「事件」按钮
  2. 查看当前对话关联的事件书
  3. 浏览已解锁和已完成的事件
  4. 手动标记可完成的事件

# 导入与导出

OMate支持事件书的导入与导出功能,方便分享和备份:

# 导出事件书

将当前事件书导出为JSON文件:

  1. 在事件书详情页面,点击「导出」按钮
  2. 选择保存位置
  3. 系统会生成「事件书名称_时间戳.json」格式的文件

# 导入事件书

从JSON文件导入事件书:

  1. 在事件书列表页面,点击「导入」按钮
  2. 选择要导入的JSON文件
  3. 选择导入方式:
    • 新建导入:创建一个全新的事件书
    • 合并导入:将事件合并到现有事件书中

# 事件链的构建

通过设置合理的解锁和完成条件,您可以构建复杂的事件链:

  1. 线性事件链:每个事件依赖前一个事件完成后解锁
  2. 分支事件链:一个事件完成后解锁多个不同的后续事件
  3. 汇合事件链:多个事件都完成后才解锁一个新事件
  4. 条件事件链:基于状态值或提示词的动态事件流程

# 事件书模板生成

您可以使用以下提示词模板,复制粘贴并修改大体剧情,快速生成符合格式的事件书JSON:

你正在设计一个包含多个事件的[主题]故事,请规划[数量]个具有代表性事件,供用户体验。

JSON 的 schema 如下:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "required": ["id", "meta", "events"],
  "properties": {
    "id": {
      "type": "string",
      "description": "事件书唯一标识符,使用UUID格式"
    },
    "meta": {
      "type": "object",
      "required": ["name", "desp"],
      "properties": {
        "name": {
          "type": "string",
          "description": "事件书名称"
        },
        "author": {
          "type": "string",
          "description": "作者名称(可选)"
        },
        "author_link": {
          "type": "string",
          "description": "作者链接,可以是网址或邮箱地址(以http://、https://或mailto:开头)"
        },
        "desp": {
          "type": "string",
          "description": "事件书详细描述"
        }
      }
    },
    "events": {
      "type": "array",
      "items": {
        "type": "object",
        "required": ["id", "number", "title", "desp", "unlockType", "completeType"],
        "properties": {
          "id": {
            "type": "string",
            "description": "事件唯一标识符,使用UUID格式"
          },
          "number": {
            "type": "integer",
            "description": "事件编号,通常是10的倍数"
          },
          "title": {
            "type": "string",
            "description": "事件标题"
          },
          "desp": {
            "type": "string",
            "description": "事件详细描述"
          },
          "unlockType": {
            "type": "string",
            "enum": ["none", "events"],
            "description": "解锁类型,可选值: 'none'(无需解锁), 'events'(其他事件完成后)"
          },
          "unlockCondition": {
            "description": "解锁条件,内容根据unlockType有不同的结构",
            "oneOf": [
              {
                "type": "string",
                "description": "当unlockType为'none'时,可为空字符串"
              },
              {
                "type": "string",
                "description": "当unlockType为'events'时,是JSON字符串表示的事件ID数组"
              }
            ]
          },
          "completeType": {
            "type": "string",
            "enum": ["none", "status", "prompt"],
            "description": "完成类型,可选值: 'none'(手动完成), 'status'(状态值条件), 'prompt'(提示词识别)"
          },
          "compeletCondition": {
            "description": "完成条件,内容根据completeType有不同的结构",
            "oneOf": [
              {
                "type": "string",
                "description": "当completeType为'none'时,可为空字符串"
              },
              {
                "type": "string",
                "description": "当completeType为'status'时,是JSON字符串表示的状态条件对象数组"
              },
              {
                "type": "string",
                "description": "当completeType为'prompt'时,是提示词字符串"
              }
            ]
          }
        }
      }
    }
  }
}

当completeType为'status'时,compeletCondition字段包含的状态条件对象数组的schema如下:

{
  "type": "array",
  "items": {
    "type": "object",
    "required": ["key", "op"],
    "properties": {
      "key": {
        "type": "string",
        "description": "状态键名"
      },
      "op": {
        "type": "string",
        "enum": ["eq", "neq", "gt", "lt", "gte", "lte", "contains", "notcontains", "empty", "notempty"],
        "description": "操作符"
      },
      "value": {
        "description": "比较值,除了'empty'和'notempty'操作符外都需要"
      }
    }
  }
}

输出示例:

{
    "id": "a9d937aa-cde1-49b8-9fba-6bdc188cccc8",
    "meta": {
        "name": "恋爱循环",
        "author": "Gemini",
        "author_link": "",
        "desp": "一系列恋爱事件"
    },
    "events": [
        {
            "id": "c76675f9-d332-4f37-9a27-f3c08c8c2b57",
            "number": 10,
            "title": "相遇",
            "desp": "在学校门口的斜坡上, 遇到了正在奋力奔跑的 ,一个意外让他们撞到了一起,在一系列的互动后,两人留下了对方的联系方式。",
            "unlockType": "none",
            "unlockCondition": "",
            "completeType": "none",
            "compeletCondition": ""
        }
    ]
}

编号按10递增。id 随机。新的事件补充到 events 里边。在desp中,使用  代指用户, 代指角色。

将上述模板中的方括号内容替换为您自己的剧情和事件设计,然后发送给AI生成。

# 事件书JSON Schema

以下是事件书JSON的完整Schema定义,可用于验证事件书格式的正确性:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "required": ["id", "meta", "events"],
  "properties": {
    "id": {
      "type": "string",
      "description": "事件书唯一标识符,使用UUID格式"
    },
    "meta": {
      "type": "object",
      "required": ["name", "desp"],
      "properties": {
        "name": {
          "type": "string",
          "description": "事件书名称"
        },
        "author": {
          "type": "string",
          "description": "作者名称(可选)"
        },
        "author_link": {
          "type": "string",
          "description": "作者链接,可以是网址或邮箱地址(以http://、https://或mailto:开头)"
        },
        "desp": {
          "type": "string",
          "description": "事件书详细描述"
        }
      }
    },
    "events": {
      "type": "array",
      "items": {
        "type": "object",
        "required": ["id", "number", "title", "desp", "unlockType", "completeType"],
        "properties": {
          "id": {
            "type": "string",
            "description": "事件唯一标识符,使用UUID格式"
          },
          "number": {
            "type": "integer",
            "description": "事件编号,通常是10的倍数"
          },
          "title": {
            "type": "string",
            "description": "事件标题"
          },
          "desp": {
            "type": "string",
            "description": "事件详细描述"
          },
          "unlockType": {
            "type": "string",
            "enum": ["none", "events"],
            "description": "解锁类型,可选值: 'none'(无需解锁), 'events'(其他事件完成后)"
          },
          "unlockCondition": {
            "description": "解锁条件,内容根据unlockType有不同的结构",
            "oneOf": [
              {
                "type": "string",
                "description": "当unlockType为'none'时,可为空字符串"
              },
              {
                "type": "string",
                "description": "当unlockType为'events'时,是JSON字符串表示的事件ID数组"
              }
            ]
          },
          "completeType": {
            "type": "string",
            "enum": ["none", "status", "prompt"],
            "description": "完成类型,可选值: 'none'(手动完成), 'status'(状态值条件), 'prompt'(提示词识别)"
          },
          "compeletCondition": {
            "description": "完成条件,内容根据completeType有不同的结构",
            "oneOf": [
              {
                "type": "string",
                "description": "当completeType为'none'时,可为空字符串"
              },
              {
                "type": "string",
                "description": "当completeType为'status'时,是JSON字符串表示的状态条件对象数组"
              },
              {
                "type": "string",
                "description": "当completeType为'prompt'时,是提示词字符串"
              }
            ]
          }
        }
      }
    }
  }
}

# 状态条件对象Schema

当completeType为'status'时,compeletCondition字段包含的状态条件对象数组的schema如下:

{
  "type": "array",
  "items": {
    "type": "object",
    "required": ["key", "op"],
    "properties": {
      "key": {
        "type": "string",
        "description": "状态键名"
      },
      "op": {
        "type": "string",
        "enum": ["eq", "neq", "gt", "lt", "gte", "lte", "contains", "notcontains", "empty", "notempty"],
        "description": "操作符"
      },
      "value": {
        "description": "比较值,除了'empty'和'notempty'操作符外都需要"
      }
    }
  }
}

# 示例

以下是一个符合schema的事件书JSON示例:

{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "meta": {
    "name": "勇者冒险",
    "author": "OMate开发团队",
    "author_link": "https://example.com",
    "desp": "一个关于勇者冒险的故事线"
  },
  "events": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440001",
      "number": 10,
      "title": "冒险开始",
      "desp": "准备开始一段冒险之旅",
      "unlockType": "none",
      "unlockCondition": "",
      "completeType": "prompt",
      "compeletCondition": "同时满足以下两个条件 ① 历史对话已经覆盖了描述的主要剧情 ② 并且对话已推进至当前剧情的最后节点"
    },
    {
      "id": "550e8400-e29b-41d4-a716-446655440002",
      "number": 20,
      "title": "获得武器",
      "desp": "需要获得一把武器才能继续冒险",
      "unlockType": "events",
      "unlockCondition": "[\"550e8400-e29b-41d4-a716-446655440001\"]",
      "completeType": "status",
      "compeletCondition": "[{\"key\":\"装备\",\"op\":\"contains\",\"value\":\"剑\"}]"
    },
    {
      "id": "550e8400-e29b-41d4-a716-446655440003",
      "number": 30,
      "title": "打败魔王",
      "desp": "需要打败魔王完成冒险",
      "unlockType": "events",
      "unlockCondition": "[\"550e8400-e29b-41d4-a716-446655440002\"]",
      "completeType": "none",
      "compeletCondition": ""
    }
  ]
}

# 在对话中挂接事件书

要将事件书与特定对话关联起来,您需要完成以下步骤:

# 选择对话关联事件书

  1. 打开聊天对话页面
  2. 点击右上角的事件书图标(日历形状)
  3. 在弹出的事件书设置页面中:
    • 启用「启用事件书」开关
    • 从下拉菜单中选择要关联的事件书
    • 可选:启用「自动检测」开关,允许系统自动检测提示词类型事件的完成
  4. 点击返回按钮完成设置

# 查看事件状态与进度

事件书成功关联后,您可以在设置页面查看事件的状态:

  1. 每个事件都会显示其解锁状态、完成状态和激活状态
  2. 已解锁的事件会显示其详细信息,包括:
    • 事件编号
    • 事件标题
    • 事件描述
    • 解锁条件
    • 完成条件

对于每个已解锁的事件,您可以:

  • 手动标记为已完成(如果是手动完成类型)
  • 设置为当前激活事件(只能有一个激活事件)

# 事件激活机制

事件激活是事件书系统的重要功能:

  1. 只能有一个事件处于激活状态
  2. 激活的事件会成为当前故事/任务的焦点
  3. 当事件完成时,其激活状态会自动取消
  4. 您可以在事件设置页面手动激活任何已解锁的事件

# 取消事件书关联

如果您希望取消当前对话与事件书的关联:

  1. 打开事件书设置页面
  2. 关闭「启用事件书」开关
  3. 返回聊天界面