@adatechnology/game-contracts

中文文档
0.25.0发布于 2026/11/06MITTypeScriptES Module零依赖构建来源已验证近 30 天下载 1.1万

合同中每个游戏模块都依赖于,其他的则没有:毁灭(部件,命中,事件,DestructableImpl),武器(射击),流体(容器,物品使用),物品动画和可测试模块一个模块手握测试室. 类型加小圆锥

中文使用文档
文档目录13 节
  1. 安装
  2. 里面有什么东西
  3. 销毁:一个模块拥有其对象
  4. 武器
  5. 动画
  6. 测试室的模块
  7. 模块的长凳
  8. 主机借出的效果
  9. 声音和天气 东道主借
  10. API 密码
  11. 点出泄漏
  12. 类别(有遗产的种类)
  13. 葡萄牙

@adatech/游戏合同

合同每个游戏单元都依赖,没有别的。 类型加上一些小的纯支票, 无运行时间依赖关系麻省理工学院的.

想法:车辆、椅子、手枪或房子是 模块。它不需要默认的毁灭世界、制造器或试验室. 它只需要就几个形状达成一致,这些就是这些形状。 销毁包、武器包、液体包和试验室 依赖这个,再出口他们以前定义的东西,所以 import { Hit } from '@adatechnology/game-destruction' 继续工作.

your module ──▶ game-contracts ◀── game-destruction / game-weapons / game-fluids / game-test-room

安装

pnpm add @adatechnology/game-contracts

