mcpField
R
rpgjs-studio

rpgjs-studio

github.com/rsamaium创意与媒体1.7k104 次安装1 天前更新
代码仓库

关于 rpgjs-studio

rpgjs-studio 是用于管理 RPGJS Studio 实例内容的 Skill,面向处理游戏项目数据的工作流。它涵盖数据库、地图、事件和媒体 API,并说明生成与额度确认流程。

主要功能

  1. 01RPGJS Studio REST API 指引
  2. 02游戏数据库与事件操作
  3. 03地图生成工作流
  4. 04媒体生成与计费指引
  5. 05本地项目上下文管理

适用场景

  1. 01创建或更新游戏记录
  2. 02生成地图并检查进度
  3. 03确认额度后生成媒体
  4. 04检查或编辑事件内容

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/rsamaium/rpg-js --skill rpgjs-studio

安装后在 Claude Code 中输入/rpgjs-studio确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

agents/
openai.yaml
references/
blocks.md
database.md
event-examples.md
events.md
maps.md
media.md
mmorpg.md
project-env.md
settings.md

详细介绍

RPGJS Studio API 技能

使用此技能对 RPGJS Studio 实例执行内容管理任务。

公开游戏数据库读取会按项目批量解析角色和敌人的外观,同时保留媒体链接和显式覆盖项。有关响应行为,请参阅 references/database.md。

图像和电影生成

创建新角色时,使用 type: "spritesheet" 和 metadata.generationMode: "idle",生成一张透明的 1024×768 图像,其中包含 2×2 网格排列的四种静态姿势(向下、向左、向右、向上),费用为 5 点数。随后 Studio 会打开 /media/apps/character-editor/:id;在此处通过 spritesheet.ai 以闲置图为参考图,创建命名动画,并将其作为单独媒体与基础角色关联。现有的 spritesheet 动画请求仍需 15 点数。请参阅 references/media.md。

在 Studio 编辑器中删除时,使用 references/media.md 中记载的项目范围角色动画端点;该端点会同时移除动画引用和存储的图像。

Base64 参考图支持 MIME 参数;如果签名可识别为 PNG/JPEG/GIF/WebP,则优先采用签名,即使 MIME 标头缺失或不正确(包括 text/xml)。无效的参考图会返回 HTTP 400,并退还启动扣款。

媒体生成会在执行时、入队前扣除按用量计费的 API 密钥点数;估算不会扣款。启动失败会退款,执行最终失败时会通过持久化退款步骤退款。queued 响应仅表示已受理:请轮询返回的实例。有关计费和参考图存储行为,请参阅 references/media.md。

要在事件中播放视频,请使用 show_cinematic 和 { "video": "media-id", "allowSkip": false, "bgm": "pause", "preload": true }。只有 video 是必填项:跳过和预加载默认开启;bgm 默认为 "duck"(音乐音量为 15%)。"pause" 会在之后恢复音乐。相邻的视频区块共用一个叠加层。详情请参阅 references/media.md;无需建立地图与视频的关联。

直接地图生成发布

在 objective 中用用户使用的语言描述所需地图的视觉风格。 生成器会遵循该风格;只有当 objective 未指定风格时,才默认使用高清像素艺术。 地形和墙壁材质会保留概念美术方向。请参阅 references/maps.md;不要在 API 负载中单独添加 style 字段。

如需在没有助手的情况下生成地图,请阅读 references/maps.md 中的持久化工作流和直接进度章节。使用现有的 prepare/execute 端点、明确的点数确认、项目范围的状态和中间预览。只有在收到 finalized: true 和 mapId 后,才能展示已保存的结果。切勿仅凭工作流状态推断生成已完成。安全出生点由上游跟踪,见 RSamaium/RPG-JS#367;不要实现本地碰撞规避方案。

