小布工坊.
← 回到资源库

资源详情 · 虚拟生活

只按连续运行时间推进虚拟生活

用运行标识、实际时间和单调计时共同检查连续性,让虚拟目标在可信的定时更新中逐步推进;重启、长时间间隔与时钟异常会重新建立锚点。

资源正文、示例和许可证保留原文。代码仅展示,不会在线执行或调用AI。

资源详情

适合学习虚拟角色日程、游戏进度或模拟系统的时间处理。状态描述的是虚构目标,更新应由本地调度器调用;读取状态或收到聊天消息时不自动增加进度,离线期间也不补写已经发生的经历。

使用前准备

适用平台
Windows · macOS · Linux
内容更新
  • 准备 Node.js 24 和文本编辑器;本站仅在 Node.js v24.19.0 的本地环境核对附带示例。
  • 先理解 runId、实际时间与单调计时;正式应用需由可信定时器调用。
node virtual-life.mjs

先在文件所在文件夹打开终端。本例无需 npm install,不联网、不调用 AI 接口;不含真实平台接入。

常见卡点

  • 保存为指定 .mjs 文件,避免变成 .mjs.txt;不要复制 Markdown 的三反引号。
  • 重启不会补算离线经历;本例不包含生图、主动聊天或自动存储。
官方网站与安装说明 ↗

完整正文

// SPDX-License-Identifier: MIT
// 原创教学示例:由可信定时器调用;每次进程启动生成新的 runId。
export function advanceLife(previous, options = {}) {
  const {
    runId, nowMs = Date.now(), monotonicMs = performance.now(),
    goalMs = 60000, maxGapMs = 10000,
  } = options;
  if (typeof runId !== "string" || !runId.trim() || runId.length > 64 ||
      !Number.isSafeInteger(nowMs) || nowMs < 0 ||
      !Number.isFinite(monotonicMs) || monotonicMs < 0 ||
      !Number.isSafeInteger(goalMs) || goalMs < 1 ||
      !Number.isSafeInteger(maxGapMs) || maxGapMs < 1) {
    throw new TypeError("运行标识或计时参数无效");
  }
  const old = previous && typeof previous === "object" ? previous : {};
  const valid = old.goalMs === goalMs &&
    Number.isFinite(old.progressMs) && old.progressMs >= 0 &&
    old.progressMs <= goalMs && Number.isSafeInteger(old.wallMs) &&
    old.wallMs >= 0 && Number.isFinite(old.monotonicMs) && old.monotonicMs >= 0;
  let progressMs = valid ? old.progressMs : 0;
  if (valid && old.runId === runId) {
    const wallGap = nowMs - old.wallMs;
    const monoGap = monotonicMs - old.monotonicMs;
    const continuous = wallGap >= 0 && wallGap <= maxGapMs &&
      monoGap >= 0 && monoGap <= maxGapMs && Math.abs(wallGap - monoGap) <= 1000;
    if (continuous) progressMs = Math.min(goalMs, progressMs + monoGap);
  }
  return {
    runId, wallMs: nowMs, monotonicMs, goalMs, progressMs,
    phase: progressMs === goalMs ? "complete" : progressMs > 0 ? "working" : "planned",
  };
}

let life = advanceLife(null, { runId: "demo-run", nowMs: 0, monotonicMs: 0 });
life = advanceLife(life, { runId: "demo-run", nowMs: 5000, monotonicMs: 5000 });
console.log(life.progressMs); // 5000
life = advanceLife(life, { runId: "new-run", nowMs: 60000, monotonicMs: 0 });
console.log(life.progressMs); // 仍为 5000,重启只建立新锚点。

使用教程

资源自带示例先连续推进五秒,再模拟进程重启。重启后只建立新锚点,不把离线时间补成虚构经历。

  1. 保存完整代码

    复制函数及末尾两次调用,保存为 virtual-life.mjs,保留许可证说明。示例已显式提供演示时间,不需要调整系统时钟。

  2. 运行两次更新

    在文件目录的终端执行下方命令。第一次同 runId 的连续更新累积 5000 毫秒;第二次换 runId 模拟重启。

  3. 核对不补算离线

    两行都应为 5000,而不是重启时的 60000。正式应用要由可信定时器调用,并在每次进程启动时生成新的 runId。

保存文件名
virtual-life.mjs
运行环境
Node.js 24;本站实际核验版本为 v24.19.0。使用 .mjs 文件直接运行,不需要安装第三方 npm 依赖。
依赖与费用
这段示例不联网、不调用 AI 接口,不产生模型接口费用。运行设备、电力由使用者自行承担;接入真实模型或平台后的费用需另行核对。

运行命令

node virtual-life.mjs

预期输出

5000
5000

本地核验

2026-10-22 · Node.js v24.19.0

已在本站本地运行资源中原样附带的教学片段,核对下方控制台输出;不代表已验证生产环境、平台接入或所有边界情况。

适合用在哪里

  • 学习虚拟目标的连续计时
  • 游戏或模拟系统的状态原型

注意事项

  • 这只是虚构目标的进度计算,不包含 AI 自主生活、主动发消息、生图或日程调度。
  • 函数不会持久化状态,也不会自动建立定时器;调用方需要另外实现。
  • 长间隔、异常时钟或重启会重新建立锚点;不要据此声称角色在离线期间真实做过某件事。

原作者与来源

署名
包子海梦 · AI辅助开发
原作者与来源
提示集贡献者

声明与修改说明

新编写的通用教学示例,发布前仍需核对来源与运行效果。

完整许可证

MIT

MIT License

Copyright (c) 2026 提示集贡献者

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

验证范围

教学代码已运行

已运行完整带许可的教学文件并核对输出;不代表生产部署、平台接入或全部边界情况都已验证。

2026-10-23 Node.js v24.19.0