没有捆绑的浏览器( 全局为 GameContracts:

<script src="https://unpkg.com/@adatechnology/game-contracts/dist/index.global.js"></script>
<script>
  const problems = GameContracts.checkHit({ type: 'blunt', point: [0, 1, 0] })
</script>

里面有什么东西

合同出口用于
销毁DestructibleSpec, (中文(简体) ), PartSpec, (中文(简体) ), Hit, (中文(简体) ), DestructionEvent, (中文(简体) ), ObjectState, (中文(简体) ), PartState, (中文(简体) ), JointSpec.部分、关节、点击、事件和状态的词汇
影响IMPACT_CONTRACT, (中文(简体) ), checkHit(hit)武器或危险必须放在 Hit,每个损害类型
自行销毁DestructibleImpl, (中文(简体) ), checkDestructible(impl, { materials })自行销毁的模块(一辆具有自身面板规则的汽车)
武器Shot, (中文(简体) ), Use, (中文(简体) ), shotToHit(shot, point, normal?), (中文(简体) ), shotExtras(shot, distance?)武器能产生什么 Hit 射出一个点
流体ContainerSpec, (中文(简体) ), LiquidId, (中文(简体) ), ItemUseDef任何物品都说它持有的液体 以及它是如何使用的
动画AnimationClipSpec, (中文(简体) ), ItemAnimationContract, (中文(简体) ), checkAnimation(clip, partIds)使用项目带来的动画( 门) open手枪 reload(中文(简体) )
模块TestableModule, (中文(简体) ), TestableItem, (中文(简体) ), ModuleScenario测试室是怎样的模块

销毁:一个模块拥有其对象

import type { DestructibleImpl } from '@adatechnology/game-contracts'
import { checkDestructible } from '@adatechnology/game-contracts'

const impl: DestructibleImpl = {
  id: 'rental_car_1',
  describe: () => ({ parts: [/* body, door_l, wheel_fl... in the impl's local space */] }),
  hit: (hit) => [/* events: every one has object === id and names a part listed by describe() */],
  state: () => ({ /* ObjectState */ }),
}

checkDestructible(impl, { materials: world.materials.keys() }) // { ok, problems }

撞击到达了世界空间,事件在世界空间展开. checkDestructible 不需要世界:它验证了 describe(),用一个 500J弹道弹道弹道弹道弹道检查 state() 匹配 describe()命中点从不负, update(0.016) 返回数组,每个事件都是 造型良好,而且JSON可连载 合同包不知道你的材料:通过他们的身份证明(世界 world.materials.keys())或(或) 离开 materials 跳过支票.

费用合同(D8): 主机读取 describe() 财务报告和审定财务报表 state() 每个帧的每个部分,所以两者都是O(1),无分配和在变化之间被缓存(同一个对象返回,直到被击中,被工具,被火或被变换). checkDestructible(impl, { cost: true }) (或 cost: { reads, ceilingMs, allocationBytes })每读出一万回,每读出一新对象就失败了,时间超过上限(默认为50毫秒),在节点则超过上限的堆积增长(默认为一米B).

武器

const hit = shotToHit(shot, point) // { type: 'ballistic', energy: shot.energyAt(distance), caliber, direction, ... }
checkHit(hit)                       // [] when valid

动画

一个片段是平版数据:用于项目根和被命名部分的有外形(从其他外形取出,Euler XYZ)的密钥,外加事件. checkAnimation(clip, partIds) 验证一个蛇 case id, 一个正持续时间, 命令时间在剪辑中, 有限的向量, 每个移动的部分 这是其中之一 partIds,和完善的事件.

const open: AnimationClipSpec = {
  id: 'open',
  duration: 1.2,
  keys: [{ t: 0 }, { t: 1.2, parts: { door_l: { rotation: [0, 1.1, 0] } } }],
  events: [{ t: 0.15, type: 'sound', data: { key: 'door_latch' } }],
}
checkAnimation(open, ['body', 'door_l']) // { ok: true, problems: [] }

测试室的模块

import type { TestableModule } from '@adatechnology/game-contracts'

export const RENTAL_CARS: TestableModule = {
  id: 'rental_cars',
  name: 'Rental cars',
  group: 'Rental cars',
  items: (locale) => [{ id: 'rental_car', name: 'Rental car', build: (THREE) => buildCar(THREE), impl: (root, id) => createCarImpl(root, id), animations: [open] }],
  scenarios: (locale) => [/* { id, name, run(ctx) } */],
}

room.loadModule(RENTAL_CARS) // items join the catalogue, scenarios become buttons, contract checks write ✓ / ✗ lines to the log

build 接收主机的 3.j 命名空间并返回其 Object3D (两者均为: unknown 这里:这个包不依赖三.js). impl 收到对象 id 主机给出项目 DestructibleImpl.id 必须平等.

模块的长凳

一个模块也可以宣布一个长凳为数据: controls (数目、布尔、选择、行动), layers (观者开或去 metrics (遇到主机拉动与 read() 几回一秒钟). 主机保存值, 绘制值, 并借给模块 a ModuleBench 内 attach (单位:千美元)host.bench: value(id), (中文(简体) ), layer(id), (中文(简体) ), onChange(listener) (紧接着) attach 每个控制器都有一个变化 层,按顺序排列, patch(id, { hidden, disabled, options, value }) (无回声)和 look(eye, target)。 。 。 . checkBench({ controls, layers, metrics }) 检查声明( snake case ids 独有于 3, min < max, (中文(简体) ), step > 0,在范围和选项中默认, max > 0) (中文(简体) ). 选择的选项可能包含 group (东道主将它们列在标题下;一组人可选择坐相邻 checkBench 说 当他们不这样做的时候. ModuleBench.sheet(sheet) 在主机的面板上加一张牌( nameBenchSheet:踢球手、头衔、身体、事实、步骤、彩色手表、音符和a 播放标题遵循模块度量的片段的时长;没有工作表区域的主机将其排除在外.

主机借出的效果

ModuleHost.effects 是一个 EffectSink数字 : play({ effect, point, direction?, normal?, seed?, param?, scale? }) 通过 id 启动主机目录的效果 并回答一个手柄(或 null 当主不知道的时候, stop(handle) 结束一个循环,和 configure, (中文(简体) ), stats 财务报告和审定财务报表 catalog 是可选的。 这个 explosion 主机活动携带 explosive (炸药的id), PartSpec.explodes.effect 编辑 explode 事件名称是爆炸的效果.

controls: () => [
  { kind: 'choice', id: 'distance', name: 'Distance', options: [{ id: 'near', name: 'Near' }, { id: 'far', name: 'Far' }], default: 'near' },
  { kind: 'action', id: 'replay', name: 'Replay' },
],
layers: () => [{ id: 'smoke', name: 'Smoke' }],
metrics: () => [{ id: 'particles', name: 'Particles', max: 400, read: () => fx.particles }],

工具事件以工具周期而不是枪支命名: mode, (中文(简体) ), fault, (中文(简体) ), clear (开始/结束)和 safety,以及 shot 携带 rounds 旁边 shots (项目,总是1个或更多) mode; 哑弹是自己的 misfire 事件,而不是一个 shot 以0为单位. HostTool 可能报告 mode, (中文(简体) ), fault, (中文(简体) ), safety 财务报告和审定财务报表 heat (单位:千美元). host.configureTool(settings) 使用一个 Record<string, string> 由模块自身控制的 id 键入; 测试室应用 condition 财务报告和审定财务报表 ammo_quality 并忽略其他身份证明. host.player() 返回时 PlayerState (单位:千美元)position, (中文(简体) ), yaw, (中文(简体) ), pitch, (中文(简体) ), crouching, (中文(简体) ), speed 单位:毫秒, running, (中文(简体) ), cameraMode页:1 { type: 'player' } 事件说明蹲下或相机模式改变时.

声音和天气 东道主借

ModuleHost.audio? 是一个 AudioSink (单位:千美元)play(SoundRequest), (中文(简体) ), stop(handle),可选择 loop, (中文(简体) ), setListener, (中文(简体) ), register:一个共享的声音引擎,所以每个模块都是混合的, 限制和平分的方式相同. ModuleHost.environment? 是一个 EnvironmentBus (单位:千美元)get, (中文(简体) ), set(patch), (中文(简体) ), on持有 EnvironmentState (单位:千美元)rain 毫米/小时,风, fogFar, (中文(简体) ), visibility, (中文(简体) ), nightFactor, (中文(简体) ), temperatureC, (中文(简体) ), wetness:天气模块写出,其他人读出. 两者均为可选、添加和通用; createEnvironmentBus(initial?) 是一个平地 用于执行总线的存储,以及 DEFAULT_ENVIRONMENT 是平静的干燥的一天.

API 密码

从软件包根导出所有东西; 见 src/*.ts 对于医生的评论。 单位:米,秒,焦耳,毫米(口径),摄氏度.

点出泄漏

Hit.ignition (单位:千美元){ spark, flame }, (中文(简体) ), Hit.incendiary 财务报告和审定财务报表 Hit.tracer 说出一圈可燃液体的漏泄; IgnitionRules 编号 : DEFAULT_IGNITION_RULES 是数字 容器一侧 fillCurve,则 sparkTarget 墙上, fireNear, (中文(简体) ), ignitionChance(hit, { sparkTarget, fill, fluid? }, rules?) 是一次回合的机会 灯光泄漏, fillFactor(fill, curve?) 曲线和 sparkTargetFactor(materialId, isMetal, rules?) 墙. game-destruction 财务报告和审定财务报表 game-vehicles 使用它们; 普通子弹只漏出.

类别(有遗产的种类)

defineCategories(defs, { extra, patches, remove }) 构建一个 CategoryRegistry: 每个 CategoryDef 有一个 id,可选 extends (任何深处), defaults, (中文(简体) ), requires (合同编号)和 abstract。 。 。 . defaults(id) 沿着链子(根先起,阵列取代)深起, requires(id) 即离合者, chain(id), (中文(简体) ), isA(id, ancestor) 财务报告和审定财务报表 check() (未知的父,循环,重复的id)完成. resolveEntry(registry, entry) 将类别默认置于条目下(条目胜出); checkCategorized(entries, registry, checkers, { allow }) 运行 ContractChecker 每一所需合同的确定 报告 "<id>" (<kind>): <problem>, required by <category>· ; allow 列出到 allowed 改为 problems。 。 。 . 仅列出项目名称 kind,因此游戏可以在现有类型之上插入新的父游戏(patches: { canned_food: { extends: 'preserved' } } 与 preserved 扩展旧父母)或者在任意类型下添加一个孩子,每个项目都会不断解决,现在还有额外的默认和要求,无需被编辑.

葡萄牙

{\fn华文楷体\fs16\1cHE0E0E0}是的,是的, sem dependências 节奏 执行卡罗 玛卡迪拉 玛卡迪拉 穆杜罗维基百科中的相关条目: 维基语录链接:名人名言 - 文学作品 - 谚语 - 谚语 - 谚语 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}试卷 相干相干相干相干相干相干相干相干相好 Os pacotes de destruição, armas, slimos e a sala de testem deste e reexportam os tipos que (英语: (原始内容存档于2018-10-21) (英语). antes definiam, então import { Hit } from '@adatechnology/game-destruction' (原始内容存档于2017-10-21). continua funcionando.

  • 贫困数字 : DestructibleImpl (o módulo manda no seu objeto) e 互联网档案馆的存檔,存档日期2013-12-02 checkDestructible(impl, { materiais })时, que 有效a describe(), (中文(简体) ), {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}嗯... {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}500J...
  • 影响数字 : IMPACT_CONTRACT 电子 checkHit(hit) {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}我需要你 {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}我需要你.
  • 阿玛斯数字 : Shot, (中文(简体) ), Use 电子 shotToHit(shot, ponto)。 。 。 .
  • 流管数字 : ContainerSpec, (中文(简体) ), LiquidId 电子 ItemUseDef。 。 。 .
  • 索姆克利马数字 : ModuleHost.audio? (单位:千美元)AudioSink页:1 ModuleHost.environment? (单位:千美元)EnvironmentBus 缩写 EnvironmentState(a) 国家、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、; createEnvironmentBus() 电子 DEFAULT_ENVIRONMENT {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}你还好吧.
  • 动画片数字 : AnimationClipSpec 电子 checkAnimation(clipe, idsDasPeças) (马港a) open玛玛手枪 reload) (中文(简体) ).
  • 穆杜罗数字 : TestableModule a. 试验用具; room.loadModule(modulo) rod rod rod es rod 没有日志。 (原始内容存档于2018-10-21). Assim o módulo de um carro de aluguel já nasse com as suas animações e o seu jeito de quebrar.
  • 班加达莫杜洛宣言 controls, (中文(简体) ), layers 电子 metrics (原始内容存档于2018-09-29) (英语). como dados; a sala guarda os valores, desenha e empresta host.bench (单位:千美元)ModuleBench) (中文(简体) ). checkBench 声明有效。 塞克洛·达费拉门塔事件: mode, (中文(简体) ), fault, (中文(简体) ), clear, (中文(简体) ), safety, e 类 rounds 没有 shot。 。 。 .

版本与发布记录

@adatechnology/game-contracts 共发布 27 个版本,首次发布于 2026/10/23;过去 12 个月发布了 27 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.25.0latest2026/11/06今天
0.24.02026/11/041 天前
0.23.02026/11/042 天前
0.22.02026/11/042 天前
0.21.02026/11/032 天前
0.20.02026/11/015 天前

关于 @adatechnology/game-contracts 的常见问题

@adatechnology/game-contracts 是什么?

合同中每个游戏模块都依赖于,其他的则没有:毁灭(部件,命中,事件,DestructableImpl),武器(射击),流体(容器,物品使用),物品动画和可测试模块一个模块手握测试室. 类型加小圆锥

如何安装 @adatechnology/game-contracts?

在项目目录运行 npm install @adatechnology/game-contracts,或使用 pnpm add / yarn add / bun add。

@adatechnology/game-contracts 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@adatechnology/game-contracts 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@adatechnology/game-contracts 可以商用吗?

@adatechnology/game-contracts 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@adatechnology/game-contracts 的下载量有多少?

根据 npm 官方下载统计,@adatechnology/game-contracts 在 2026/10/05 – 2026/11/03 这 30 天内被下载 10,843 次,日均约 361 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@adatechnology/game-contracts 还在维护吗?

最新版本 0.25.0 发布于 2026/11/06(今天);至今共发布 27 个版本,其中过去 12 个月发布了 27 个;首次发布于 2026/10/23。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。