输入

  • 检查当前工作目录中是否存在本地 RPGSTUDIO.md 文件。
  • 如果存在 RPGSTUDIO.md,请将其视为本地项目上下文并首先阅读。
  • 使用它找回持久化值,例如:
    • BASE_URL
    • 任何其他与 API 使用相关的项目专属说明
  • 不要找回、请求或持久化 projectId。API 密钥已限定到 RPGJS Studio 项目,因此请直接处理用户指定的资源。
  • 如果不存在 RPGSTUDIO.md,则正常继续。
  • 如果用户提供了 BASE_URL,则使用该值。
  • 如果用户未指定其他主机,则将 BASE_URL 默认为 https://rpgjs.studio。
  • 从环境变量 RPGSTUDIO_API_KEY 中读取 API 密钥。

强制启动工作流

  1. 在进行任何 API 调用之前,检查 RPGSTUDIO_API_KEY 是否存在。
  2. 检查 RPGSTUDIO_API_KEY 时,绝不在终端中打印其值,也绝不在回复中回显该值。
  3. 如果该变量缺失或为空,停止操作,并告知用户先在 ${BASE_URL}/api-keys 创建 API 密钥,然后导出 RPGSTUDIO_API_KEY。
  4. 使用以下请求头构建经过身份验证的请求:
-H "x-api-key:$RPGSTUDIO_API_KEY"
-H "Content-Type: application/json"
  1. HTTP 调用优先使用 curl。只有在有明确理由时,才使用其他 HTTP 客户端。
  2. 身份验证错误时立即停止。如果 API 返回无效密钥类响应、401 或 403,停止任务,并告知用户验证密钥或联系支持团队。
  3. 只读取与用户任务匹配的参考文件:
    • references/database.md
    • references/maps.md
    • references/events.md
    • references/event-examples.md
  • references/blocks.md
  • references/media.md
  • references/settings.md
  • references/project-env.md
  • references/mmorpg.md

本地记忆文件

将 RPGSTUDIO.md 用作当前项目的轻量级本地记忆文件。

  • 如果文件存在,在开始时读取。
  • 复用其中已存储的值,而不是再次询问。
  • 任务完成后,更新或创建该文件,记录执行过程中发现的稳定、非机密上下文。

典型内容:

  • 最近使用的 BASE_URL
  • 对未来调用有用的项目专属约定或备注

不要使用 RPGSTUDIO.md 选择项目。当前的 RPGSTUDIO_API_KEY 已确定目标项目,因此应直接处理用户的请求。

切勿在此文件中存储机密信息。

  • 不要存储 RPGSTUDIO_API_KEY。
  • 不要打印 RPGSTUDIO_API_KEY。
  • 不要将原始机密值复制到日志、终端输出或 Markdown 中。

请求模式

定义一次基础命令并重复使用:

BASE_URL="${BASE_URL:-https://rpgjs.studio}"
curl -sS \
  -H "x-api-key:$RPGSTUDIO_API_KEY" \
  -H "Content-Type: application/json"

对于写操作,优先使用:

curl -sS -X POST "$BASE_URL/..." \
  -H "x-api-key:$RPGSTUDIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{...}'

执行规则

  • 先确定资源域,然后加载匹配的参考文件。
  • 使用 REST 语义:GET、POST、PUT、DELETE。
  • 创建或更新之前,先解析外键:
    • 使用 /api/media?query=<search> 搜索媒体。
    • 使用 /api/database/:type?query=<search> 搜索数据库记录。
    • 如果存在匹配的依赖项,复用其返回的 _id。
    • 如果未找到,先创建该依赖项,然后继续使用返回的 _id。
  • 切勿仅为选择项目而调用项目列表端点。API 密钥决定项目上下文。
  • 用户要求创建游戏对象时,先发送最小有效载荷;只有任务需要更多字段时才补充。
  • 复用 API 返回的 ID,不要猜测 ID。
  • 用户在读取、更新或删除任务中提供数据库 _id 时,先调用 GET /api/database/:type/:id 并检查现有记录,再决定有效载荷或报告内容。
  • 如果端点结构不确定,先检查相近 GET 端点的响应,再根据实时载荷调整。
  • 身份验证失败后不要继续。
  • 如果缺少的依赖项需要通过 AI 生成媒体,始终先调用统一媒体生成端点,并设置 action: "estimate"。
  • 估算后,向用户报告所需额度,并在调用 action: "execute" 前征求确认。
  • 未经估算和确认,绝不要直接启动 AI 媒体生成。
  • 对于 POST /api/maps/generate,应根据 references/maps.md 执行 AI 地图生成工作流并处理特定端点的失败情况。
  • 在最终回复中准确总结已创建、更新或删除的记录。
  • 当任务发现诸如 BASE_URL 或本地约定等稳定的项目上下文时,将这些非机密信息保存到 RPGSTUDIO.md,以供后续运行使用。

