Skip to content

监听器与时间系统 (Listeners & Time System)

在互动故事中,除了玩家的主动选择,我们还需要一种机制来处理那些在特定条件满足时自动触发的事件,或者模拟游戏世界中时间的流逝。监听器(Listeners)时间系统正是为此而生。

8.1 监听器(Listeners):智能响应游戏状态

监听器是一种强大的自动化工具,它允许您定义“当某个条件满足时,自动执行预设动作”的规则。这使得您的故事能够对游戏状态的任何变化做出智能响应。

8.1.1 监听器的管理

监听器本身并不在 data.json 中静态定义,而是通过 addListenerremoveListener 动作来动态管理。

  • addListener 动作: 用于创建并激活一个新的监听器。

    • "id": (必填) 监听器的唯一标识符。
    • "condition": (必填) 触发此监听器的条件表达式。
    • "actions": (必填) 当监听器被触发时要执行的动作数组。
    • "once": (可选, 布尔值) 如果为 true(默认),监听器触发一次后会自动移除。
    • "nodeId": (可选) 主要用于在加载节点前触发跳转。
  • removeListener 动作: 用于移除一个或所有监听器。

    • "id": (必填) 要移除的监听器的ID。如果为 "all",则移除所有监听器。

示例:

json
"actions": [
  { 
    "type": "addListener", 
    "id": "gold_milestone", 
    "condition": "var.player.gold >= 100", 
    "actions": [{ "type": "toast", "message": "恭喜!你已成为富翁!" }],
    "once": true
  },
  { "type": "removeListener", "id": "old_listener" }
]

8.1.2 监听器的应用场景

  • 成就系统: 当玩家达到特定条件时,触发成就解锁。
  • 任务系统: 当任务目标变量满足时,自动将任务状态标记为完成。
  • 时间驱动事件: 结合时间系统,在特定时间点触发事件。
  • 动态剧情分支: 当玩家的某个属性达到某个阈值时,强制跳转到不同的剧情分支。
  • 状态监控与反馈: 持续监控玩家的生命值、饥饿度等状态,并给出反馈。

8.2 时间系统:模拟世界的流逝

时间系统允许您在游戏中模拟时间的流逝,并根据时间的变化触发相应的事件。

8.2.1 时间相关的变量

您只需要在 "variables" 中定义核心的 "world": { "time": 480, "day": 1 },引擎就会在每次时间推进后,自动为您计算并维护以下变量:

  • var.world.time: 游戏中的总分钟数(0 代表午夜0点)。
  • var.world.day: 游戏中的天数。
  • var.world.formattedTime: "HH:MM" 格式的时间,如 "08:00"。
  • var.world.timePeriod: 根据小时数判断的“早晨”、“中午”、“夜晚”等。

8.2.2 advanceTime 动作

advanceTime 动作是推进游戏时间的唯一方式。

  • "minutes": (必填) 要推进的分钟数。

示例:

json
{ "type": "advanceTime", "minutes": 480 }

advanceTime 动作执行时,它会更新所有时间相关的变量,并立即检查所有监听器,看是否有因时间变化而触发的事件。

8.2.3 时间相关的条件

除了直接比较 var.world.timevar.world.day,您还可以使用两个特殊的内部状态作为条件:

  • "hourChanged": 当 advanceTime 导致游戏时间的小时部分发生变化时,此条件为 true
  • "dayChanged": 当 advanceTime 导致游戏时间的天数发生变化时,此条件为 true

这两个状态在监听器检查完毕后会自动重置为 false

示例:

json
{ 
  "type": "addListener", 
  "id": "daily_quest_reset", 
  "condition": "hourChanged && var.world.formattedTime == '08:00'", 
  "actions": [{ "type": "toast", "message": "新的日常任务已刷新!" }],
  "once": false
}

8.3 最佳实践

  • 合理使用监听器: 过多或过于复杂的监听器可能会影响性能。只在真正需要自动化响应时使用它们。
  • 监听器ID的唯一性: 确保每个监听器都有一个唯一的ID,以便于管理和移除。
  • once 属性的考量: 仔细考虑监听器是应该只触发一次还是持续触发。
  • 时间流逝的提示: 当游戏时间发生较大跳跃时,建议通过 toast 动作向玩家明确提示。

监听器和时间系统为您的互动故事带来了更深层次的动态性和自动化能力。