# @adatechnology/game-contracts 中文文档

规范地址：https://npmcn.com/package/%40adatechnology/game-contracts/

版本：0\.25\.0
npm 元数据更新时间：2026-11-06T05:13:19.908Z
中文译文更新时间：2026-11-05T22:48:30.998Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40adatechnology/game-contracts
原文对照：https://npmcn.com/package/%40adatechnology/game-contracts/?lang=original
项目主页：https://github.com/Andersonfrfilho/adatechnology-game-kit#readme
源码仓库：https://github.com/Andersonfrfilho/adatechnology-game-kit

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：601 kB，12 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- 运行依赖：0 个
- 首次发布：2026-10-23T14:04:11.448Z
- 最新版本发布：2026-11-06T05:13:19.562Z
- 近 30 天下载量：10843（2026-10-05 至 2026-11-03，npm 官方下载统计）
- 已发布版本数：27（近 12 个月 27 个）

## 中文简介

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

## 安装

```sh
npm install @adatechnology/game-contracts
```

也可以使用：`pnpm add @adatechnology/game-contracts`、`yarn add @adatechnology/game-contracts`、`bun add @adatechnology/game-contracts`

## README

# @adatech/游戏合同

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

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

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

## 安装

```sh
pnpm add @adatechnology/game-contracts
```

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

```html
<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` | 测试室是怎样的模块 |

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

```ts
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).

### 武器

```ts
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`,和完善的事件.

```ts
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: [] }
```

### 测试室的模块

```ts
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)` 在主机的面板上加一张牌( name`BenchSheet`:踢球手、头衔、身体、事实、步骤、彩色手表、音符和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` 事件名称是爆炸的效果.

```ts
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 是什么？

合同中每个游戏模块都依赖于,其他的则没有:毁灭\(部件,命中,事件,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 和提交记录判断。