Common checks

Current schema notes

  • 已认证的 Studio 会话可以通过 POST /api/mmorpg/publish 发布当前项目。发布会先准备好每张地图,再发送任何更新。失败时会返回稳定的 code、stage 和可选的 resourceId;响应约定请参见 references/mmorpg.md。 GET /api/mmorpg/publication 会报告此项目的 MMORPG 是否已成功发布,并提供可游玩 URL。 准备阶段只会为本次发布缓存源读取。面向 RPG-JS #374 的版本化 R2 发布和仅向活跃房间传播功能,已在框架工作目录中实现,并通过 MMORPG_PUBLICATIONS 集成到 Studio 的本地配置中;发布版本及生产环境集成仍待完成。集成前请先阅读 references/mmorpg.md 的框架 API 章节。
  • 如果角色事件的唯一行为是播放一段对话,可直接将其存储在 onAction 触发器的 triggers[].typeData.dialogue 中,无需区块集合。先解析 graphic(spritesheet)和 faceset 媒体;如果任一类型都没有合适结果,请提出经确认后再生成。如果用户明确拒绝生成 faceset,可以省略 faceset。如果用户明确禁止生成所有资源,则使用搜索到的、彼此匹配的外观 ID 创建可用事件,并省略缺失的 graphic 或 faceset。
  • 对于出售数据库道具的角色,请遵循规范的商店工作流:解析或创建具有正数 price 的真实道具,然后创建一个引用其 _id 的 call_shop 区块。RPGJS 商店会先扣除价格,再发放道具。不要自行构造选择/金币/道具分支,也不要使用占位资源标识符。
  • 地图生成的 followUpPlan.events[] 接受可选的像素 position: { x, y }。该位置必须位于 width * 48 乘 height * 48 的范围内;Studio 会通过紧凑的事件地图上下文验证此位置,并在位置缺失或无效时回退到地图起点。
  • 新生成的助手地图会包含持久化描述、可选的源 assistantConversationId,以及包含 { id, title, description, prompt } 的 followUpPlan.music 建议。历史 API 调用方可以省略会话 ID 和音乐建议。
  • show_text 区块可以设置 inputEnabled: true;此时必须提供 inputVariableId,即接收所提交字符串或数字的数据库变量 _id。取消输入时会存储 null;有关带类型的输入选项,请参见 references/blocks.md。
  • 地图、事件、区块集合和数据库记录都支持通过现有列表端点中的 query 进行多语言语义搜索。可选参数 minScore 接受 0..1,默认值为 0.40;有关端点专属筛选条件和响应格式,请参见对应的资源参考。
  • 项目环境变量通过需要认证的项目路由管理: GET /api/projects/:projectId/env、 PUT /api/projects/:projectId/env/:name 和 DELETE /api/projects/:projectId/env/:name。响应会返回普通值;机密值只会显示 isSet,绝不能记录到日志或打印出来。
  • 可玩角色是 /api/database/actors 下的数据库 Actor。公开运行时数据库包含 Actor,公开项目会提供 mainActorId,以便新游戏预选项目主角。
  • 可玩身份是 /api/database/classes 下的数据库 Class。新建 Actor 时必须提供有效的 classId;没有 classId 的现有旧版 Actor 仍可读取。Class 拥有 name、description、icon 和按等级解锁的 skills,而 Actor 拥有外观、属性、背包和装备。分配给任何 Actor 的 Class,在这些 Actor 改派前都不能删除。
  • 角色 spritesheet 元数据可以包含 illustration,即透明 4:5 JRPG 角色插画的媒体 _id;使用此 spritesheet 的每个 Actor 都会继承该插画。AI 生成类型 illustration 消耗 5 个积分。
  • 数据库创建和更新验证会将非空表单字段的 null 视为未提供的值。如果 JSON Schema 声明了 default,则会应用该默认值;显式的 0 值和明确可为 null 的字段会保留。仅包含未提供值的可选对象组,例如 { "hitbox": { "width": null, "height": null } },也会被省略。验证失败的 400 会在 message 中使用点分路径标识第一个无效字段,例如 { "message": "parameters.pdef.start: Required" }。
  • menus.characterSelect 用于配置新游戏的 Actor 选择器。它支持通过 settings.allActors: true 显示所有 Actor,或通过 settings.actorIds 显示有序的 Studio Actor _id 列表。选择内容仅对玩家/存档生效,不会更改 mainActorId。
  • 事件工作流可以通过 call_character_select 打开相同的选择器,也可以通过 change_class 为当前玩家分配 Class。选择器可以显示所有 Actor 或一个有序且不重复的子集,并可选择是否允许取消。应用所选 Actor 会保留已获得的进度;确切的载荷格式请参见 references/blocks.md。
  • 地图可以公开着色器地形 terrainLayer 对象,其中包含 version: 1、mode: "control-texture"、像素 width/height、tileSize、palette 和 controlTexture 元数据。控制纹理采用 RGBA8 格式;地形调色板索引编码为 R + G * 256,可选光照使用 B,其中 128 表示中性,A 存储用于像素笔刷笔画的地形遮罩覆盖度。软边缘会在渲染时根据过渡/混合元数据计算。旧版瓦片网格会规范化为 tileSize x tileSize 区块,但笔刷编辑可以更新控制纹理中的单个世界像素。
  • 需要复现 Studio 地形渲染的游戏或编辑器集成必须使用 @rpgjs/render-map2d。在宿主环境中解码地形图像和控制图像,调用 normalizeTerrainMap() 和 prepareTerrainMap(),然后使用 renderTerrainRegion() 渲染与世界坐标对齐的区域。不要在 Angular、Pixi 或 CanvasEngine 适配器中重新实现道路、地毯、九宫格、水体或形态学像素。
  • POST /api/map-generations 是用于地图创建和编辑、按项目范围限定且需确认的 Cloudflare 工作流。它接受可选的地形/元素集引用,会生成缺失资源、提取语义地形模式、构建地形/形态结构、保留分离的元素位置,并持久化最终地图。请依次执行准备、明确确认和执行,然后轮询返回的实例直至状态为 complete;响应包含最终的 mapId。失败的终态响应会提供退款/重试标记;只有前一次尝试已退款后,POST /api/map-generations/:instanceId/retry 才会启动新实例。定向编辑使用规范化多边形,并会在省略当前资源时继承它们;请参见 references/maps.md。
  • 地图可以公开地形形态结构 terrainMorphologyLayer 对象,其中包含 version: 1、mode: "terrain-morphology"、像素 width/height、tileSize 和 features[]。每个要素均为 { kind: "hole", params, strokes } 或 { kind: "wall", params, strokes };笔画会存储世界像素 points[] 和 radius。洞的参数支持 depth、roundness、roughness、可选的立面 textureId、可选的底部填充 fillTextureId、限制在 0..100 的 fillHeight,以及可选的单洞 waveIntensity、waveDirection 和 waveSpeed;省略的波浪字段会继承地图的 waterAnimation 值,而 waveIntensity: 0 会让填充保持静止。textureId 不会用作底部填充的回退值。墙的参数支持 height、roundness、roughness、可选的立面 textureId、surfaceTextureId、trimTextureId、baseTextureId 和 renderMode: "procedural" | "collision-only";仅碰撞的生成墙会阻挡移动,但其视觉效果交由 wallSurfaceLayer 处理。wallStyle: "rock" 会渲染分层岩壁、岩石边缘和地面接触阴影;Studio 挖掘洞穴时会将其用于覆盖整张地图并通过擦除操作雕刻的墙。Studio 还会在岩壁上存储 rockTexture: "masonry" | "natural"(程序化表面纹理,默认值为 masonry:切割石材层;natural:不规则的风化岩石面)。如果没有 textureId,游戏会像编辑器一样根据墙体遮罩逐像素渲染这些表面:顶部受光、墙脚较暗、最高覆盖开口下方 55%,并在墙基处添加接触阴影。编辑器的墙体平滑度控件对应 roughness = 1 - smoothness。渲染器会先将洞/墙遮罩合并为有符号地形级别,再绘制,并将形态笔画合并到地形碰撞中作为阻挡单元格。Studio 编辑器会在绘制时对洞和墙进行互斥处理:在洞上绘制墙会擦除该处的洞(恢复为可行走地面),在墙内绘制洞会擦除该处的墙,因此保存的地图只包含普通绘制和擦除操作。
  • 生成的地图可以公开 wallSurfaceLayer,其中包含 version: 1、mode: "wall-surface"、地图像素尺寸、materials[] 和外部 RGBA8 controlTexture。R 是从零开始的材质索引,G 为 0=void、1=top、2=face 或 3=trim,B 保留不用,A 为覆盖度。每种材质都会引用专用的顶部、表面和边饰纹理 ID,以及可选的底部 ID。Studio 会以像素级精度渲染这些遮罩,并与墙体碰撞形态一起编辑/撤销。PUT /api/maps/:mapId 会通过 wallSurfaceLayer 和 base64 wallSurfaceControlTexture 持久化编辑;API 会将 PNG 存储在地图文档之外。
  • 地图可以公开 waterAnimation: { enabled, speed, intensity, direction },作为地图级液体动画默认值。direction 表示屏幕坐标系中顺时针测量的角度(0 向右,90 向下),默认值为 90。除非洞的参数覆盖这些默认值,否则填充的洞会继承它们;波浪高光会根据各填充区域的局部颜色或纹理生成,而不是使用固定的蓝色色调。
  • PUT /api/maps/:mapId 支持局部更新各个区段。未提供的地图字段会保留,因此建议仅发送已更改的区段:起点位置使用 startX/startY,放置内容使用 events,生成的墙体几何使用 terrainMorphologyLayer 加可选的 wallSurfaceLayer/wallSurfaceControlTexture,地形/控制纹理使用地形字段,对象使用元素图层数组,媒体选择使用 tileset 参数。
  • 地图可以公开顶层光照设置 lighting: { sun: { enabled: boolean, intensity: number } }。太阳强度限制在 0..1;启用后,运行时/编辑器集成可用它显示墙体、角色和元素的自动阴影。
  • 地图可以公开 mapLoadBlockCollectionId: string | null。设置后,GET /api/game/maps/:mapId 会将该集合载入 mapLoadBlocks,且 RPGJS Studio 运行时会在玩家进入地图时,通过服务器端 map.onJoin(player, map) 钩子执行这些区块。此工作流具有玩家和地图上下文,但没有当前事件上下文。
  • 事件工作流构建器可以使用执行配置档。eventBuilderProfiles.mapLoad 会公开其 requiredCapabilities 适用于玩家感知型地图上下文的区块,并从兼容的架构中移除当前事件字段选项。
  • 地形媒体元数据公开 sourceTexture、直接的 rows 和 columns、textureGrid: { columns, rows, tileSize? }、terrainTextures[] 和 transitions[]。每个 terrainTextures[] 条目均为 { id, index, label, collision?, renderTileSize?, renderingStyle?: "pixel-art" | "hd-2d", defaultRenderMode? };index 是图集单元格的唯一来源,collision 会将绘制的地图单元格标记为阻挡,renderTileSize 控制地图编辑器世界像素中的重复纹理尺寸,未提供时默认沿用旧版 320 图案尺寸,renderingStyle: "hd-2d" 会启用地图编辑器的平滑缩放,省略该元数据则保留旧版像素艺术渲染。defaultRenderMode 支持 hard、fade、nine-slice、water 和 custom:hard 边缘清晰;fade 使用 width;UI 中的 grass edge 预设存储为 fade,并使用 width: 12 和 curve: "sharp",渲染为草边;nine-slice 会存储以源单元格像素为单位的中心区域 center: { x, y, width, height },重复该中心区域,并沿每条绘制轮廓投射周围的边框带,同时始终防止渐隐渗漏;water 是存储的通用液体模式,会保留图集纹理,同时根据图集单元格颜色生成裁剪色调、岸边深度、静态涟漪和边缘微光,因此熔岩/沼泽/酸液/油不会出现固定的蓝色轮廓;未知的 custom 模式会回退为边缘高光,除非其 shaderKey 类似液体效果。transitions[] 存储地形 ID 之间的例外规则 { from, to, mode, priority? };它不是生成的 Wang 过渡矩阵。Studio 地形生成默认使用 UI 中的 4x4 源纹理图集,并直接持久化生成的图集;它不再通过图像处理容器生成 Wang/自动拼接输出。生成请求可以设置 metadata.sourceTextureColumns 和 metadata.sourceTextureRows;Studio 还会发送 terrainAtlasColumns、terrainAtlasRows、terrainStyleId 和 terrainStylePrompt,以便服务器提示词构建适用于着色器的无缝材质图集。元素集(tileset)生成可传递 metadata.terrainReferenceImage 和 metadata.terrainReferenceMediaId,将现有地形图像用作风格兼容性参考;图像数据仅在执行期间使用,不应持久化。
  • 可玩角色设置使用 /api/database/actors 下的数据库 Actor;项目会在 mainActorId 中存储所选 Actor 的 _id。使用 GET /api/database/actors/main 和 PUT /api/database/actors/:id/main 读取或更改主角。Actor 拥有外观、碰撞箱、进度、背包、动画和技能。
  • Actor hitbox: { width, height } 使用正数 RPGJS 像素尺寸,省略时默认值为 32 x 32。公开游戏项目和离线导出会将 mainActorId 解析回运行时兼容的 hero、animations 和 skills 字段。
  • 数据库 Actor 和敌人支持在 animations 下使用战斗动画 spritesheet 媒体 ID:attack、hurt、die 和 castSpell。
  • 名为 cast、Cast Spell、castspell、castSpell 或 castSkill 的关联角色动画会解析到规范字段 animations.castSpell;明确设置的 Actor/敌人覆盖值仍具有优先权。
  • Actor 和敌人会自动继承所选角色精灵关联的 faceset 和命名战斗动画。只有要覆盖这些默认值时,才设置 faceset 或单独的 animations 媒体 ID;请参见 references/database.md。
  • RPGJS 入门运行时会在动作战斗中使用这些 spritesheet:攻击动作、伤害/受击反馈、延迟移除死亡角色,以及技能/施法使用时,都可以临时切换到已配置的 spritesheet。
  • 数据库敌人通过 behavior 支持动作战斗 AI 选项:enemyType、attackCooldown、visionRange、attackRange、dodgeChance、dodgeCooldown、fleeThreshold、attackPatterns、patrolWaypoints 和 groupBehavior。
  • 数据库敌人提供轻量级预览端点:GET /api/database/enemies/preview?ids=<id1,id2>。如果已知敌人 ID 且只需要 _id、name 和 graphic,请使用此端点,无需列出或读取完整敌人记录。每个请求最多发送 100 个不重复的 ID。
  • 默认情况下,GET /api/events 返回旧版事件数组。添加 page 或 limit 即可选择分页响应:GET /api/events?page=1&limit=24 返回 { data, meta }。分页事件列表默认使用 sortBy=createdAt&sortDirection=desc 排序,并支持 sortBy=createdAt|updatedAt|name、sortDirection=asc|desc、eventType=all|character|enemy|free 和 assignment=all|assigned|unassigned。
  • 数据库 Actor 和敌人支持在 skills 下配置按等级解锁的技能获取:{ skillId, level }。
  • 数据库技能支持使用媒体 ID 设置 icon、animation 和 sound。
  • 项目设置支持全局 audio.ui 语义提示音(navigate、confirm、cancel、open、close、error),供所有原生菜单共用。通用动作战斗默认值位于 combatAudio(battleMusic、attack、skill、hit、hurt、die)。这两组设置都在“项目音频”选项卡中编辑。
  • 标题画面的背景音乐和图像通过 menus.titleScreen.settings.backgroundMusic 和 backgroundImage 配置。地图不会覆盖战斗音频。数据库敌人可以在 audio.combat 下覆盖战斗音乐和音源/反应提示音。数据库技能使用 sound 表示施放音效,使用 impactSound 表示命中音效;所有音效值都是 Studio 媒体 ID。
  • 使用媒体生成类型 image 生成完整场景的标题画面或游戏内插画。它会生成不透明、居中裁剪的 16:9 横向媒体记录;这与 illustration 不同,后者仍是透明的 4:5 角色肖像。请在 menus.titleScreen.settings.backgroundImage 中使用生成媒体的 _id。
  • 游戏/运行时代码可以通过 GET /api/game/media/:mediaId 读取游戏可用的媒体数据;详情请参见 references/media.md。
  • 更改媒体类型时,应使用 PUT /api/media/update/:mediaId,而不是仅更新元数据的管理端点;此操作会同步 metadata.type 和根级 type 字段。
  • GET /api/game/maps/:mapId 返回的游戏地图响应会尽可能将事件 params.graphic、params.faceset、triggers[].graphic 和 triggers[].faceset 载入为媒体对象,并将活动页面碰撞箱公开为 event.hitbox: { width, height };运行时响应格式请参见 references/maps.md。
  • 事件工作流区块可以通过 call_common_event 和 spawn_common_event 调用或生成可复用的游戏事件。两者都使用 commonEventId;spawn_common_event 可以从 player、current_event、variable 或 fixed 解析位置。
  • 事件页面载荷中的触发器使用 trigger: "player_touch" 和 trigger: "event_touch"。运行时触发器载荷会将两者都存储为 type: "onTouch",并通过 typeData.touchTarget: "player" | "event" 区分;为兼容性考虑,缺少 touchTarget 时表示玩家触碰。在事件/事件触碰工作流中,变量和开关区块使用地图变量。仅限玩家的区块会暂时使用当前地图上的第一个玩家作为回退对象,直到实现明确的受影响玩家指定功能。
  • 事件页面 hitbox 支持 RPGJS 像素单位的 { width, height }。缺少碰撞箱时,运行时默认使用 32 x 32。媒体/图形缩放只会改变精灵的显示尺寸,不得改变碰撞箱的宽度/高度。
  • 事件页面 options 支持 directionFix、through、alwaysOnTop 和 alwaysOnBottom。每次只能使用一个渲染层标记:alwaysOnTop 会将事件绘制在附近角色上方,而 alwaysOnBottom 会将其绘制在附近角色下方。
  • 事件工作流区块可以使用 set_hitbox,对 $player、$this 或地图事件 ID 调用 target.setHitbox(width, height)。width 和 height 是正数 RPGJS 像素尺寸,不会按目标图形缩放比例缩放。
  • 事件工作流区块可以使用 camera_follow 调用 player.cameraFollow(target, { smoothMove })。目标通过 eventId 配合 $player、$this 或地图事件 ID 解析。smoothMove 默认为 true;可选的 time 和 ease 会创建 RPGJS 支持的高级平滑过渡对象。ease 字段是一个下拉枚举,包含 linear、easeInQuad、easeOutQuad 和 easeInOutQuad 等常用缓动名称。
  • 事件工作流变量写入必须使用公开的 set_variable 区块。change_variable 仅用于旧版运行时兼容,不得在新载荷中生成。set_variable 的 valueSource 支持 constant、variable、random、player_x、player_y、player_direction、map_id、gold、player_id、player_name、level、hp 和 sp。 对于敌人战斗节奏,请使用 references/database.md 中记录的每种模式 behavior.attackProfiles 计时覆盖项;省略的值将沿用引擎默认值。

评论

支持 Markdown