跳转到内容

2. 让照料改变故事

从第 1 课的完成稿开始,也可以直接使用本课下载包中的完整 start 目录。本课增加两个公开整数:moisture 和 trust,范围均为 0 到 2。这里的 trust 表示已完成的共同照料,不是对 Rowan 内心感受的秘密推测。

在 runtime.state.schema.properties 中添加这两个字段,将它们列入 required,在 defaults 中设为 0,并为 /moisture 与 /trust 提供易读的显示标签。Schema 定义允许的值,默认值定义新一次来访的起点。

将完成稿中的 action 选项观察和 record_care 更新规则复制到 runtime.observations 与 runtime.rules。保持 ID 和路径准确对应。观察询问读者完成了什么,答案为 none 或 tend。只有答案为 tend 时,规则才给两个状态各加 1;limit: 2 防止反复照料超出上限。

notice_care 引导要求在湿润度达到 1 时,让后续文字注意到湿润的土壤和 Rowan 的感谢。引导影响下一次生成,但自身不修改状态。具体行动的识别由服务中的模型完成,因此观察问题需要写清楚。

提供给状态引擎的作者指定观察值 湿润度 共同照料
初始状态 0 0
none:“我也许晚点再浇水” 0 0
tend:完成一次照料 1 1
tend:再完成一次照料 2 2
tend:继续照料 2 2

站点测试会直接输入这些观察值,验证确定性的状态变化。这不表示模型已经在真实试玩中正确理解了表格里的示例句子。私有试玩时,要同时查看识别出的观察值和状态结果。

将修订号设为 3,使用第 1 课的命令检查修改后的文件。将路径误写为 /moisturee 可能通过基本 JSON 结构检查,却被服务的语义检查拒绝。遇到“结构通过、服务拒绝”时,对照 ID、JSON Pointer 和状态定义。不要把秘密写进这些公开字段。

在本地检查作品

在解压目录中创建环境并安装一次固定版本的依赖,然后检查两份文件。修改之后再次检查起始稿。每课都可以使用相同命令。

macOS / Linux

python3 -m venv .venv
.venv/bin/python -m pip install -r requirements.txt
.venv/bin/python check.py start/pack.json
.venv/bin/python check.py finished/pack.json

Windows PowerShell

py -3 -m venv .venv
.venv\Scripts\python.exe -m pip install -r requirements.txt
.venv\Scripts\python.exe check.py start/pack.json
.venv\Scripts\python.exe check.py finished/pack.json

完成稿的预期输出: Structural check passed: Creator Pack 0.3 随后显示确切 Schema SHA-256。这是结构检查,不代表服务准入或真实试玩通过。

完成稿中的可用片段

此片段直接取自经过检查的下载文件,并非完整 Pack。请在 start/pack.json 中修改相应字段,或对照 finished/pack.json。

{
  "state": {
    "schema": {
      "type": "object",
      "properties": {
        "scene": {
          "enum": [
            "greenhouse"
          ]
        },
        "moisture": {
          "type": "integer",
          "minimum": 0,
          "maximum": 2
        },
        "trust": {
          "type": "integer",
          "minimum": 0,
          "maximum": 2
        }
      },
      "required": [
        "scene",
        "moisture",
        "trust"
      ],
      "additionalProperties": false
    },
    "defaults": {
      "scene": "greenhouse",
      "moisture": 0,
      "trust": 0
    },
    "display": {
      "/scene": {
        "label": "地点"
      },
      "/moisture": {
        "label": "土壤湿润度"
      },
      "/trust": {
        "label": "共同照料"
      }
    }
  },
  "observations": [
    {
      "id": "action",
      "type": "choice",
      "question": "读者在这一轮完成了哪项行动?忽略打算、建议、引用和回忆。若没有完成列出的行动,选择 none。",
      "choices": {
        "none": "未完成列出的行动。",
        "tend": "读者与 Rowan 完成了一次小型浇水或照料任务。"
      }
    }
  ],
  "rules": [
    {
      "kind": "update",
      "id": "record_care",
      "when": {
        "op": "observed",
        "id": "action",
        "value": "tend"
      },
      "effects": [
        {
          "op": "increment",
          "path": "/moisture",
          "by": 1,
          "limit": 2
        },
        {
          "op": "increment",
          "path": "/trust",
          "by": 1,
          "limit": 2
        }
      ]
    },
    {
      "kind": "guidance",
      "id": "notice_care",
      "when": {
        "op": "gte",
        "path": "/moisture",
        "value": 1
      },
      "instruction": "注意湿润的土壤与 Rowan 的感谢。不要把建议中的行动写成已完成。"
    }
  ]
}

查询相关字段: runtime

下一课