From 80e546eb0809878b569d139225d6c5a17e34fdbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=98=D0=9D?= Date: Sun, 31 May 2026 11:11:09 +0300 Subject: [PATCH 1/4] =?UTF-8?q?feat(09):=20=D0=BC=D0=B0=D1=82=D0=B5=D1=80?= =?UTF-8?q?=D0=B8=D0=B0=D0=BB=20studs=20+=20studs-block=20+=20=D0=BB=D0=B5?= =?UTF-8?q?=D0=B3=D0=BE-=D1=81=D0=B5=D1=82=20(=D0=BF=D0=B0=D1=80=D0=B8?= =?UTF-8?q?=D1=82=D0=B5=D1=82=20=D1=81=D0=BE=20=D1=81=D1=82=D1=83=D0=B4?= =?UTF-8?q?=D0=B8=D0=B5=D0=B9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Портирование задачи 09 в плеер: - PrimitiveManager: material 'studs' (diffuse×color + normal, тайлинг по размеру). - BlockTypes: studs-block ('Окрашиваемые', colorable). - BlockManager: per-instance color через ThinInstance color buffer (useVertexColors + thinInstanceSetBuffer('color')), addBlock с color, _setBlockColorAt/setBlockColor, serialize/load с color. - GameRuntime: scene.setColor блока + spawn block с color. - ScriptSandboxWorker: spawn блока прокидывает color. - ModelTypes: лего-сет 19 compound-моделей (паритет). Текстуры: public/kubikon-assets/materials/studs_{diffuse,normal}.png. Проверено: рендер studs-блоков/примитивов/лего-моделей. Co-Authored-By: Claude Opus 4.8 --- src/engine/BlockManager.js | 91 +- src/engine/BlockTypes.js | 6 + src/engine/GameRuntime.js | 12 +- src/engine/ModelTypes.js | 1957 +++++++++++++++-------------- src/engine/PrimitiveManager.js | 54 + src/engine/ScriptSandboxWorker.js | 3 +- 6 files changed, 1180 insertions(+), 943 deletions(-) diff --git a/src/engine/BlockManager.js b/src/engine/BlockManager.js index dba359b..8ea6e1a 100644 --- a/src/engine/BlockManager.js +++ b/src/engine/BlockManager.js @@ -94,6 +94,10 @@ export class BlockManager { this._lavaSurfaceBaseY = null; this._lavaDirty = false; this._animTime = 0; + // Окрашиваемые блоки (studs-block, задача 09): per-instance color через + // ThinInstance color buffer. blockTypeId → Float32Array(maxBlocks*4 RGBA). + this._colorsByProto = new Map(); + this._STUDS_MAX = 20000; // макс блоков одного окрашиваемого типа } /** Вызывать каждый кадр для анимации воды/лавы. */ @@ -359,6 +363,22 @@ export class BlockManager { const mat = new StandardMaterial(name, this.scene); mat.specularColor = new Color3(0, 0, 0); + // Окрашиваемый блок (studs-block): цвет берётся per-instance из vertex + // color буфера ThinInstance и умножается на серую текстуру. Включаем + // useVertexColors, normal map (выпуклость кружков), мягкий спекуляр. + if (blockType.colorable) { + const tex = new Texture(texturePath, this.scene); + mat.diffuseTexture = tex; + mat.diffuseColor = new Color3(1, 1, 1); // нейтраль — цвет идёт из vertex color + if (blockType.normal) { + try { mat.bumpTexture = new Texture(blockType.normal, this.scene); } catch (e) {} + } + mat.specularColor = new Color3(0.2, 0.2, 0.2); + mat.specularPower = 24; + mat.useVertexColors = true; + return mat; + } + if (texturePath) { const tex = new Texture(texturePath, this.scene); tex.updateSamplingMode(Texture.NEAREST_SAMPLINGMODE); @@ -439,7 +459,7 @@ export class BlockManager { * один meshes-prototype на тип блока, тысячи позиций в одном draw call. * Жидкости (water/lava) идут по старому пути — у них свой single-surface. */ - addBlock(x, y, z, blockTypeId) { + addBlock(x, y, z, blockTypeId, color) { const ix = Math.round(x); const iy = Math.round(y); const iz = Math.round(z); @@ -449,6 +469,9 @@ export class BlockManager { const typeDef = getBlockType(blockTypeId); const isWater = !!typeDef?.isWater; const isLava = !!typeDef?.isLava; + // Окрашиваемый блок: цвет инстанса (из аргумента или дефолт типа). + const colorable = !!typeDef?.colorable; + const instColor = colorable ? (color || typeDef.defaultColor || '#cccccc') : null; // Для жидкостей оставляем старую логику: невидимый куб + единый surface if (isWater || isLava) { @@ -496,6 +519,9 @@ export class BlockManager { keysArr[idx] = key; this._cellToInst.set(key, { typeId: blockTypeId, idx }); + // Окрашиваемый блок — пишем цвет инстанса в color buffer. + if (colorable) this._setBlockColorAt(blockTypeId, idx, instColor); + // Логический «meshProxy» — объект, имитирующий API mesh для совместимости. // НЕ создаёт реального меша. Используется selection / removeBlockByMesh. const meshProxy = { @@ -511,6 +537,7 @@ export class BlockManager { mass: 1, folderId: null, _thinIdx: idx, + color: instColor, // per-instance цвет окрашиваемого блока }, // Минимальные методы, которые ожидает остальной код position: new Vector3(ix, iy + 0.5, iz), @@ -538,6 +565,18 @@ export class BlockManager { proto.material = material; if (isMulti) this._setupSubmeshes(proto); + // Окрашиваемый блок — включаем per-instance color buffer (vertex colors). + const _bt = getBlockType(blockTypeId); + if (_bt && _bt.colorable) { + proto.useVertexColors = true; + proto.hasVertexAlpha = false; + const buf = new Float32Array(this._STUDS_MAX * 4); + // Дефолт-цвет (белый) для всех слотов — иначе невыставленные = чёрные. + buf.fill(1); + proto.thinInstanceSetBuffer('color', buf, 4, false); + this._colorsByProto.set(blockTypeId, buf); + } + proto.checkCollisions = false; // коллизии через thin-instances не работают штатно; // PlayerController в Play-режиме читает blocks Map напрямую (см. PhysicsAABB). proto.isPickable = true; @@ -571,6 +610,44 @@ export class BlockManager { /** Подписка для уведомлений о создании prototype-меша (для shadow setup). */ setOnProtoCreated(cb) { this._onProtoCreated = cb; } + /** + * Записать цвет инстанса окрашиваемого блока в color buffer (RGBA float). + * idx — индекс thin-instance. hex — '#rrggbb'. В batch-режиме обновление + * GPU откладывается (флаг dirty), иначе сразу thinInstanceBufferUpdated. + */ + _setBlockColorAt(blockTypeId, idx, hex) { + const buf = this._colorsByProto.get(blockTypeId); + if (!buf) return; + const c = Color3.FromHexString(hex || '#cccccc'); + const o = idx * 4; + buf[o] = c.r; buf[o + 1] = c.g; buf[o + 2] = c.b; buf[o + 3] = 1; + const proto = this._protoMeshes.get(blockTypeId); + if (!proto) return; + if (this._batchMode) { + if (!this._colorDirtyProtos) this._colorDirtyProtos = new Set(); + this._colorDirtyProtos.add(blockTypeId); + } else { + try { proto.thinInstanceBufferUpdated('color'); } catch (e) { /* ignore */ } + } + } + + /** + * Сменить цвет окрашиваемого блока в (x,y,z) на лету (для scene.setColor / + * color-пикера). Возвращает true если блок окрашиваемый и цвет применён. + */ + setBlockColor(x, y, z, hex) { + const key = this._key(Math.round(x), Math.round(y), Math.round(z)); + const inst = this._cellToInst.get(key); + if (!inst) return false; + const bt = getBlockType(inst.typeId); + if (!bt || !bt.colorable) return false; + this._setBlockColorAt(inst.typeId, inst.idx, hex); + const mp = this.blocks.get(key); + if (mp && mp.metadata) mp.metadata.color = hex; + this._notifyChange(); + return true; + } + /** Установить флаг anchored у блока. */ setBlockAnchored(x, y, z, anchored) { const mesh = this.blocks.get(this._key(x, y, z)); @@ -767,6 +844,8 @@ export class BlockManager { canCollide: m.canCollide !== false, visible: m.visible !== false, mass: m.mass ?? 1, + // per-instance цвет окрашиваемого блока (studs-block); иначе пропускаем + ...(m.color ? { color: m.color } : {}), }); } return out; @@ -778,7 +857,7 @@ export class BlockManager { this._batchMode = true; try { for (const b of arr) { - const mesh = this.addBlock(b.x, b.y, b.z, b.type); + const mesh = this.addBlock(b.x, b.y, b.z, b.type, b.color); if (!mesh) continue; if (b.anchored === false) { mesh.metadata.anchored = false; @@ -802,6 +881,14 @@ export class BlockManager { proto.thinInstanceRefreshBoundingInfo(true); } catch (e) { /* ignore */ } } + // Финальный refresh color-буферов окрашиваемых блоков (batch). + if (this._colorDirtyProtos) { + for (const typeId of this._colorDirtyProtos) { + const proto = this._protoMeshes.get(typeId); + try { proto?.thinInstanceBufferUpdated('color'); } catch (e) { /* ignore */ } + } + this._colorDirtyProtos.clear(); + } } clear() { diff --git a/src/engine/BlockTypes.js b/src/engine/BlockTypes.js index cf4e901..d2762b0 100644 --- a/src/engine/BlockTypes.js +++ b/src/engine/BlockTypes.js @@ -105,6 +105,11 @@ export const BLOCK_TYPES = [ // top = stone, side = oven (4 стороны с дверцей — лучше чем раньше), // bottom = stone. В будущем для одной двери понадобится 6-face формат. multiCube('oven', 'Печь', 'Особые', `${TEX}/stone.png`, `${TEX}/oven.png`, `${TEX}/stone.png`), + + // === ОКРАШИВАЕМЫЕ (задача 09) — паритет со студией === + cube('studs-block', 'Лего-кирпич', 'Окрашиваемые', + '/kubikon-assets/materials/studs_diffuse.png', + { colorable: true, normal: '/kubikon-assets/materials/studs_normal.png', defaultColor: '#3a7aff' }), ]; /** Все доступные категории в порядке появления. */ @@ -120,6 +125,7 @@ export const CATEGORY_COLORS = { 'Кирпич': '#9d4a3a', 'Особые': '#9966ff', 'Природа': '#5a8c3e', + 'Окрашиваемые': '#3a7aff', }; /** Найти описание блока по id. */ diff --git a/src/engine/GameRuntime.js b/src/engine/GameRuntime.js index 0af15d3..143d080 100644 --- a/src/engine/GameRuntime.js +++ b/src/engine/GameRuntime.js @@ -2385,6 +2385,15 @@ export class GameRuntime { try { const color = payload?.color; if (typeof color !== 'string') return; + // Окрашиваемый блок (studs-block): ref 'block:x,y,z' → BlockManager. + const ref = payload?.id; + if (typeof ref === 'string' && ref.startsWith('block:')) { + const parts = ref.slice(6).split(',').map(Number); + if (parts.length === 3 && parts.every(Number.isFinite)) { + this.scene3d?.blockManager?.setBlockColor?.(parts[0], parts[1], parts[2], color); + } + return; + } const pm = this.scene3d?.primitiveManager; if (!pm) return; const rid = this._resolvePrimitiveId(payload?.id); @@ -3199,7 +3208,8 @@ export class GameRuntime { if (!this._localToReal) this._localToReal = new Map(); try { if (kind === 'block') { - this.scene3d?.blockManager?.addBlock(payload.x, payload.y, payload.z, subType); + // color — для окрашиваемых блоков (studs-block); иначе игнорируется. + this.scene3d?.blockManager?.addBlock(payload.x, payload.y, payload.z, subType, payload.color); // Для блоков ref детерминированный, но запоминаем — чтобы при // Stop удалить заспавненные скриптом блоки (см. stop()). if (ref) this._localToReal.set(ref, ref); diff --git a/src/engine/ModelTypes.js b/src/engine/ModelTypes.js index 5badaab..16cccf5 100644 --- a/src/engine/ModelTypes.js +++ b/src/engine/ModelTypes.js @@ -1,939 +1,1018 @@ -/** - * ModelTypes — реестр 3D-моделей (GLB) для Рублокс-редактора. - * - * Все модели — Kenney CC0, лежат в /public/kubikon-assets/models// - * где pack ∈ {dungeon, platformer, characters}. - * GLB файл ссылается на ./Textures/colormap.png — поэтому каждый pack лежит - * в своей подпапке со своей колормапой. - */ - -const M = '/kubikon-assets/models'; - -/** - * Создать запись о модели. - * pack — имя подпапки ('dungeon' | 'platformer' | 'characters'). - * file — имя GLB без расширения. - */ -const m = (id, name, category, pack, file, opts = {}) => ({ - id, name, category, - file: `${M}/${pack}/${file}.glb`, - scale: opts.scale ?? 1, - yOffset: opts.yOffset ?? 0, - ...opts, -}); - -/** - * Создать запись о модели с произвольным URL (вне kubikon-assets). - * url — полный путь от корня сайта, например '/playground-kit/slide.glb'. - */ -const mu = (id, name, category, url, opts = {}) => ({ - id, name, category, - file: url, - scale: opts.scale ?? 1, - yOffset: opts.yOffset ?? 0, - ...opts, -}); - -/** - * mc — «compound»-модель из нескольких частей. При постановке создаётся папка - * и каждая part добавляется внутрь. - * id, name, category — как у обычных моделей - * parts: [ - * { kind: 'mesh', model: 'id-простой-модели', dx, dy, dz, ry } - * { kind: 'primitive', type: 'cube'|'sphere'|..., sx, sy, sz, color, dx, dy, dz, rx, ry, rz } - * ] - * Координаты dx/dy/dz — смещение относительно центра компаунда; ry — локальный yaw. - */ -const mc = (id, name, category, parts, opts = {}) => ({ - id, name, category, - file: null, // нет основного GLB — модель собирается из частей - scale: 1, - parts, - isCompound: true, - ...opts, -}); - -export const MODEL_TYPES = [ - // === ПРИРОДА (platformer pack) === - m('tree', 'Дерево', 'Природа', 'platformer', 'tree', { targetHeight: 1.5 }), - m('tree-pine', 'Сосна', 'Природа', 'platformer', 'tree-pine', { targetHeight: 4 }), - m('tree-pine-small', 'Молодая сосна', 'Природа', 'platformer', 'tree-pine-small', { targetHeight: 2.5 }), - m('tree-pine-snow', 'Снежная сосна', 'Природа', 'platformer', 'tree-pine-snow', { targetHeight: 4 }), - m('tree-snow', 'Снежное дерево', 'Природа', 'platformer', 'tree-snow', { targetHeight: 4 }), - m('flowers', 'Цветы', 'Природа', 'platformer', 'flowers', { targetHeight: 0.6 }), - m('flowers-tall', 'Высокие цветы', 'Природа', 'platformer', 'flowers-tall', { targetHeight: 0.6 }), - m('mushrooms', 'Грибы', 'Природа', 'platformer', 'mushrooms', { targetHeight: 0.6 }), - m('plant', 'Растение', 'Природа', 'platformer', 'plant', { targetHeight: 0.7 }), - m('grass-model', 'Трава', 'Природа', 'platformer', 'grass', { targetHeight: 0.7 }), - m('hedge', 'Куст', 'Природа', 'platformer', 'hedge', { targetHeight: 0.7 }), - m('rocks-platformer','Камни', 'Природа', 'platformer', 'rocks', { targetHeight: 1.5 }), - m('rocks-dungeon', 'Скалы', 'Природа', 'dungeon', 'rocks', { targetHeight: 1.5 }), - m('stones', 'Булыжники', 'Природа', 'dungeon', 'stones', { targetHeight: 0.8 }), - - // === ДВЕРИ И ВОРОТА === - m('door-rotate', 'Дверь', 'Двери', 'platformer', 'door-rotate', { targetHeight: 1.8 }), - m('door-rotate-large', 'Большая дверь', 'Двери', 'platformer', 'door-rotate-large', { targetHeight: 1.8 }), - m('door-open', 'Открытая дверь', 'Двери', 'platformer', 'door-open', { targetHeight: 1.8 }), - m('door-large-open', 'Откр. бол. дверь','Двери', 'platformer', 'door-large-open', { targetHeight: 1.8 }), - m('gate', 'Ворота', 'Двери', 'dungeon', 'gate', { targetHeight: 1.8 }), - - // === ЗАБОРЫ (platformer) === - m('fence-straight', 'Забор', 'Заборы', 'platformer', 'fence-straight', { targetHeight: 1.2 }), - m('fence-corner', 'Угол забора', 'Заборы', 'platformer', 'fence-corner', { targetHeight: 1.2 }), - m('fence-broken', 'Сломанный забор', 'Заборы', 'platformer', 'fence-broken', { targetHeight: 1.2 }), - m('fence-rope', 'Верёвочный забор','Заборы', 'platformer', 'fence-rope', { targetHeight: 1.2 }), - m('fence-low-straight', 'Низкий забор', 'Заборы', 'platformer', 'fence-low-straight', { targetHeight: 1.2 }), - - // === МЕБЕЛЬ И ИНТЕРЬЕР === - m('chest', 'Сундук', 'Мебель', 'dungeon', 'chest', { targetHeight: 1.2 }), - m('barrel', 'Бочка', 'Мебель', 'dungeon', 'barrel', { targetHeight: 1.2 }), - m('crate', 'Ящик', 'Мебель', 'platformer', 'crate', { targetHeight: 1.2 }), - m('column', 'Колонна', 'Мебель', 'dungeon', 'column', { targetHeight: 1.2 }), - m('banner', 'Знамя', 'Мебель', 'dungeon', 'banner', { targetHeight: 1.2 }), - m('flag', 'Флаг', 'Мебель', 'platformer', 'flag', { targetHeight: 1.2 }), - m('sign', 'Табличка', 'Мебель', 'platformer', 'sign', { targetHeight: 1.2 }), - m('ladder', 'Лестница', 'Мебель', 'platformer', 'ladder', { targetHeight: 1.2 }), - m('ladder-long', 'Длин. лестница', 'Мебель', 'platformer', 'ladder-long', { targetHeight: 1.2 }), - m('ladder-broken', 'Слом. лестница', 'Мебель', 'platformer', 'ladder-broken', { targetHeight: 1.2 }), - m('stairs', 'Ступеньки', 'Мебель', 'dungeon', 'stairs', { targetHeight: 1.2 }), - m('wood-structure', 'Дерев. конструкция','Мебель','dungeon', 'wood-structure', { targetHeight: 1.2 }), - m('wood-support', 'Дерев. опора', 'Мебель', 'dungeon', 'wood-support', { targetHeight: 1.2 }), - m('wall', 'Стена', 'Мебель', 'dungeon', 'wall', { targetHeight: 1.2 }), - m('wall-half', 'Половина стены', 'Мебель', 'dungeon', 'wall-half', { targetHeight: 1.2 }), - m('wall-narrow', 'Узкая стена', 'Мебель', 'dungeon', 'wall-narrow', { targetHeight: 1.2 }), - m('wall-opening', 'Стена с проёмом', 'Мебель', 'dungeon', 'wall-opening', { targetHeight: 1.2 }), - m('floor', 'Пол', 'Мебель', 'dungeon', 'floor', { targetHeight: 1.2 }), - m('floor-detail', 'Узорный пол', 'Мебель', 'dungeon', 'floor-detail', { targetHeight: 1.2 }), - - // === МЕХАНИЗМЫ (platformer) === - m('lever', 'Рычаг', 'Механизмы', 'platformer', 'lever', { targetHeight: 1 }), - m('button-round', 'Кнопка круглая', 'Механизмы', 'platformer', 'button-round', { targetHeight: 1 }), - m('button-square', 'Кнопка квадратная','Механизмы','platformer', 'button-square', { targetHeight: 1 }), - m('spring', 'Пружина', 'Механизмы', 'platformer', 'spring', { targetHeight: 1 }), - m('saw', 'Пила', 'Механизмы', 'platformer', 'saw', { targetHeight: 1 }), - m('trap-dungeon', 'Ловушка', 'Механизмы', 'dungeon', 'trap', { targetHeight: 1 }), - m('trap-spikes', 'Шипы', 'Механизмы', 'platformer', 'trap-spikes', { targetHeight: 1 }), - m('trap-spikes-large', 'Большие шипы', 'Механизмы', 'platformer', 'trap-spikes-large', { targetHeight: 1 }), - m('spike-block', 'Шипастый блок', 'Механизмы', 'platformer', 'spike-block', { targetHeight: 1 }), - m('pipe', 'Труба', 'Механизмы', 'platformer', 'pipe', { targetHeight: 1 }), - m('poles', 'Столбы', 'Механизмы', 'platformer', 'poles', { targetHeight: 1 }), - m('bomb', 'Бомба', 'Механизмы', 'platformer', 'bomb', { targetHeight: 1 }), - - // === ПРЕДМЕТЫ === - m('coin', 'Монета', 'Предметы', 'dungeon', 'coin', { targetHeight: 0.6 }), - m('coin-gold', 'Золотая монета', 'Предметы', 'platformer', 'coin-gold', { targetHeight: 0.6 }), - m('coin-silver', 'Серебр. монета', 'Предметы', 'platformer', 'coin-silver', { targetHeight: 0.6 }), - m('coin-bronze', 'Бронз. монета', 'Предметы', 'platformer', 'coin-bronze', { targetHeight: 0.6 }), - m('jewel', 'Драгоценность', 'Предметы', 'platformer', 'jewel', { targetHeight: 0.6 }), - m('star', 'Звезда', 'Предметы', 'platformer', 'star', { targetHeight: 0.6 }), - m('heart', 'Сердце', 'Предметы', 'platformer', 'heart', { targetHeight: 0.6 }), - m('key', 'Ключ', 'Предметы', 'platformer', 'key', { targetHeight: 0.6 }), - m('lock', 'Замок', 'Предметы', 'platformer', 'lock', { targetHeight: 0.6 }), - m('arrow', 'Стрела', 'Предметы', 'platformer', 'arrow', { targetHeight: 0.6 }), - - // === ОРУЖИЕ (dungeon) === - m('weapon-sword', 'Меч', 'Оружие', 'dungeon', 'weapon-sword', { targetHeight: 1 }), - m('weapon-spear', 'Копьё', 'Оружие', 'dungeon', 'weapon-spear', { targetHeight: 1.2 }), - m('shield-round', 'Круглый щит', 'Оружие', 'dungeon', 'shield-round', { targetHeight: 1 }), - m('shield-rectangle', 'Прямоуг. щит', 'Оружие', 'dungeon', 'shield-rectangle', { targetHeight: 1 }), - - // === ВРАГИ (со встроенным AI) === - // Эти объекты имеют поведение в Play-режиме: AI, спавн, урон. - // gameplay содержит description для tooltip и defaultParams — настройки - // которые можно менять в Inspector. - m('zombie', 'Зомби', 'Враги', 'characters', 'character-c', { - targetHeight: 1.7, - // Скрыт из палитры — одиночный AI-зомби нестабилен (нерешённый баг с - // y-провалом на GLB-террейне, см. feedback_babylon про оптимизации). - // Используйте «Спавнер зомби» вместо одиночной модели. - hidden: true, - gameplay: { - type: 'zombie', - isZombie: true, - description: 'Враг с AI: бродит по миру, атакует игрока при приближении.', - defaultParams: { - hp: 50, - speed: 2.2, // м/с в погоне - wanderSpeed: 1.3, // м/с при патрулировании - detectionRadius: 16, // дистанция обнаружения игрока - attackRange: 1.8, // дистанция атаки - attackDamage: 10, // урон за удар - attackCooldown: 1.0, // секунд между ударами - wanderRadius: 14, // радиус патрулирования - }, - }, - }), - // Спавнер — синтетическая модель: вместо GLB ModelManager рисует диск-цилиндр. - // file=null + synthetic=true распознаётся в ModelManager._buildSyntheticInstance. - m('zombie-spawner', 'Спавнер зомби', 'Враги', 'characters', 'character-d', { - targetHeight: 0.3, - synthetic: 'spawner-disk', - gameplay: { - type: 'zombie-spawner', - isZombieSpawner: true, - description: 'Спавнит зомби с заданным интервалом, поддерживая лимит живых.', - defaultParams: { - maxAlive: 10, - spawnInterval: 10, - radius: 1, // 1 блок - zombieModelType: 'character-c', - zombieHp: 50, - zombieSpeed: 2.2, - zombieDamage: 10, - }, - }, - }), - - // === ПЕРСОНАЖИ === - m('character-a', 'Стив', 'Персонажи', 'characters', 'character-a', { targetHeight: 1.7 }), - m('character-b', 'Алекс', 'Персонажи', 'characters', 'character-b', { targetHeight: 1.7 }), - m('character-c', 'Виктор', 'Персонажи', 'characters', 'character-c', { targetHeight: 1.7 }), - m('character-d', 'Ирина', 'Персонажи', 'characters', 'character-d', { targetHeight: 1.7 }), - m('character-e', 'Паша', 'Персонажи', 'characters', 'character-e', { targetHeight: 1.7 }), - m('character-f', 'Юля', 'Персонажи', 'characters', 'character-f', { targetHeight: 1.7 }), - m('character-g', 'Андрей', 'Персонажи', 'characters', 'character-g', { targetHeight: 1.7 }), - - // === KENNEY PACKS — auto-generated === - // === Природа === (50) - m('nature-bridge-center-stone', 'Мост центр Камень', 'Природа', 'nature-kit', 'bridge_center_stone', { targetHeight: 1.5 }), - m('nature-bridge-center-stoneround', 'Мост центр кам. круглый', 'Природа', 'nature-kit', 'bridge_center_stoneRound', { targetHeight: 1.5 }), - m('nature-bridge-center-wood', 'Середина деревянного моста', 'Природа', 'nature-kit', 'bridge_center_wood', { targetHeight: 1.5 }), - m('nature-bridge-center-woodround', 'Мост центр дер. круглый', 'Природа', 'nature-kit', 'bridge_center_woodRound', { targetHeight: 1.5 }), - m('nature-bridge-side-stone', 'Мост бок Камень', 'Природа', 'nature-kit', 'bridge_side_stone', { targetHeight: 1.5 }), - m('nature-bridge-side-stoneround', 'Мост бок кам. круглый', 'Природа', 'nature-kit', 'bridge_side_stoneRound', { targetHeight: 1.5 }), - m('nature-bridge-side-wood', 'Край деревянного моста', 'Природа', 'nature-kit', 'bridge_side_wood', { targetHeight: 1.5 }), - m('nature-bridge-side-woodround', 'Мост бок дер. круглый', 'Природа', 'nature-kit', 'bridge_side_woodRound', { targetHeight: 1.5 }), - m('nature-bridge-stone', 'Мост Камень', 'Природа', 'nature-kit', 'bridge_stone', { targetHeight: 1.5 }), - m('nature-bridge-stonenarrow', 'Каменный узкий мост', 'Природа', 'nature-kit', 'bridge_stoneNarrow', { targetHeight: 1.5 }), - m('nature-bridge-stoneround', 'Каменный круглый мост', 'Природа', 'nature-kit', 'bridge_stoneRound', { targetHeight: 1.5 }), - m('nature-bridge-stoneroundnarrow', 'Каменный круглый узкий мост', 'Природа', 'nature-kit', 'bridge_stoneRoundNarrow', { targetHeight: 1.5 }), - m('nature-bridge-wood', 'Деревянный мост', 'Природа', 'nature-kit', 'bridge_wood', { targetHeight: 1.5 }), - m('nature-bridge-woodnarrow', 'Деревянный узкий мост', 'Природа', 'nature-kit', 'bridge_woodNarrow', { targetHeight: 1.5 }), - m('nature-bridge-woodround', 'Деревянный круглый мост', 'Природа', 'nature-kit', 'bridge_woodRound', { targetHeight: 1.5 }), - m('nature-bridge-woodroundnarrow', 'Деревянный круглый узкий мост', 'Природа', 'nature-kit', 'bridge_woodRoundNarrow', { targetHeight: 1.5 }), - m('nature-cactus-short', 'Кактус низкий', 'Природа', 'nature-kit', 'cactus_short', { targetHeight: 1.5 }), - m('nature-cactus-tall', 'Кактус высокий', 'Природа', 'nature-kit', 'cactus_tall', { targetHeight: 2.5 }), - m('nature-campfire-logs', 'Костёр (дрова)', 'Природа', 'nature-kit', 'campfire_logs', { targetHeight: 0.6 }), - m('nature-campfire-stones', 'Костёр Булыжники', 'Природа', 'nature-kit', 'campfire_stones', { targetHeight: 0.6 }), - m('nature-cliff-blockcave-rock', 'Скала пещерный блок Камень', 'Природа', 'nature-kit', 'cliff_blockCave_rock', { targetHeight: 1.5 }), - m('nature-cliff-blockcave-stone', 'Скала пещерный блок Камень', 'Природа', 'nature-kit', 'cliff_blockCave_stone', { targetHeight: 1.5 }), - m('nature-cliff-blockdiagonal-rock', 'Скала диагональный блок Камень', 'Природа', 'nature-kit', 'cliff_blockDiagonal_rock', { targetHeight: 1.5 }), - m('nature-cliff-blockdiagonal-stone', 'Скала диагональный блок Камень', 'Природа', 'nature-kit', 'cliff_blockDiagonal_stone', { targetHeight: 1.5 }), - m('nature-cliff-blockhalf-rock', 'Скала полублок Камень', 'Природа', 'nature-kit', 'cliff_blockHalf_rock', { targetHeight: 1.5 }), - m('nature-cliff-blockhalf-stone', 'Скала полублок Камень', 'Природа', 'nature-kit', 'cliff_blockHalf_stone', { targetHeight: 1.5 }), - m('nature-cliff-blockquarter-rock', 'Скала четверть-блок Камень', 'Природа', 'nature-kit', 'cliff_blockQuarter_rock', { targetHeight: 1.5 }), - m('nature-cliff-blockquarter-stone', 'Скала четверть-блок Камень', 'Природа', 'nature-kit', 'cliff_blockQuarter_stone', { targetHeight: 1.5 }), - m('nature-cliff-blockslopehalfwalls-rock', 'Скала наклон полублок со стенами Камень', 'Природа', 'nature-kit', 'cliff_blockSlopeHalfWalls_rock', { targetHeight: 1.5 }), - m('nature-cliff-blockslopehalfwalls-stone', 'Скала наклон полублок со стенами Камень', 'Природа', 'nature-kit', 'cliff_blockSlopeHalfWalls_stone', { targetHeight: 1.5 }), - m('nature-cliff-blockslopewalls-rock', 'Скала наклон блок со стенами Камень', 'Природа', 'nature-kit', 'cliff_blockSlopeWalls_rock', { targetHeight: 1.5 }), - m('nature-cliff-blockslopewalls-stone', 'Скала наклон блок со стенами Камень', 'Природа', 'nature-kit', 'cliff_blockSlopeWalls_stone', { targetHeight: 1.5 }), - m('nature-cliff-blockslope-rock', 'Скала наклон Камень', 'Природа', 'nature-kit', 'cliff_blockSlope_rock', { targetHeight: 1.5 }), - m('nature-cliff-blockslope-stone', 'Скала наклон Камень', 'Природа', 'nature-kit', 'cliff_blockSlope_stone', { targetHeight: 1.5 }), - m('nature-cliff-block-rock', 'Скала блок Камень', 'Природа', 'nature-kit', 'cliff_block_rock', { targetHeight: 1.5 }), - m('nature-cliff-block-stone', 'Скала блок Камень', 'Природа', 'nature-kit', 'cliff_block_stone', { targetHeight: 1.5 }), - m('nature-cliff-cave-rock', 'Скала пещера Камень', 'Природа', 'nature-kit', 'cliff_cave_rock', { targetHeight: 1.5 }), - m('nature-cliff-cave-stone', 'Скала пещера Камень', 'Природа', 'nature-kit', 'cliff_cave_stone', { targetHeight: 1.5 }), - m('nature-cliff-cornerinnerlarge-rock', 'Скала внутр. угол большой Камень', 'Природа', 'nature-kit', 'cliff_cornerInnerLarge_rock', { targetHeight: 1.5 }), - m('nature-cliff-cornerinnerlarge-stone', 'Скала внутр. угол большой Камень', 'Природа', 'nature-kit', 'cliff_cornerInnerLarge_stone', { targetHeight: 1.5 }), - m('nature-cliff-cornerinnertop-rock', 'Скала внутр. верхний угол Камень', 'Природа', 'nature-kit', 'cliff_cornerInnerTop_rock', { targetHeight: 1.5 }), - m('nature-cliff-cornerinnertop-stone', 'Скала внутр. верхний угол Камень', 'Природа', 'nature-kit', 'cliff_cornerInnerTop_stone', { targetHeight: 1.5 }), - m('nature-cliff-cornerinner-rock', 'Скала внутр. угол Камень', 'Природа', 'nature-kit', 'cliff_cornerInner_rock', { targetHeight: 1.5 }), - m('nature-cliff-cornerinner-stone', 'Скала внутр. угол Камень', 'Природа', 'nature-kit', 'cliff_cornerInner_stone', { targetHeight: 1.5 }), - m('nature-cliff-cornerlarge-rock', 'Скала угол большой Камень', 'Природа', 'nature-kit', 'cliff_cornerLarge_rock', { targetHeight: 1.5 }), - m('nature-cliff-cornerlarge-stone', 'Скала угол большой Камень', 'Природа', 'nature-kit', 'cliff_cornerLarge_stone', { targetHeight: 1.5 }), - m('nature-cliff-cornertop-rock', 'Скала верхний угол Камень', 'Природа', 'nature-kit', 'cliff_cornerTop_rock', { targetHeight: 1.5 }), - m('nature-cliff-cornertop-stone', 'Скала верхний угол Камень', 'Природа', 'nature-kit', 'cliff_cornerTop_stone', { targetHeight: 1.5 }), - m('nature-cliff-corner-rock', 'Скала угол Камень', 'Природа', 'nature-kit', 'cliff_corner_rock', { targetHeight: 1.5 }), - m('nature-cliff-corner-stone', 'Скала угол Камень', 'Природа', 'nature-kit', 'cliff_corner_stone', { targetHeight: 1.5 }), - - // === Транспорт === (47) - m('car-ambulance', 'Скорая', 'Транспорт', 'car-kit', 'ambulance', { targetHeight: 2.5 }), - m('car-delivery-flat', 'Доставка плоская', 'Транспорт', 'car-kit', 'delivery-flat', { targetHeight: 2.2 }), - m('car-delivery', 'Фургон', 'Транспорт', 'car-kit', 'delivery', { targetHeight: 2.2 }), - m('car-firetruck', 'Пожарная', 'Транспорт', 'car-kit', 'firetruck', { targetHeight: 2.5 }), - m('car-garbage-truck', 'Мусоровоз', 'Транспорт', 'car-kit', 'garbage-truck', { targetHeight: 2.5 }), - m('car-hatchback-sports', 'Хэтчбек спорт', 'Транспорт', 'car-kit', 'hatchback-sports', { targetHeight: 1.5 }), - m('car-kart-oobi', 'Карт ооби', 'Транспорт', 'car-kit', 'kart-oobi', { targetHeight: 1.2 }), - m('car-kart-oodi', 'Карт ооди', 'Транспорт', 'car-kit', 'kart-oodi', { targetHeight: 1.2 }), - m('car-kart-ooli', 'Карт ооли', 'Транспорт', 'car-kit', 'kart-ooli', { targetHeight: 1.2 }), - m('car-kart-oopi', 'Карт оопи', 'Транспорт', 'car-kit', 'kart-oopi', { targetHeight: 1.2 }), - m('car-kart-oozi', 'Карт оози', 'Транспорт', 'car-kit', 'kart-oozi', { targetHeight: 1.2 }), - m('car-police', 'Полицейская', 'Транспорт', 'car-kit', 'police', { targetHeight: 1.5 }), - m('car-race-future', 'Болид будущего', 'Транспорт', 'car-kit', 'race-future', { targetHeight: 1.5 }), - m('car-race', 'Гоночная', 'Транспорт', 'car-kit', 'race', { targetHeight: 1.5 }), - m('car-sedan-sports', 'Седан спорт', 'Транспорт', 'car-kit', 'sedan-sports', { targetHeight: 1.5 }), - m('car-sedan', 'Седан', 'Транспорт', 'car-kit', 'sedan', { targetHeight: 1.5 }), - m('car-suv-luxury', 'Внедорожник люкс', 'Транспорт', 'car-kit', 'suv-luxury', { targetHeight: 1.8 }), - m('car-suv', 'Внедорожник', 'Транспорт', 'car-kit', 'suv', { targetHeight: 1.8 }), - m('car-taxi', 'Такси', 'Транспорт', 'car-kit', 'taxi', { targetHeight: 1.5 }), - m('car-tractor-police', 'Трактор полиции', 'Транспорт', 'car-kit', 'tractor-police', { targetHeight: 2.2 }), - m('car-tractor-shovel', 'Трактор-погрузчик', 'Транспорт', 'car-kit', 'tractor-shovel', { targetHeight: 2.2 }), - m('car-tractor', 'Трактор', 'Транспорт', 'car-kit', 'tractor', { targetHeight: 2.2 }), - m('car-truck-flat', 'Грузовик плоский', 'Транспорт', 'car-kit', 'truck-flat', { targetHeight: 2.2 }), - m('car-truck', 'Грузовик', 'Транспорт', 'car-kit', 'truck', { targetHeight: 2.2 }), - m('car-van', 'Минивэн', 'Транспорт', 'car-kit', 'van', { targetHeight: 1.8 }), - m('car-wheel-dark', 'Колесо тёмное', 'Транспорт', 'car-kit', 'wheel-dark', { targetHeight: 0.5 }), - m('car-wheel-default', 'Колесо обычное', 'Транспорт', 'car-kit', 'wheel-default', { targetHeight: 0.5 }), - m('car-wheel-racing', 'Колесо гоночное', 'Транспорт', 'car-kit', 'wheel-racing', { targetHeight: 0.5 }), - m('car-wheel-tractor-back', 'Колесо Трактор зад', 'Транспорт', 'car-kit', 'wheel-tractor-back', { targetHeight: 2.2 }), - m('car-wheel-tractor-dark-back', 'Колесо Трактор тёмный зад', 'Транспорт', 'car-kit', 'wheel-tractor-dark-back', { targetHeight: 2.2 }), - m('car-wheel-tractor-dark-front', 'Колесо Трактор тёмный перед', 'Транспорт', 'car-kit', 'wheel-tractor-dark-front', { targetHeight: 2.2 }), - m('car-wheel-tractor-front', 'Колесо Трактор перед', 'Транспорт', 'car-kit', 'wheel-tractor-front', { targetHeight: 2.2 }), - m('car-wheel-truck', 'Колесо Грузовик', 'Транспорт', 'car-kit', 'wheel-truck', { targetHeight: 2.2 }), - m('toy-car-vehicle-drag-racer', 'Vehicle тяга гонщик', 'Транспорт', 'toy-car-kit', 'vehicle-drag-racer', { targetHeight: 1.5 }), - m('toy-car-vehicle-monster-truck', 'Vehicle monster Грузовик', 'Транспорт', 'toy-car-kit', 'vehicle-monster-truck', { targetHeight: 2.2 }), - m('toy-car-vehicle-racer-low', 'Vehicle гонщик низкий', 'Транспорт', 'toy-car-kit', 'vehicle-racer-low', { targetHeight: 1.5 }), - m('toy-car-vehicle-racer', 'Vehicle гонщик', 'Транспорт', 'toy-car-kit', 'vehicle-racer', { targetHeight: 1.5 }), - m('toy-car-vehicle-suv', 'Vehicle Внедорожник', 'Транспорт', 'toy-car-kit', 'vehicle-suv', { targetHeight: 1.8 }), - m('toy-car-vehicle-truck', 'Vehicle Грузовик', 'Транспорт', 'toy-car-kit', 'vehicle-truck', { targetHeight: 2.2 }), - m('toy-car-vehicle-vintage-racer', 'Vehicle vintage гонщик', 'Транспорт', 'toy-car-kit', 'vehicle-vintage-racer', { targetHeight: 1.5 }), - m('toy-car-wheel-large', 'Колесо большой', 'Транспорт', 'toy-car-kit', 'wheel-large', { targetHeight: 0.5 }), - m('toy-car-wheel-medium', 'Колесо средний', 'Транспорт', 'toy-car-kit', 'wheel-medium', { targetHeight: 0.5 }), - m('toy-car-wheel-small', 'Колесо маленький', 'Транспорт', 'toy-car-kit', 'wheel-small', { targetHeight: 0.5 }), - m('racing-racecargreen', 'Гоночная машина зелёный', 'Транспорт', 'racing-kit', 'raceCarGreen', { targetHeight: 1.5 }), - m('racing-racecarorange', 'Гоночная машина оранжевый', 'Транспорт', 'racing-kit', 'raceCarOrange', { targetHeight: 1.5 }), - m('racing-racecarred', 'Гоночная машина красный', 'Транспорт', 'racing-kit', 'raceCarRed', { targetHeight: 1.5 }), - m('racing-racecarwhite', 'Гоночная машина белый', 'Транспорт', 'racing-kit', 'raceCarWhite', { targetHeight: 1.5 }), - - // === Лодки === (43) - m('watercraft-boat-fan', 'Воздушная лодка', 'Лодки', 'watercraft-kit', 'boat-fan', { targetHeight: 1.8 }), - m('watercraft-boat-fishing-small', 'Маленькая рыболовная лодка', 'Лодки', 'watercraft-kit', 'boat-fishing-small', { targetHeight: 1.8 }), - m('watercraft-boat-house-a', 'Плавучий дом А', 'Лодки', 'watercraft-kit', 'boat-house-a', { targetHeight: 1.8 }), - m('watercraft-boat-house-b', 'Плавучий дом Б', 'Лодки', 'watercraft-kit', 'boat-house-b', { targetHeight: 1.8 }), - m('watercraft-boat-house-c', 'Плавучий дом В', 'Лодки', 'watercraft-kit', 'boat-house-c', { targetHeight: 1.8 }), - m('watercraft-boat-house-d', 'Плавучий дом Г', 'Лодки', 'watercraft-kit', 'boat-house-d', { targetHeight: 1.8 }), - m('watercraft-boat-row-large', 'Большая гребная лодка', 'Лодки', 'watercraft-kit', 'boat-row-large', { targetHeight: 1.8 }), - m('watercraft-boat-row-small', 'Маленькая гребная лодка', 'Лодки', 'watercraft-kit', 'boat-row-small', { targetHeight: 1.8 }), - m('watercraft-boat-sail-a', 'Парусник «Галеон»', 'Лодки', 'watercraft-kit', 'boat-sail-a', { targetHeight: 1.8 }), - m('watercraft-boat-sail-b', 'Парусник «Бриг»', 'Лодки', 'watercraft-kit', 'boat-sail-b', { targetHeight: 1.8 }), - m('watercraft-boat-speed-a', 'Скоростной катер «Молния»', 'Лодки', 'watercraft-kit', 'boat-speed-a', { targetHeight: 1.8 }), - m('watercraft-boat-speed-b', 'Скоростной катер «Шторм»', 'Лодки', 'watercraft-kit', 'boat-speed-b', { targetHeight: 1.8 }), - m('watercraft-boat-speed-c', 'Скоростной катер «Акула»', 'Лодки', 'watercraft-kit', 'boat-speed-c', { targetHeight: 1.8 }), - m('watercraft-boat-speed-d', 'Скоростной катер «Барракуда»', 'Лодки', 'watercraft-kit', 'boat-speed-d', { targetHeight: 1.8 }), - m('watercraft-boat-speed-e', 'Скоростной катер «Дельфин»', 'Лодки', 'watercraft-kit', 'boat-speed-e', { targetHeight: 1.8 }), - m('watercraft-boat-speed-f', 'Скоростной катер «Стрела»', 'Лодки', 'watercraft-kit', 'boat-speed-f', { targetHeight: 1.8 }), - m('watercraft-boat-speed-g', 'Скоростной катер «Орка»', 'Лодки', 'watercraft-kit', 'boat-speed-g', { targetHeight: 1.8 }), - m('watercraft-boat-speed-h', 'Скоростной катер «Кит»', 'Лодки', 'watercraft-kit', 'boat-speed-h', { targetHeight: 1.8 }), - m('watercraft-boat-speed-i', 'Скоростной катер «Парус»', 'Лодки', 'watercraft-kit', 'boat-speed-i', { targetHeight: 1.8 }), - m('watercraft-boat-speed-j', 'Скоростной катер «Нептун»', 'Лодки', 'watercraft-kit', 'boat-speed-j', { targetHeight: 1.8 }), - m('watercraft-boat-tow-a', 'Лодка tow a', 'Лодки', 'watercraft-kit', 'boat-tow-a', { targetHeight: 1.8 }), - m('watercraft-boat-tow-b', 'Лодка tow b', 'Лодки', 'watercraft-kit', 'boat-tow-b', { targetHeight: 1.8 }), - m('watercraft-boat-tug-a', 'Лодка tug a', 'Лодки', 'watercraft-kit', 'boat-tug-a', { targetHeight: 1.8 }), - m('watercraft-boat-tug-b', 'Лодка tug b', 'Лодки', 'watercraft-kit', 'boat-tug-b', { targetHeight: 1.8 }), - m('watercraft-boat-tug-c', 'Лодка tug c', 'Лодки', 'watercraft-kit', 'boat-tug-c', { targetHeight: 1.8 }), - m('watercraft-ship-cargo-a', 'Корабль грузовой a', 'Лодки', 'watercraft-kit', 'ship-cargo-a', { targetHeight: 4 }), - m('watercraft-ship-cargo-b', 'Корабль грузовой b', 'Лодки', 'watercraft-kit', 'ship-cargo-b', { targetHeight: 4 }), - m('watercraft-ship-cargo-c', 'Корабль грузовой c', 'Лодки', 'watercraft-kit', 'ship-cargo-c', { targetHeight: 4 }), - m('watercraft-ship-large', 'Корабль большой', 'Лодки', 'watercraft-kit', 'ship-large', { targetHeight: 4 }), - m('watercraft-ship-ocean-liner-small', 'Корабль ocean liner маленький', 'Лодки', 'watercraft-kit', 'ship-ocean-liner-small', { targetHeight: 4 }), - m('watercraft-ship-ocean-liner', 'Корабль ocean liner', 'Лодки', 'watercraft-kit', 'ship-ocean-liner', { targetHeight: 4 }), - m('watercraft-ship-small-ghost', 'Корабль маленький Призрак', 'Лодки', 'watercraft-kit', 'ship-small-ghost', { targetHeight: 4 }), - m('watercraft-ship-small', 'Корабль маленький', 'Лодки', 'watercraft-kit', 'ship-small', { targetHeight: 4 }), - m('pirate-boat-row-large', 'Большая гребная лодка', 'Лодки', 'pirate-kit', 'boat-row-large', { targetHeight: 1.8 }), - m('pirate-boat-row-small', 'Маленькая гребная лодка', 'Лодки', 'pirate-kit', 'boat-row-small', { targetHeight: 1.8 }), - m('pirate-ship-ghost', 'Корабль Призрак', 'Лодки', 'pirate-kit', 'ship-ghost', { targetHeight: 4 }), - m('pirate-ship-large', 'Корабль большой', 'Лодки', 'pirate-kit', 'ship-large', { targetHeight: 4 }), - m('pirate-ship-medium', 'Корабль средний', 'Лодки', 'pirate-kit', 'ship-medium', { targetHeight: 4 }), - m('pirate-ship-pirate-large', 'Пиратский корабль большой', 'Лодки', 'pirate-kit', 'ship-pirate-large', { targetHeight: 4 }), - m('pirate-ship-pirate-medium', 'Пиратский корабль средний', 'Лодки', 'pirate-kit', 'ship-pirate-medium', { targetHeight: 4 }), - m('pirate-ship-pirate-small', 'Пиратский корабль маленький', 'Лодки', 'pirate-kit', 'ship-pirate-small', { targetHeight: 4 }), - m('pirate-ship-small', 'Корабль маленький', 'Лодки', 'pirate-kit', 'ship-small', { targetHeight: 4 }), - m('pirate-ship-wreck', 'Корабль Обломок', 'Лодки', 'pirate-kit', 'ship-wreck', { targetHeight: 4 }), - - // === Sci-Fi === (50) - m('space-alien', 'Пришелец', 'Sci-Fi', 'space-kit', 'alien', { targetHeight: 1.7 }), - m('space-astronauta', 'Космонавт А', 'Sci-Fi', 'space-kit', 'astronautA', { targetHeight: 1.7 }), - m('space-astronautb', 'Космонавт Б', 'Sci-Fi', 'space-kit', 'astronautB', { targetHeight: 1.7 }), - m('space-barrel', 'Бочка', 'Sci-Fi', 'space-kit', 'barrel', { targetHeight: 1 }), - m('space-barrels', 'Бочки', 'Sci-Fi', 'space-kit', 'barrels', { targetHeight: 1 }), - m('space-barrels-rail', 'Бочки Рельс', 'Sci-Fi', 'space-kit', 'barrels_rail', { targetHeight: 1 }), - m('space-bones', 'Кости', 'Sci-Fi', 'space-kit', 'bones', { targetHeight: 2 }), - m('space-chimney', 'Дымоход', 'Sci-Fi', 'space-kit', 'chimney', { targetHeight: 2 }), - m('space-chimney-detailed', 'Дымоход детальный', 'Sci-Fi', 'space-kit', 'chimney_detailed', { targetHeight: 2 }), - m('space-corridor', 'Коридор', 'Sci-Fi', 'space-kit', 'corridor', { targetHeight: 2 }), - m('space-corridor-corner', 'Коридор угол', 'Sci-Fi', 'space-kit', 'corridor_corner', { targetHeight: 2 }), - m('space-corridor-cornerround', 'Коридор угол круглый', 'Sci-Fi', 'space-kit', 'corridor_cornerRound', { targetHeight: 2 }), - m('space-corridor-cornerroundwindow', 'Коридор угол круглый Окно', 'Sci-Fi', 'space-kit', 'corridor_cornerRoundWindow', { targetHeight: 2 }), - m('space-corridor-cross', 'Коридор крест', 'Sci-Fi', 'space-kit', 'corridor_cross', { targetHeight: 2 }), - m('space-corridor-detailed', 'Коридор детальный', 'Sci-Fi', 'space-kit', 'corridor_detailed', { targetHeight: 2 }), - m('space-corridor-end', 'Коридор конец', 'Sci-Fi', 'space-kit', 'corridor_end', { targetHeight: 2 }), - m('space-corridor-open', 'Коридор открытый', 'Sci-Fi', 'space-kit', 'corridor_open', { targetHeight: 2 }), - m('space-corridor-roof', 'Коридор Крыша', 'Sci-Fi', 'space-kit', 'corridor_roof', { targetHeight: 2 }), - m('space-corridor-split', 'Коридор split', 'Sci-Fi', 'space-kit', 'corridor_split', { targetHeight: 2 }), - m('space-corridor-wall', 'Коридор Стена', 'Sci-Fi', 'space-kit', 'corridor_wall', { targetHeight: 2 }), - m('space-corridor-wallcorner', 'Коридор Стена угол', 'Sci-Fi', 'space-kit', 'corridor_wallCorner', { targetHeight: 2 }), - m('space-corridor-window', 'Коридор Окно', 'Sci-Fi', 'space-kit', 'corridor_window', { targetHeight: 2 }), - m('space-corridor-windowclosed', 'Коридор Окно закрытый', 'Sci-Fi', 'space-kit', 'corridor_windowClosed', { targetHeight: 2 }), - m('space-craft-cargoa', 'Корабль грузовой A', 'Sci-Fi', 'space-kit', 'craft_cargoA', { targetHeight: 3 }), - m('space-craft-cargob', 'Корабль грузовой B', 'Sci-Fi', 'space-kit', 'craft_cargoB', { targetHeight: 3 }), - m('space-craft-miner', 'Рудный корабль', 'Sci-Fi', 'space-kit', 'craft_miner', { targetHeight: 3 }), - m('space-craft-racer', 'Гоночный корабль', 'Sci-Fi', 'space-kit', 'craft_racer', { targetHeight: 3 }), - m('space-craft-speedera', 'Корабль Спидер A', 'Sci-Fi', 'space-kit', 'craft_speederA', { targetHeight: 3 }), - m('space-craft-speederb', 'Корабль Спидер B', 'Sci-Fi', 'space-kit', 'craft_speederB', { targetHeight: 3 }), - m('space-craft-speederc', 'Корабль Спидер C', 'Sci-Fi', 'space-kit', 'craft_speederC', { targetHeight: 3 }), - m('space-craft-speederd', 'Корабль Спидер D', 'Sci-Fi', 'space-kit', 'craft_speederD', { targetHeight: 3 }), - m('space-crater', 'Кратер', 'Sci-Fi', 'space-kit', 'crater', { targetHeight: 2 }), - m('space-craterlarge', 'Кратер большой', 'Sci-Fi', 'space-kit', 'craterLarge', { targetHeight: 2 }), - m('space-desk-chair', 'Письменный стол Стул', 'Sci-Fi', 'space-kit', 'desk_chair', { targetHeight: 2 }), - m('space-desk-chairarms', 'Письменный стол Стул Arms', 'Sci-Fi', 'space-kit', 'desk_chairArms', { targetHeight: 2 }), - m('space-desk-chairstool', 'Письменный стол Стул Табурет', 'Sci-Fi', 'space-kit', 'desk_chairStool', { targetHeight: 2 }), - m('space-desk-computer', 'Письменный стол Компьютер', 'Sci-Fi', 'space-kit', 'desk_computer', { targetHeight: 2 }), - m('space-desk-computercorner', 'Письменный стол Компьютер угол', 'Sci-Fi', 'space-kit', 'desk_computerCorner', { targetHeight: 2 }), - m('space-desk-computerscreen', 'Письменный стол Компьютер Screen', 'Sci-Fi', 'space-kit', 'desk_computerScreen', { targetHeight: 2 }), - m('space-gate-complex', 'Ворота сложный', 'Sci-Fi', 'space-kit', 'gate_complex', { targetHeight: 2 }), - m('space-gate-simple', 'Ворота simple', 'Sci-Fi', 'space-kit', 'gate_simple', { targetHeight: 2 }), - m('space-hangar-largea', 'Ангар большой A', 'Sci-Fi', 'space-kit', 'hangar_largeA', { targetHeight: 5 }), - m('space-hangar-largeb', 'Ангар большой B', 'Sci-Fi', 'space-kit', 'hangar_largeB', { targetHeight: 5 }), - m('space-hangar-rounda', 'Ангар круглый A', 'Sci-Fi', 'space-kit', 'hangar_roundA', { targetHeight: 5 }), - m('space-hangar-roundb', 'Ангар круглый B', 'Sci-Fi', 'space-kit', 'hangar_roundB', { targetHeight: 5 }), - m('space-hangar-roundglass', 'Ангар круглый Стакан', 'Sci-Fi', 'space-kit', 'hangar_roundGlass', { targetHeight: 5 }), - m('space-hangar-smalla', 'Ангар маленький A', 'Sci-Fi', 'space-kit', 'hangar_smallA', { targetHeight: 5 }), - m('space-hangar-smallb', 'Ангар маленький B', 'Sci-Fi', 'space-kit', 'hangar_smallB', { targetHeight: 5 }), - m('space-machine-barrel', 'Машина Бочка', 'Sci-Fi', 'space-kit', 'machine_barrel', { targetHeight: 1 }), - m('space-machine-barrellarge', 'Машина Бочка большой', 'Sci-Fi', 'space-kit', 'machine_barrelLarge', { targetHeight: 1 }), - - // === Здания === (21) - m('city-suburban-building-type-a', 'Жёлтый дом', 'Здания', 'city-kit-suburban', 'building-type-a', { targetHeight: 8 }), - m('city-suburban-building-type-b', 'Особняк с гаражом', 'Здания', 'city-kit-suburban', 'building-type-b', { targetHeight: 8 }), - m('city-suburban-building-type-c', 'Дом с террасой', 'Здания', 'city-kit-suburban', 'building-type-c', { targetHeight: 8 }), - m('city-suburban-building-type-d', 'Двухэтажный коттедж', 'Здания', 'city-kit-suburban', 'building-type-d', { targetHeight: 8 }), - m('city-suburban-building-type-e', 'Дом с мансардой', 'Здания', 'city-kit-suburban', 'building-type-e', { targetHeight: 8 }), - m('city-suburban-building-type-f', 'Современный дом', 'Здания', 'city-kit-suburban', 'building-type-f', { targetHeight: 8 }), - m('city-suburban-building-type-g', 'Кирпичный дом', 'Здания', 'city-kit-suburban', 'building-type-g', { targetHeight: 8 }), - m('city-suburban-building-type-h', 'Бунгало', 'Здания', 'city-kit-suburban', 'building-type-h', { targetHeight: 8 }), - m('city-suburban-building-type-i', 'Викторианский дом', 'Здания', 'city-kit-suburban', 'building-type-i', { targetHeight: 8 }), - m('city-suburban-building-type-j', 'Угловой дом', 'Здания', 'city-kit-suburban', 'building-type-j', { targetHeight: 8 }), - m('city-suburban-building-type-k', 'Дом с балконом', 'Здания', 'city-kit-suburban', 'building-type-k', { targetHeight: 8 }), - m('city-suburban-building-type-l', 'Загородный дом', 'Здания', 'city-kit-suburban', 'building-type-l', { targetHeight: 8 }), - m('city-suburban-building-type-m', 'Дом с крыльцом', 'Здания', 'city-kit-suburban', 'building-type-m', { targetHeight: 8 }), - m('city-suburban-building-type-n', 'Дом с башенкой', 'Здания', 'city-kit-suburban', 'building-type-n', { targetHeight: 8 }), - m('city-suburban-building-type-o', 'Семейный дом', 'Здания', 'city-kit-suburban', 'building-type-o', { targetHeight: 8 }), - m('city-suburban-building-type-p', 'Дом-шале', 'Здания', 'city-kit-suburban', 'building-type-p', { targetHeight: 8 }), - m('city-suburban-building-type-q', 'Дом с эркером', 'Здания', 'city-kit-suburban', 'building-type-q', { targetHeight: 8 }), - m('city-suburban-building-type-r', 'Городской дом', 'Здания', 'city-kit-suburban', 'building-type-r', { targetHeight: 8 }), - m('city-suburban-building-type-s', 'Дом-куб', 'Здания', 'city-kit-suburban', 'building-type-s', { targetHeight: 8 }), - m('city-suburban-building-type-t', 'Просторный дом', 'Здания', 'city-kit-suburban', 'building-type-t', { targetHeight: 8 }), - m('city-suburban-building-type-u', 'Загородная вилла', 'Здания', 'city-kit-suburban', 'building-type-u', { targetHeight: 8 }), - - // === Дороги === (50) - m('city-roads-bridge-pillar-wide', 'Мост Широкая колонна', 'Дороги', 'city-kit-roads', 'bridge-pillar-wide'), - m('city-roads-bridge-pillar', 'Мост Колонна', 'Дороги', 'city-kit-roads', 'bridge-pillar'), - m('city-roads-construction-barrier', 'Стройка барьер', 'Дороги', 'city-kit-roads', 'construction-barrier'), - m('city-roads-construction-cone', 'Стройка Конус', 'Дороги', 'city-kit-roads', 'construction-cone'), - m('city-roads-construction-light', 'Стройка свет', 'Дороги', 'city-kit-roads', 'construction-light'), - m('city-roads-light-curved-cross', 'Свет поворот d крест', 'Дороги', 'city-kit-roads', 'light-curved-cross'), - m('city-roads-light-curved-double', 'Свет поворот d двойной', 'Дороги', 'city-kit-roads', 'light-curved-double'), - m('city-roads-light-curved', 'Свет поворот d', 'Дороги', 'city-kit-roads', 'light-curved'), - m('city-roads-light-square-cross', 'Свет квадратный крест', 'Дороги', 'city-kit-roads', 'light-square-cross'), - m('city-roads-light-square-double', 'Свет квадратный двойной', 'Дороги', 'city-kit-roads', 'light-square-double'), - m('city-roads-light-square', 'Свет квадратный', 'Дороги', 'city-kit-roads', 'light-square'), - m('city-roads-road-bend-barrier', 'Дорога b конец барьер', 'Дороги', 'city-kit-roads', 'road-bend-barrier'), - m('city-roads-road-bend-sidewalk', 'Дорога b конец Тротуар', 'Дороги', 'city-kit-roads', 'road-bend-sidewalk'), - m('city-roads-road-bend-square-barrier', 'Дорога b конец квадратный барьер', 'Дороги', 'city-kit-roads', 'road-bend-square-barrier'), - m('city-roads-road-bend-square', 'Дорога b конец квадратный', 'Дороги', 'city-kit-roads', 'road-bend-square'), - m('city-roads-road-bend', 'Дорога b конец', 'Дороги', 'city-kit-roads', 'road-bend'), - m('city-roads-road-bridge', 'Дорога Мост', 'Дороги', 'city-kit-roads', 'road-bridge'), - m('city-roads-road-crossing', 'Дорога Переход', 'Дороги', 'city-kit-roads', 'road-crossing'), - m('city-roads-road-crossroad-barrier', 'Дорога Перекрёсток барьер', 'Дороги', 'city-kit-roads', 'road-crossroad-barrier'), - m('city-roads-road-crossroad-line', 'Дорога Перекрёсток линия', 'Дороги', 'city-kit-roads', 'road-crossroad-line'), - m('city-roads-road-crossroad-path', 'Дорога Перекрёсток Тропа', 'Дороги', 'city-kit-roads', 'road-crossroad-path'), - m('city-roads-road-crossroad', 'Дорога Перекрёсток', 'Дороги', 'city-kit-roads', 'road-crossroad'), - m('city-roads-road-curve-barrier', 'Дорога Поворот барьер', 'Дороги', 'city-kit-roads', 'road-curve-barrier'), - m('city-roads-road-curve-intersection-barrier', 'Дорога Поворот Перекрёсток барьер', 'Дороги', 'city-kit-roads', 'road-curve-intersection-barrier'), - m('city-roads-road-curve-intersection', 'Дорога Поворот Перекрёсток', 'Дороги', 'city-kit-roads', 'road-curve-intersection'), - m('city-roads-road-curve-pavement', 'Дорога Поворот pavement', 'Дороги', 'city-kit-roads', 'road-curve-pavement'), - m('city-roads-road-curve', 'Дорога Поворот', 'Дороги', 'city-kit-roads', 'road-curve'), - m('city-roads-road-driveway-double-barrier', 'Дорога въезд двойной барьер', 'Дороги', 'city-kit-roads', 'road-driveway-double-barrier'), - m('city-roads-road-driveway-double', 'Дорога въезд двойной', 'Дороги', 'city-kit-roads', 'road-driveway-double'), - m('city-roads-road-driveway-single-barrier', 'Дорога въезд одинарный барьер', 'Дороги', 'city-kit-roads', 'road-driveway-single-barrier'), - m('city-roads-road-driveway-single', 'Дорога въезд одинарный', 'Дороги', 'city-kit-roads', 'road-driveway-single'), - m('city-roads-road-end-barrier', 'Дорога конец барьер', 'Дороги', 'city-kit-roads', 'road-end-barrier'), - m('city-roads-road-end-round-barrier', 'Дорога конец круглый барьер', 'Дороги', 'city-kit-roads', 'road-end-round-barrier'), - m('city-roads-road-end-round', 'Дорога конец круглый', 'Дороги', 'city-kit-roads', 'road-end-round'), - m('city-roads-road-end', 'Дорога конец', 'Дороги', 'city-kit-roads', 'road-end'), - m('city-roads-road-intersection-barrier', 'Дорога Перекрёсток барьер', 'Дороги', 'city-kit-roads', 'road-intersection-barrier'), - m('city-roads-road-intersection-line', 'Дорога Перекрёсток линия', 'Дороги', 'city-kit-roads', 'road-intersection-line'), - m('city-roads-road-intersection-path', 'Дорога Перекрёсток Тропа', 'Дороги', 'city-kit-roads', 'road-intersection-path'), - m('city-roads-road-intersection', 'Дорога Перекрёсток', 'Дороги', 'city-kit-roads', 'road-intersection'), - m('city-roads-road-roundabout-barrier', 'Дорога круговое движение барьер', 'Дороги', 'city-kit-roads', 'road-roundabout-barrier'), - m('city-roads-road-roundabout', 'Дорога круговое движение', 'Дороги', 'city-kit-roads', 'road-roundabout'), - m('city-roads-road-side-barrier', 'Дорога бок барьер', 'Дороги', 'city-kit-roads', 'road-side-barrier'), - m('city-roads-road-side-entry-barrier', 'Дорога бок вход барьер', 'Дороги', 'city-kit-roads', 'road-side-entry-barrier'), - m('city-roads-road-side-entry', 'Дорога бок вход', 'Дороги', 'city-kit-roads', 'road-side-entry'), - m('city-roads-road-side-exit-barrier', 'Дорога бок выход барьер', 'Дороги', 'city-kit-roads', 'road-side-exit-barrier'), - m('city-roads-road-side-exit', 'Дорога бок выход', 'Дороги', 'city-kit-roads', 'road-side-exit'), - m('city-roads-road-side', 'Дорога бок', 'Дороги', 'city-kit-roads', 'road-side'), - m('city-roads-road-slant-barrier', 'Дорога slant барьер', 'Дороги', 'city-kit-roads', 'road-slant-barrier'), - m('city-roads-road-slant-curve-barrier', 'Дорога slant Поворот барьер', 'Дороги', 'city-kit-roads', 'road-slant-curve-barrier'), - m('city-roads-road-slant-curve', 'Дорога slant Поворот', 'Дороги', 'city-kit-roads', 'road-slant-curve'), - - // === Замки === (50) - m('tower-defense-detail-crystal-large', 'Деталь Кристалл большой', 'Замки', 'tower-defense-kit', 'detail-crystal-large', { targetHeight: 0.8 }), - m('tower-defense-detail-crystal', 'Деталь Кристалл', 'Замки', 'tower-defense-kit', 'detail-crystal', { targetHeight: 0.8 }), - m('tower-defense-detail-dirt-large', 'Земля (декор) большой', 'Замки', 'tower-defense-kit', 'detail-dirt-large', { targetHeight: 1 }), - m('tower-defense-detail-dirt', 'Земля (декор)', 'Замки', 'tower-defense-kit', 'detail-dirt', { targetHeight: 1 }), - m('tower-defense-detail-rocks-large', 'Деталь Камни большой', 'Замки', 'tower-defense-kit', 'detail-rocks-large', { targetHeight: 1 }), - m('tower-defense-detail-rocks', 'Деталь Камни', 'Замки', 'tower-defense-kit', 'detail-rocks', { targetHeight: 1 }), - m('tower-defense-detail-tree-large', 'Деталь Большое дерево', 'Замки', 'tower-defense-kit', 'detail-tree-large', { targetHeight: 3 }), - m('tower-defense-detail-tree', 'Деталь Дерево', 'Замки', 'tower-defense-kit', 'detail-tree', { targetHeight: 3 }), - m('tower-defense-enemy-ufo-a-weapon', 'Враг НЛО a Оружие', 'Замки', 'tower-defense-kit', 'enemy-ufo-a-weapon', { targetHeight: 1.7 }), - m('tower-defense-enemy-ufo-a', 'Враг НЛО a', 'Замки', 'tower-defense-kit', 'enemy-ufo-a', { targetHeight: 1.7 }), - m('tower-defense-enemy-ufo-b-weapon', 'Враг НЛО b Оружие', 'Замки', 'tower-defense-kit', 'enemy-ufo-b-weapon', { targetHeight: 1.7 }), - m('tower-defense-enemy-ufo-b', 'Враг НЛО b', 'Замки', 'tower-defense-kit', 'enemy-ufo-b', { targetHeight: 1.7 }), - m('tower-defense-enemy-ufo-beam-burst', 'Враг НЛО beam burst', 'Замки', 'tower-defense-kit', 'enemy-ufo-beam-burst', { targetHeight: 1.7 }), - m('tower-defense-enemy-ufo-beam', 'Враг НЛО beam', 'Замки', 'tower-defense-kit', 'enemy-ufo-beam', { targetHeight: 1.7 }), - m('tower-defense-enemy-ufo-c-weapon', 'Враг НЛО c Оружие', 'Замки', 'tower-defense-kit', 'enemy-ufo-c-weapon', { targetHeight: 1.7 }), - m('tower-defense-enemy-ufo-c', 'Враг НЛО c', 'Замки', 'tower-defense-kit', 'enemy-ufo-c', { targetHeight: 1.7 }), - m('tower-defense-enemy-ufo-d-weapon', 'Враг НЛО d Оружие', 'Замки', 'tower-defense-kit', 'enemy-ufo-d-weapon', { targetHeight: 1.7 }), - m('tower-defense-enemy-ufo-d', 'Враг НЛО d', 'Замки', 'tower-defense-kit', 'enemy-ufo-d', { targetHeight: 1.7 }), - m('tower-defense-selection-a', 'Выделение А', 'Замки', 'tower-defense-kit', 'selection-a', { targetHeight: 0.2 }), - m('tower-defense-selection-b', 'Выделение Б', 'Замки', 'tower-defense-kit', 'selection-b', { targetHeight: 0.2 }), - m('tower-defense-snow-detail-crystal-large', 'Снег Деталь Кристалл большой', 'Замки', 'tower-defense-kit', 'snow-detail-crystal-large', { targetHeight: 0.8 }), - m('tower-defense-snow-detail-crystal', 'Снег Деталь Кристалл', 'Замки', 'tower-defense-kit', 'snow-detail-crystal', { targetHeight: 0.8 }), - m('tower-defense-snow-detail-dirt-large', 'Снег Земля (декор) большой', 'Замки', 'tower-defense-kit', 'snow-detail-dirt-large', { targetHeight: 1 }), - m('tower-defense-snow-detail-dirt', 'Снег Земля (декор)', 'Замки', 'tower-defense-kit', 'snow-detail-dirt', { targetHeight: 1 }), - m('tower-defense-snow-detail-rocks-large', 'Снег Деталь Камни большой', 'Замки', 'tower-defense-kit', 'snow-detail-rocks-large', { targetHeight: 1 }), - m('tower-defense-snow-detail-rocks', 'Снег Деталь Камни', 'Замки', 'tower-defense-kit', 'snow-detail-rocks', { targetHeight: 1 }), - m('tower-defense-snow-detail-tree-large', 'Снег Деталь Большое дерево', 'Замки', 'tower-defense-kit', 'snow-detail-tree-large', { targetHeight: 3 }), - m('tower-defense-snow-detail-tree', 'Снег Деталь Дерево', 'Замки', 'tower-defense-kit', 'snow-detail-tree', { targetHeight: 3 }), - m('tower-defense-snow-tile-bump', 'Снег Плитка кочка', 'Замки', 'tower-defense-kit', 'snow-tile-bump', { targetHeight: 0.4 }), - m('tower-defense-snow-tile-corner-inner', 'Снег Плитка угол внутр.', 'Замки', 'tower-defense-kit', 'snow-tile-corner-inner', { targetHeight: 0.4 }), - m('tower-defense-snow-tile-corner-large', 'Снег Плитка угол большой', 'Замки', 'tower-defense-kit', 'snow-tile-corner-large', { targetHeight: 0.4 }), - m('tower-defense-snow-tile-corner-outer', 'Снег Плитка угол внеш.', 'Замки', 'tower-defense-kit', 'snow-tile-corner-outer', { targetHeight: 0.4 }), - m('tower-defense-snow-tile-corner-round', 'Снег Плитка угол круглый', 'Замки', 'tower-defense-kit', 'snow-tile-corner-round', { targetHeight: 0.4 }), - m('tower-defense-snow-tile-corner-square', 'Снег Плитка угол квадратный', 'Замки', 'tower-defense-kit', 'snow-tile-corner-square', { targetHeight: 0.4 }), - m('tower-defense-snow-tile-crossing', 'Снег Плитка Переход', 'Замки', 'tower-defense-kit', 'snow-tile-crossing', { targetHeight: 0.4 }), - m('tower-defense-snow-tile-crystal', 'Снег Плитка Кристалл', 'Замки', 'tower-defense-kit', 'snow-tile-crystal', { targetHeight: 0.8 }), - m('tower-defense-snow-tile-dirt', 'Снег Плитка земли', 'Замки', 'tower-defense-kit', 'snow-tile-dirt', { targetHeight: 0.4 }), - m('tower-defense-snow-tile-end-round', 'Снег Плитка конец круглый', 'Замки', 'tower-defense-kit', 'snow-tile-end-round', { targetHeight: 0.4 }), - m('tower-defense-snow-tile-end', 'Снег Плитка конец', 'Замки', 'tower-defense-kit', 'snow-tile-end', { targetHeight: 0.4 }), - m('tower-defense-snow-tile-hill', 'Снег Плитка холм', 'Замки', 'tower-defense-kit', 'snow-tile-hill', { targetHeight: 0.4 }), - m('tower-defense-snow-tile-river-bridge', 'Снег Плитка river Мост', 'Замки', 'tower-defense-kit', 'snow-tile-river-bridge', { targetHeight: 0.4 }), - m('tower-defense-snow-tile-river-corner', 'Снег Плитка river угол', 'Замки', 'tower-defense-kit', 'snow-tile-river-corner', { targetHeight: 0.4 }), - m('tower-defense-snow-tile-river-slope-large', 'Снег Плитка river наклон большой', 'Замки', 'tower-defense-kit', 'snow-tile-river-slope-large', { targetHeight: 0.4 }), - m('tower-defense-snow-tile-river-slope', 'Снег Плитка river наклон', 'Замки', 'tower-defense-kit', 'snow-tile-river-slope', { targetHeight: 0.4 }), - m('tower-defense-snow-tile-river-straight', 'Снег Плитка river Прямой участок', 'Замки', 'tower-defense-kit', 'snow-tile-river-straight', { targetHeight: 0.4 }), - m('tower-defense-snow-tile-river-transition', 'Снег Плитка river transition', 'Замки', 'tower-defense-kit', 'snow-tile-river-transition', { targetHeight: 0.4 }), - m('tower-defense-snow-tile-river-waterfall', 'Снег Плитка river waterfall', 'Замки', 'tower-defense-kit', 'snow-tile-river-waterfall', { targetHeight: 0.4 }), - m('tower-defense-snow-tile-rock', 'Снег Плитка Камень', 'Замки', 'tower-defense-kit', 'snow-tile-rock', { targetHeight: 0.4 }), - m('tower-defense-snow-tile-slope', 'Снег Плитка наклон', 'Замки', 'tower-defense-kit', 'snow-tile-slope', { targetHeight: 0.4 }), - m('tower-defense-snow-tile-spawn-end-round', 'Снег Плитка spawn конец круглый', 'Замки', 'tower-defense-kit', 'snow-tile-spawn-end-round', { targetHeight: 0.4 }), - - // === Мебель === (50) - m('furniture-bathroomcabinet', 'Шкафчик ванной', 'Мебель', 'furniture-kit', 'bathroomCabinet', { targetHeight: 2.2 }), - m('furniture-bathroomcabinetdrawer', 'Тумба ванной с ящиком', 'Мебель', 'furniture-kit', 'bathroomCabinetDrawer', { targetHeight: 2.2 }), - m('furniture-bathroommirror', 'Ванная Зеркало', 'Мебель', 'furniture-kit', 'bathroomMirror', { targetHeight: 1 }), - m('furniture-bathroomsink', 'Ванная Раковина', 'Мебель', 'furniture-kit', 'bathroomSink', { targetHeight: 1.2 }), - m('furniture-bathroomsinksquare', 'Ванная Раковина квадратный', 'Мебель', 'furniture-kit', 'bathroomSinkSquare', { targetHeight: 1.2 }), - m('furniture-bathtub', 'Ванна', 'Мебель', 'furniture-kit', 'bathtub', { targetHeight: 1.2 }), - m('furniture-bear', 'Медведь', 'Мебель', 'furniture-kit', 'bear', { targetHeight: 1.2 }), - m('furniture-bedbunk', 'Кровать Bunk', 'Мебель', 'furniture-kit', 'bedBunk', { targetHeight: 1 }), - m('furniture-beddouble', 'Кровать двуспальная', 'Мебель', 'furniture-kit', 'bedDouble', { targetHeight: 1 }), - m('furniture-bedsingle', 'Кровать односпальная', 'Мебель', 'furniture-kit', 'bedSingle', { targetHeight: 1 }), - m('furniture-bench', 'Скамейка', 'Мебель', 'furniture-kit', 'bench', { targetHeight: 1.2 }), - m('furniture-benchcushion', 'Скамейка подушка', 'Мебель', 'furniture-kit', 'benchCushion', { targetHeight: 1.2 }), - m('furniture-benchcushionlow', 'Скамейка подушка низкий', 'Мебель', 'furniture-kit', 'benchCushionLow', { targetHeight: 1.2 }), - m('furniture-bookcaseclosed', 'Книжный шкаф закрытый', 'Мебель', 'furniture-kit', 'bookcaseClosed', { targetHeight: 2.2 }), - m('furniture-bookcasecloseddoors', 'Книжный шкаф закрытый Doors', 'Мебель', 'furniture-kit', 'bookcaseClosedDoors', { targetHeight: 2.2 }), - m('furniture-bookcaseclosedwide', 'Книжный шкаф закрытый широкий', 'Мебель', 'furniture-kit', 'bookcaseClosedWide', { targetHeight: 2.2 }), - m('furniture-bookcaseopen', 'Книжный шкаф открытый', 'Мебель', 'furniture-kit', 'bookcaseOpen', { targetHeight: 2.2 }), - m('furniture-bookcaseopenlow', 'Книжный шкаф открытый низкий', 'Мебель', 'furniture-kit', 'bookcaseOpenLow', { targetHeight: 2.2 }), - m('furniture-books', 'Книги', 'Мебель', 'furniture-kit', 'books', { targetHeight: 1.2 }), - m('furniture-cabinetbed', 'Шкафчик Кровать', 'Мебель', 'furniture-kit', 'cabinetBed', { targetHeight: 2.2 }), - m('furniture-cabinetbeddrawer', 'Шкафчик Кровать ящик', 'Мебель', 'furniture-kit', 'cabinetBedDrawer', { targetHeight: 2.2 }), - m('furniture-cabinetbeddrawertable', 'Шкафчик Кровать ящик Стол', 'Мебель', 'furniture-kit', 'cabinetBedDrawerTable', { targetHeight: 2.2 }), - m('furniture-cabinettelevision', 'Шкафчик Телевизор', 'Мебель', 'furniture-kit', 'cabinetTelevision', { targetHeight: 0.8 }), - m('furniture-cabinettelevisiondoors', 'Шкафчик Телевизор Doors', 'Мебель', 'furniture-kit', 'cabinetTelevisionDoors', { targetHeight: 0.8 }), - m('furniture-cardboardboxclosed', 'Картон Коробка закрытый', 'Мебель', 'furniture-kit', 'cardboardBoxClosed', { targetHeight: 1.2 }), - m('furniture-cardboardboxopen', 'Картон Коробка открытый', 'Мебель', 'furniture-kit', 'cardboardBoxOpen', { targetHeight: 1.2 }), - m('furniture-ceilingfan', 'Потолок вентилятор', 'Мебель', 'furniture-kit', 'ceilingFan', { targetHeight: 1.2 }), - m('furniture-chair', 'Стул', 'Мебель', 'furniture-kit', 'chair', { targetHeight: 1.2 }), - m('furniture-chaircushion', 'Стул подушка', 'Мебель', 'furniture-kit', 'chairCushion', { targetHeight: 1.2 }), - m('furniture-chairdesk', 'Стул Письменный стол', 'Мебель', 'furniture-kit', 'chairDesk', { targetHeight: 1.2 }), - m('furniture-chairmoderncushion', 'Стул современный подушка', 'Мебель', 'furniture-kit', 'chairModernCushion', { targetHeight: 1.2 }), - m('furniture-chairmodernframecushion', 'Стул современный Рамка подушка', 'Мебель', 'furniture-kit', 'chairModernFrameCushion', { targetHeight: 1.2 }), - m('furniture-chairrounded', 'Стул Rounded', 'Мебель', 'furniture-kit', 'chairRounded', { targetHeight: 1.2 }), - m('furniture-coatrack', 'Пальто стойка', 'Мебель', 'furniture-kit', 'coatRack', { targetHeight: 1.2 }), - m('furniture-coatrackstanding', 'Пальто стойка Standing', 'Мебель', 'furniture-kit', 'coatRackStanding', { targetHeight: 1.2 }), - m('furniture-computerkeyboard', 'Компьютер Keyboard', 'Мебель', 'furniture-kit', 'computerKeyboard', { targetHeight: 0.8 }), - m('furniture-computermouse', 'Компьютер Mouse', 'Мебель', 'furniture-kit', 'computerMouse', { targetHeight: 0.8 }), - m('furniture-computerscreen', 'Компьютер Screen', 'Мебель', 'furniture-kit', 'computerScreen', { targetHeight: 0.8 }), - m('furniture-desk', 'Письменный стол', 'Мебель', 'furniture-kit', 'desk', { targetHeight: 1.2 }), - m('furniture-deskcorner', 'Письменный стол угол', 'Мебель', 'furniture-kit', 'deskCorner', { targetHeight: 1.2 }), - m('furniture-doorway', 'Проём', 'Мебель', 'furniture-kit', 'doorway', { targetHeight: 1.2 }), - m('furniture-doorwayfront', 'Проём перед', 'Мебель', 'furniture-kit', 'doorwayFront', { targetHeight: 1.2 }), - m('furniture-doorwayopen', 'Проём открытый', 'Мебель', 'furniture-kit', 'doorwayOpen', { targetHeight: 1.2 }), - m('furniture-dryer', 'Сушилка', 'Мебель', 'furniture-kit', 'dryer', { targetHeight: 1.2 }), - m('furniture-floorcorner', 'Пол угол', 'Мебель', 'furniture-kit', 'floorCorner', { targetHeight: 1.2 }), - m('furniture-floorcornerround', 'Пол угол круглый', 'Мебель', 'furniture-kit', 'floorCornerRound', { targetHeight: 1.2 }), - m('furniture-floorfull', 'Пол полный', 'Мебель', 'furniture-kit', 'floorFull', { targetHeight: 1.2 }), - m('furniture-floorhalf', 'Пол половина', 'Мебель', 'furniture-kit', 'floorHalf', { targetHeight: 1.2 }), - m('furniture-hoodlarge', 'Hood большой', 'Мебель', 'furniture-kit', 'hoodLarge', { targetHeight: 1.2 }), - m('furniture-hoodmodern', 'Hood современный', 'Мебель', 'furniture-kit', 'hoodModern', { targetHeight: 1.2 }), - - // === Еда === (50) - m('food-advocado-half', 'Авокадо (половинка)', 'Еда', 'food-kit', 'advocado-half', { targetHeight: 0.5 }), - m('food-apple-half', 'Яблоко (половинка)', 'Еда', 'food-kit', 'apple-half', { targetHeight: 0.4 }), - m('food-apple', 'Яблоко', 'Еда', 'food-kit', 'apple', { targetHeight: 0.4 }), - m('food-avocado', 'Авокадо', 'Еда', 'food-kit', 'avocado', { targetHeight: 0.5 }), - m('food-bacon-raw', 'Сырой бекон', 'Еда', 'food-kit', 'bacon-raw', { targetHeight: 0.5 }), - m('food-bacon', 'Бекон', 'Еда', 'food-kit', 'bacon', { targetHeight: 0.5 }), - m('food-bag-flat', 'Пакет плоский', 'Еда', 'food-kit', 'bag-flat', { targetHeight: 0.5 }), - m('food-bag', 'Пакет', 'Еда', 'food-kit', 'bag', { targetHeight: 0.5 }), - m('food-banana', 'Банан', 'Еда', 'food-kit', 'banana', { targetHeight: 0.4 }), - m('food-barrel', 'Бочка', 'Еда', 'food-kit', 'barrel', { targetHeight: 0.5 }), - m('food-beet', 'Свёкла', 'Еда', 'food-kit', 'beet', { targetHeight: 0.4 }), - m('food-bottle-ketchup', 'Кетчуп', 'Еда', 'food-kit', 'bottle-ketchup', { targetHeight: 0.7 }), - m('food-bottle-musterd', 'Горчица', 'Еда', 'food-kit', 'bottle-musterd', { targetHeight: 0.7 }), - m('food-bottle-oil', 'Масло', 'Еда', 'food-kit', 'bottle-oil', { targetHeight: 0.7 }), - m('food-bowl-broth', 'Тарелка с бульоном', 'Еда', 'food-kit', 'bowl-broth', { targetHeight: 0.3 }), - m('food-bowl-cereal', 'Тарелка с хлопьями', 'Еда', 'food-kit', 'bowl-cereal', { targetHeight: 0.3 }), - m('food-bowl-soup', 'Миска Суп', 'Еда', 'food-kit', 'bowl-soup', { targetHeight: 0.3 }), - m('food-bowl', 'Миска', 'Еда', 'food-kit', 'bowl', { targetHeight: 0.3 }), - m('food-bread', 'Хлеб', 'Еда', 'food-kit', 'bread', { targetHeight: 0.5 }), - m('food-broccoli', 'Брокколи', 'Еда', 'food-kit', 'broccoli', { targetHeight: 0.5 }), - m('food-burger-cheese-double', 'Бургер Сыр двойной', 'Еда', 'food-kit', 'burger-cheese-double', { targetHeight: 0.5 }), - m('food-burger-cheese', 'Бургер Сыр', 'Еда', 'food-kit', 'burger-cheese', { targetHeight: 0.5 }), - m('food-burger-double', 'Бургер двойной', 'Еда', 'food-kit', 'burger-double', { targetHeight: 0.5 }), - m('food-burger', 'Бургер', 'Еда', 'food-kit', 'burger', { targetHeight: 0.5 }), - m('food-cabbage', 'Капуста', 'Еда', 'food-kit', 'cabbage', { targetHeight: 0.5 }), - m('food-cake-birthday', 'Торт день рождения', 'Еда', 'food-kit', 'cake-birthday', { targetHeight: 0.7 }), - m('food-cake-slicer', 'Торт кусок', 'Еда', 'food-kit', 'cake-slicer', { targetHeight: 0.7 }), - m('food-cake', 'Торт', 'Еда', 'food-kit', 'cake', { targetHeight: 0.7 }), - m('food-can-open', 'Банка открытый', 'Еда', 'food-kit', 'can-open', { targetHeight: 0.5 }), - m('food-can-small', 'Банка маленький', 'Еда', 'food-kit', 'can-small', { targetHeight: 0.5 }), - m('food-can', 'Банка', 'Еда', 'food-kit', 'can', { targetHeight: 0.5 }), - m('food-candy-bar-wrapper', 'Конфета батончик обёртка', 'Еда', 'food-kit', 'candy-bar-wrapper', { targetHeight: 0.5 }), - m('food-candy-bar', 'Конфета батончик', 'Еда', 'food-kit', 'candy-bar', { targetHeight: 0.5 }), - m('food-carrot', 'Морковь', 'Еда', 'food-kit', 'carrot', { targetHeight: 0.4 }), - m('food-carton-small', 'Пакет маленький', 'Еда', 'food-kit', 'carton-small', { targetHeight: 0.5 }), - m('food-carton', 'Пакет', 'Еда', 'food-kit', 'carton', { targetHeight: 0.5 }), - m('food-cauliflower', 'Цветная капуста', 'Еда', 'food-kit', 'cauliflower', { targetHeight: 0.5 }), - m('food-celery-stick', 'Сельдерей Палка', 'Еда', 'food-kit', 'celery-stick', { targetHeight: 0.5 }), - m('food-cheese-cut', 'Сыр cut', 'Еда', 'food-kit', 'cheese-cut', { targetHeight: 0.5 }), - m('food-cheese-slicer', 'Сыр кусок', 'Еда', 'food-kit', 'cheese-slicer', { targetHeight: 0.5 }), - m('food-cheese', 'Сыр', 'Еда', 'food-kit', 'cheese', { targetHeight: 0.5 }), - m('food-cherries', 'Черешня', 'Еда', 'food-kit', 'cherries', { targetHeight: 0.5 }), - m('food-chinese', 'Chinese', 'Еда', 'food-kit', 'chinese', { targetHeight: 0.5 }), - m('food-chocolate-wrapper', 'Шоколад обёртка', 'Еда', 'food-kit', 'chocolate-wrapper', { targetHeight: 0.5 }), - m('food-chocolate', 'Шоколад', 'Еда', 'food-kit', 'chocolate', { targetHeight: 0.5 }), - m('food-chopstic-decorative', 'Chopstic декоративный', 'Еда', 'food-kit', 'chopstic-decorative', { targetHeight: 0.5 }), - m('food-chopstick', 'Палочка', 'Еда', 'food-kit', 'chopstick', { targetHeight: 0.5 }), - m('food-cocktail', 'Коктейль', 'Еда', 'food-kit', 'cocktail', { targetHeight: 0.5 }), - m('food-coconut-half', 'Половинка кокоса', 'Еда', 'food-kit', 'coconut-half', { targetHeight: 0.5 }), - m('food-coconut', 'Кокос', 'Еда', 'food-kit', 'coconut', { targetHeight: 0.5 }), - - // === Оружие === (40) - m('blaster-blaster-a', 'Бластер a', 'Оружие', 'blaster-kit', 'blaster-a', { targetHeight: 1.2 }), - m('blaster-blaster-b', 'Бластер b', 'Оружие', 'blaster-kit', 'blaster-b', { targetHeight: 1.2 }), - m('blaster-blaster-c', 'Бластер c', 'Оружие', 'blaster-kit', 'blaster-c', { targetHeight: 1.2 }), - m('blaster-blaster-d', 'Бластер d', 'Оружие', 'blaster-kit', 'blaster-d', { targetHeight: 1.2 }), - m('blaster-blaster-e', 'Бластер e', 'Оружие', 'blaster-kit', 'blaster-e', { targetHeight: 1.2 }), - m('blaster-blaster-f', 'Бластер f', 'Оружие', 'blaster-kit', 'blaster-f', { targetHeight: 1.2 }), - m('blaster-blaster-g', 'Бластер g', 'Оружие', 'blaster-kit', 'blaster-g', { targetHeight: 1.2 }), - m('blaster-blaster-h', 'Бластер h', 'Оружие', 'blaster-kit', 'blaster-h', { targetHeight: 1.2 }), - m('blaster-blaster-i', 'Бластер i', 'Оружие', 'blaster-kit', 'blaster-i', { targetHeight: 1.2 }), - m('blaster-blaster-j', 'Бластер j', 'Оружие', 'blaster-kit', 'blaster-j', { targetHeight: 1.2 }), - m('blaster-blaster-k', 'Бластер k', 'Оружие', 'blaster-kit', 'blaster-k', { targetHeight: 1.2 }), - m('blaster-blaster-l', 'Бластер l', 'Оружие', 'blaster-kit', 'blaster-l', { targetHeight: 1.2 }), - m('blaster-blaster-m', 'Бластер m', 'Оружие', 'blaster-kit', 'blaster-m', { targetHeight: 1.2 }), - m('blaster-blaster-n', 'Бластер n', 'Оружие', 'blaster-kit', 'blaster-n', { targetHeight: 1.2 }), - m('blaster-blaster-o', 'Бластер o', 'Оружие', 'blaster-kit', 'blaster-o', { targetHeight: 1.2 }), - m('blaster-blaster-p', 'Бластер p', 'Оружие', 'blaster-kit', 'blaster-p', { targetHeight: 1.2 }), - m('blaster-blaster-q', 'Бластер q', 'Оружие', 'blaster-kit', 'blaster-q', { targetHeight: 1.2 }), - m('blaster-blaster-r', 'Бластер r', 'Оружие', 'blaster-kit', 'blaster-r', { targetHeight: 1.2 }), - m('blaster-bullet-foam-thick', 'Толстая пенопл. пуля', 'Оружие', 'blaster-kit', 'bullet-foam-thick', { targetHeight: 0.4 }), - m('blaster-bullet-foam-tip-thick', 'Толстая пенопл. пуля с наконеч.', 'Оружие', 'blaster-kit', 'bullet-foam-tip-thick', { targetHeight: 0.4 }), - m('blaster-bullet-foam-tip', 'Пенопл. пуля с наконеч.', 'Оружие', 'blaster-kit', 'bullet-foam-tip', { targetHeight: 0.4 }), - m('blaster-bullet-foam', 'Пенопл. пуля', 'Оружие', 'blaster-kit', 'bullet-foam', { targetHeight: 0.4 }), - m('blaster-clip-large', 'Скрепка большой', 'Оружие', 'blaster-kit', 'clip-large', { targetHeight: 1 }), - m('blaster-clip-small', 'Скрепка маленький', 'Оружие', 'blaster-kit', 'clip-small', { targetHeight: 1 }), - m('blaster-crate-medium', 'Ящик средний', 'Оружие', 'blaster-kit', 'crate-medium', { targetHeight: 1 }), - m('blaster-crate-small', 'Ящик маленький', 'Оружие', 'blaster-kit', 'crate-small', { targetHeight: 1 }), - m('blaster-crate-wide', 'Ящик широкий', 'Оружие', 'blaster-kit', 'crate-wide', { targetHeight: 1 }), - m('blaster-grenade-a', 'Граната a', 'Оружие', 'blaster-kit', 'grenade-a', { targetHeight: 0.6 }), - m('blaster-grenade-b', 'Граната b', 'Оружие', 'blaster-kit', 'grenade-b', { targetHeight: 0.6 }), - m('blaster-scope-large-a', 'Scope большой a', 'Оружие', 'blaster-kit', 'scope-large-a', { targetHeight: 1 }), - m('blaster-scope-large-b', 'Scope большой b', 'Оружие', 'blaster-kit', 'scope-large-b', { targetHeight: 1 }), - m('blaster-scope-small', 'Scope маленький', 'Оружие', 'blaster-kit', 'scope-small', { targetHeight: 1 }), - m('blaster-silencer-larger', 'Silencer larger', 'Оружие', 'blaster-kit', 'silencer-larger', { targetHeight: 1 }), - m('blaster-silencer-small', 'Silencer маленький', 'Оружие', 'blaster-kit', 'silencer-small', { targetHeight: 1 }), - m('blaster-smoke', 'Дым', 'Оружие', 'blaster-kit', 'smoke', { targetHeight: 1 }), - m('blaster-target-detail', 'Мишень Деталь', 'Оружие', 'blaster-kit', 'target-detail', { targetHeight: 1 }), - m('blaster-target-fragment-large', 'Мишень фрагмент большой', 'Оружие', 'blaster-kit', 'target-fragment-large', { targetHeight: 1 }), - m('blaster-target-fragment-small', 'Мишень фрагмент маленький', 'Оружие', 'blaster-kit', 'target-fragment-small', { targetHeight: 1 }), - m('blaster-target-large', 'Мишень большой', 'Оружие', 'blaster-kit', 'target-large', { targetHeight: 1 }), - m('blaster-target-small', 'Мишень маленький', 'Оружие', 'blaster-kit', 'target-small', { targetHeight: 1 }), - - // === Праздники === (50) - m('holiday-bench-short', 'Скамейка короткий', 'Праздники', 'holiday-kit', 'bench-short', { targetHeight: 1.5 }), - m('holiday-bench', 'Скамейка', 'Праздники', 'holiday-kit', 'bench', { targetHeight: 1.5 }), - m('holiday-cabin-corner-bottom', 'Хижина угол низ', 'Праздники', 'holiday-kit', 'cabin-corner-bottom', { targetHeight: 5 }), - m('holiday-cabin-corner-logs', 'Хижина угол брёвна', 'Праздники', 'holiday-kit', 'cabin-corner-logs', { targetHeight: 5 }), - m('holiday-cabin-corner', 'Хижина угол', 'Праздники', 'holiday-kit', 'cabin-corner', { targetHeight: 5 }), - m('holiday-cabin-door-rotate', 'Хижина Дверь', 'Праздники', 'holiday-kit', 'cabin-door-rotate', { targetHeight: 5 }), - m('holiday-cabin-doorway-center', 'Хижина проём центр', 'Праздники', 'holiday-kit', 'cabin-doorway-center', { targetHeight: 5 }), - m('holiday-cabin-doorway-left', 'Хижина проём лев.', 'Праздники', 'holiday-kit', 'cabin-doorway-left', { targetHeight: 5 }), - m('holiday-cabin-doorway-right', 'Хижина проём прав.', 'Праздники', 'holiday-kit', 'cabin-doorway-right', { targetHeight: 5 }), - m('holiday-cabin-doorway', 'Хижина проём', 'Праздники', 'holiday-kit', 'cabin-doorway', { targetHeight: 5 }), - m('holiday-cabin-fence', 'Хижина Забор', 'Праздники', 'holiday-kit', 'cabin-fence', { targetHeight: 5 }), - m('holiday-cabin-overhang-door-rotate', 'Хижина с навесом Дверь', 'Праздники', 'holiday-kit', 'cabin-overhang-door-rotate', { targetHeight: 5 }), - m('holiday-cabin-overhang-doorway', 'Хижина с навесом проём', 'Праздники', 'holiday-kit', 'cabin-overhang-doorway', { targetHeight: 5 }), - m('holiday-cabin-roof-chimney', 'Хижина Крыша Дымоход', 'Праздники', 'holiday-kit', 'cabin-roof-chimney', { targetHeight: 5 }), - m('holiday-cabin-roof-corner', 'Хижина Крыша угол', 'Праздники', 'holiday-kit', 'cabin-roof-corner', { targetHeight: 5 }), - m('holiday-cabin-roof-dormer', 'Хижина Крыша мансарда', 'Праздники', 'holiday-kit', 'cabin-roof-dormer', { targetHeight: 5 }), - m('holiday-cabin-roof-point', 'Хижина Крыша остриё', 'Праздники', 'holiday-kit', 'cabin-roof-point', { targetHeight: 5 }), - m('holiday-cabin-roof-snow-chimney', 'Хижина Крыша Снег Дымоход', 'Праздники', 'holiday-kit', 'cabin-roof-snow-chimney', { targetHeight: 5 }), - m('holiday-cabin-roof-snow-corner', 'Хижина Крыша Снег угол', 'Праздники', 'holiday-kit', 'cabin-roof-snow-corner', { targetHeight: 5 }), - m('holiday-cabin-roof-snow-dormer', 'Хижина Крыша Снег мансарда', 'Праздники', 'holiday-kit', 'cabin-roof-snow-dormer', { targetHeight: 5 }), - m('holiday-cabin-roof-snow-point', 'Хижина Крыша Снег остриё', 'Праздники', 'holiday-kit', 'cabin-roof-snow-point', { targetHeight: 5 }), - m('holiday-cabin-roof-snow', 'Хижина Крыша Снег', 'Праздники', 'holiday-kit', 'cabin-roof-snow', { targetHeight: 5 }), - m('holiday-cabin-roof-top', 'Хижина Крыша верх', 'Праздники', 'holiday-kit', 'cabin-roof-top', { targetHeight: 5 }), - m('holiday-cabin-roof', 'Хижина Крыша', 'Праздники', 'holiday-kit', 'cabin-roof', { targetHeight: 5 }), - m('holiday-cabin-wall-low', 'Хижина Стена низкий', 'Праздники', 'holiday-kit', 'cabin-wall-low', { targetHeight: 5 }), - m('holiday-cabin-wall-roof-center', 'Хижина Стена Крыша центр', 'Праздники', 'holiday-kit', 'cabin-wall-roof-center', { targetHeight: 5 }), - m('holiday-cabin-wall-roof', 'Хижина Стена Крыша', 'Праздники', 'holiday-kit', 'cabin-wall-roof', { targetHeight: 5 }), - m('holiday-cabin-wall-wreath', 'Хижина Стена венок', 'Праздники', 'holiday-kit', 'cabin-wall-wreath', { targetHeight: 5 }), - m('holiday-cabin-wall', 'Хижина Стена', 'Праздники', 'holiday-kit', 'cabin-wall', { targetHeight: 5 }), - m('holiday-cabin-window-a', 'Хижина Окно a', 'Праздники', 'holiday-kit', 'cabin-window-a', { targetHeight: 5 }), - m('holiday-cabin-window-b', 'Хижина Окно b', 'Праздники', 'holiday-kit', 'cabin-window-b', { targetHeight: 5 }), - m('holiday-cabin-window-c', 'Хижина Окно c', 'Праздники', 'holiday-kit', 'cabin-window-c', { targetHeight: 5 }), - m('holiday-cabin-window-large', 'Хижина Окно большой', 'Праздники', 'holiday-kit', 'cabin-window-large', { targetHeight: 5 }), - m('holiday-candy-cane-green', 'Конфета cane зелёный', 'Праздники', 'holiday-kit', 'candy-cane-green', { targetHeight: 1.5 }), - m('holiday-candy-cane-red', 'Конфета cane красный', 'Праздники', 'holiday-kit', 'candy-cane-red', { targetHeight: 1.5 }), - m('holiday-festivus-pole', 'Festivus pole', 'Праздники', 'holiday-kit', 'festivus-pole', { targetHeight: 1.5 }), - m('holiday-floor-stone', 'Пол Камень', 'Праздники', 'holiday-kit', 'floor-stone', { targetHeight: 1.5 }), - m('holiday-floor-wood-snow', 'Пол дерево Снег', 'Праздники', 'holiday-kit', 'floor-wood-snow', { targetHeight: 0.8 }), - m('holiday-floor-wood', 'Пол дерево', 'Праздники', 'holiday-kit', 'floor-wood', { targetHeight: 1.5 }), - m('holiday-gingerbread-man', 'Имбирный пряник man', 'Праздники', 'holiday-kit', 'gingerbread-man', { targetHeight: 1.5 }), - m('holiday-gingerbread-woman', 'Имбирный пряник woman', 'Праздники', 'holiday-kit', 'gingerbread-woman', { targetHeight: 1.5 }), - m('holiday-hanukkah-dreidel', 'Ханука дрейдл', 'Праздники', 'holiday-kit', 'hanukkah-dreidel', { targetHeight: 1.5 }), - m('holiday-hanukkah-menorah-candles', 'Ханука менора candles', 'Праздники', 'holiday-kit', 'hanukkah-menorah-candles', { targetHeight: 0.6 }), - m('holiday-hanukkah-menorah', 'Ханука менора', 'Праздники', 'holiday-kit', 'hanukkah-menorah', { targetHeight: 1.5 }), - m('holiday-kwanzaa-kikombe', 'Kwanzaa kikombe', 'Праздники', 'holiday-kit', 'kwanzaa-kikombe', { targetHeight: 1.5 }), - m('holiday-kwanzaa-kinara-alternative', 'Kwanzaa kinara alternative', 'Праздники', 'holiday-kit', 'kwanzaa-kinara-alternative', { targetHeight: 1.5 }), - m('holiday-kwanzaa-kinara', 'Kwanzaa kinara', 'Праздники', 'holiday-kit', 'kwanzaa-kinara', { targetHeight: 1.5 }), - m('holiday-lantern-hanging', 'Фонарь подвесной', 'Праздники', 'holiday-kit', 'lantern-hanging', { targetHeight: 1.5 }), - m('holiday-lantern', 'Фонарь', 'Праздники', 'holiday-kit', 'lantern', { targetHeight: 1.5 }), - m('holiday-lights-colored', 'Свет цветной', 'Праздники', 'holiday-kit', 'lights-colored', { targetHeight: 1.5 }), - - // === Поезд === (модели holiday-kit: локомотив, вагоны, рельсы. - // GLB-файлы уже в kubikon-assets/models/holiday-kit/ — регистрируем - // в каталоге, чтобы можно было ставить на сцену и в раннер-играх). - m('train-locomotive', 'Поезд: локомотив', 'Поезд', 'holiday-kit', 'train-locomotive', { targetHeight: 3 }), - m('train-tender', 'Поезд: тендер', 'Поезд', 'holiday-kit', 'train-tender', { targetHeight: 3 }), - m('train-wagon', 'Поезд: вагон', 'Поезд', 'holiday-kit', 'train-wagon', { targetHeight: 3 }), - m('train-wagon-short', 'Поезд: вагон короткий', 'Поезд', 'holiday-kit', 'train-wagon-short', { targetHeight: 3 }), - m('train-wagon-flat', 'Поезд: платформа', 'Поезд', 'holiday-kit', 'train-wagon-flat', { targetHeight: 2 }), - m('train-wagon-flat-short', 'Поезд: платформа короткая', 'Поезд', 'holiday-kit', 'train-wagon-flat-short', { targetHeight: 2 }), - m('train-wagon-logs', 'Поезд: вагон с брёвнами', 'Поезд', 'holiday-kit', 'train-wagon-logs', { targetHeight: 3 }), - m('trainset-rail-straight', 'Рельсы прямые', 'Поезд', 'holiday-kit', 'trainset-rail-straight', { targetHeight: 0.4 }), - m('trainset-rail-detailed-straight', 'Рельсы прямые детальные', 'Поезд', 'holiday-kit', 'trainset-rail-detailed-straight', { targetHeight: 0.4 }), - m('trainset-rail-bend', 'Рельсы поворот', 'Поезд', 'holiday-kit', 'trainset-rail-bend', { targetHeight: 0.4 }), - m('trainset-rail-corner', 'Рельсы угол', 'Поезд', 'holiday-kit', 'trainset-rail-corner', { targetHeight: 0.4 }), - - // === Выживание === (50) - m('survival-barrel-open', 'Бочка открытый', 'Выживание', 'survival-kit', 'barrel-open', { targetHeight: 1 }), - m('survival-barrel', 'Бочка', 'Выживание', 'survival-kit', 'barrel', { targetHeight: 1 }), - m('survival-bedroll-frame', 'Спальник рама', 'Выживание', 'survival-kit', 'bedroll-frame', { targetHeight: 1 }), - m('survival-bedroll-packed', 'Свёрнутый коврик', 'Выживание', 'survival-kit', 'bedroll-packed', { targetHeight: 1 }), - m('survival-bedroll', 'Спальник', 'Выживание', 'survival-kit', 'bedroll', { targetHeight: 1 }), - m('survival-bottle-large', 'Бутылка большой', 'Выживание', 'survival-kit', 'bottle-large', { targetHeight: 1 }), - m('survival-bottle', 'Бутылка', 'Выживание', 'survival-kit', 'bottle', { targetHeight: 1 }), - m('survival-box-large-open', 'Коробка большой открытый', 'Выживание', 'survival-kit', 'box-large-open', { targetHeight: 0.8 }), - m('survival-box-large', 'Коробка большой', 'Выживание', 'survival-kit', 'box-large', { targetHeight: 0.8 }), - m('survival-box-open', 'Коробка открытый', 'Выживание', 'survival-kit', 'box-open', { targetHeight: 0.8 }), - m('survival-box', 'Коробка', 'Выживание', 'survival-kit', 'box', { targetHeight: 0.8 }), - m('survival-bucket', 'Ведро', 'Выживание', 'survival-kit', 'bucket', { targetHeight: 0.8 }), - m('survival-campfire-fishing-stand', 'Костёр рыболов. Подставка', 'Выживание', 'survival-kit', 'campfire-fishing-stand', { targetHeight: 1 }), - m('survival-campfire-pit', 'Костёр яма', 'Выживание', 'survival-kit', 'campfire-pit', { targetHeight: 1 }), - m('survival-campfire-stand', 'Костёр Подставка', 'Выживание', 'survival-kit', 'campfire-stand', { targetHeight: 1 }), - m('survival-chest', 'Сундук', 'Выживание', 'survival-kit', 'chest', { targetHeight: 0.8 }), - m('survival-fence-doorway', 'Забор проём', 'Выживание', 'survival-kit', 'fence-doorway', { targetHeight: 1 }), - m('survival-fence-fortified', 'Забор укреплённый', 'Выживание', 'survival-kit', 'fence-fortified', { targetHeight: 1 }), - m('survival-fence', 'Забор', 'Выживание', 'survival-kit', 'fence', { targetHeight: 1 }), - m('survival-fish-large', 'Рыба большой', 'Выживание', 'survival-kit', 'fish-large', { targetHeight: 1 }), - m('survival-fish', 'Рыба', 'Выживание', 'survival-kit', 'fish', { targetHeight: 1 }), - m('survival-floor-hole', 'Дыра в полу', 'Выживание', 'survival-kit', 'floor-hole', { targetHeight: 1 }), - m('survival-floor-old', 'Пол старый', 'Выживание', 'survival-kit', 'floor-old', { targetHeight: 1 }), - m('survival-floor', 'Пол', 'Выживание', 'survival-kit', 'floor', { targetHeight: 1 }), - m('survival-grass-large', 'Высокая трава', 'Выживание', 'survival-kit', 'grass-large', { targetHeight: 1 }), - m('survival-grass', 'Трава', 'Выживание', 'survival-kit', 'grass', { targetHeight: 1 }), - m('survival-metal-panel-narrow', 'Metal panel узкий', 'Выживание', 'survival-kit', 'metal-panel-narrow', { targetHeight: 1 }), - m('survival-metal-panel-screws-half', 'Metal panel screws половина', 'Выживание', 'survival-kit', 'metal-panel-screws-half', { targetHeight: 1 }), - m('survival-metal-panel-screws-narrow', 'Metal panel screws узкий', 'Выживание', 'survival-kit', 'metal-panel-screws-narrow', { targetHeight: 1 }), - m('survival-metal-panel-screws', 'Metal panel screws', 'Выживание', 'survival-kit', 'metal-panel-screws', { targetHeight: 1 }), - m('survival-metal-panel', 'Metal panel', 'Выживание', 'survival-kit', 'metal-panel', { targetHeight: 1 }), - m('survival-patch-grass-large', 'Patch Высокая трава', 'Выживание', 'survival-kit', 'patch-grass-large', { targetHeight: 1 }), - m('survival-patch-grass', 'Patch Трава', 'Выживание', 'survival-kit', 'patch-grass', { targetHeight: 1 }), - m('survival-resource-planks', 'Resource planks', 'Выживание', 'survival-kit', 'resource-planks', { targetHeight: 1 }), - m('survival-resource-stone-large', 'Resource Камень большой', 'Выживание', 'survival-kit', 'resource-stone-large', { targetHeight: 1 }), - m('survival-resource-stone', 'Resource Камень', 'Выживание', 'survival-kit', 'resource-stone', { targetHeight: 1 }), - m('survival-resource-wood', 'Resource дерево', 'Выживание', 'survival-kit', 'resource-wood', { targetHeight: 1 }), - m('survival-rock-a', 'Камень a', 'Выживание', 'survival-kit', 'rock-a', { targetHeight: 1 }), - m('survival-rock-b', 'Камень b', 'Выживание', 'survival-kit', 'rock-b', { targetHeight: 1 }), - m('survival-rock-c', 'Камень c', 'Выживание', 'survival-kit', 'rock-c', { targetHeight: 1 }), - m('survival-rock-flat-grass', 'Камень плоский Трава', 'Выживание', 'survival-kit', 'rock-flat-grass', { targetHeight: 1 }), - m('survival-rock-flat', 'Камень плоский', 'Выживание', 'survival-kit', 'rock-flat', { targetHeight: 1 }), - m('survival-rock-sand-a', 'Камень Песок a', 'Выживание', 'survival-kit', 'rock-sand-a', { targetHeight: 1 }), - m('survival-rock-sand-b', 'Камень Песок b', 'Выживание', 'survival-kit', 'rock-sand-b', { targetHeight: 1 }), - m('survival-rock-sand-c', 'Камень Песок c', 'Выживание', 'survival-kit', 'rock-sand-c', { targetHeight: 1 }), - m('survival-signpost-single', 'Signpost одинарный', 'Выживание', 'survival-kit', 'signpost-single', { targetHeight: 1 }), - m('survival-signpost', 'Signpost', 'Выживание', 'survival-kit', 'signpost', { targetHeight: 1 }), - m('survival-structure-canvas', 'Structure canvas', 'Выживание', 'survival-kit', 'structure-canvas', { targetHeight: 1 }), - m('survival-structure-floor', 'Structure пол', 'Выживание', 'survival-kit', 'structure-floor', { targetHeight: 1 }), - m('survival-structure-metal-doorway', 'Structure metal проём', 'Выживание', 'survival-kit', 'structure-metal-doorway', { targetHeight: 1 }), - - // === Арена === (50) - m('mini-arena-banner', 'Знамя', 'Арена', 'mini-arena', 'banner', { targetHeight: 1.5 }), - m('mini-arena-block', 'Блок', 'Арена', 'mini-arena', 'block', { targetHeight: 1.2 }), - m('mini-arena-border-corner', 'Бордюр угол', 'Арена', 'mini-arena', 'border-corner', { targetHeight: 1.2 }), - m('mini-arena-border-straight', 'Бордюр Прямой участок', 'Арена', 'mini-arena', 'border-straight', { targetHeight: 1.2 }), - m('mini-arena-bricks', 'Кирпичи', 'Арена', 'mini-arena', 'bricks', { targetHeight: 1.2 }), - m('mini-arena-character-soldier', 'Персонаж Солдат', 'Арена', 'mini-arena', 'character-soldier', { targetHeight: 1.2 }), - m('mini-arena-column-damaged', 'Колонна повреждённый', 'Арена', 'mini-arena', 'column-damaged', { targetHeight: 2 }), - m('mini-arena-column', 'Колонна', 'Арена', 'mini-arena', 'column', { targetHeight: 2 }), - m('mini-arena-floor-detail', 'Пол Деталь', 'Арена', 'mini-arena', 'floor-detail', { targetHeight: 0.4 }), - m('mini-arena-floor', 'Пол', 'Арена', 'mini-arena', 'floor', { targetHeight: 0.4 }), - m('mini-arena-stairs-corner-inner', 'Лестница угол внутр.', 'Арена', 'mini-arena', 'stairs-corner-inner', { targetHeight: 1 }), - m('mini-arena-stairs-corner', 'Лестница угол', 'Арена', 'mini-arena', 'stairs-corner', { targetHeight: 1 }), - m('mini-arena-stairs', 'Лестница', 'Арена', 'mini-arena', 'stairs', { targetHeight: 1 }), - m('mini-arena-statue', 'Статуя', 'Арена', 'mini-arena', 'statue', { targetHeight: 3 }), - m('mini-arena-tree', 'Дерево', 'Арена', 'mini-arena', 'tree', { targetHeight: 1.2 }), - m('mini-arena-trophy', 'Кубок', 'Арена', 'mini-arena', 'trophy', { targetHeight: 1 }), - m('mini-arena-wall-corner', 'Стена угол', 'Арена', 'mini-arena', 'wall-corner', { targetHeight: 2 }), - m('mini-arena-wall-gate', 'Стена Ворота', 'Арена', 'mini-arena', 'wall-gate', { targetHeight: 2 }), - m('mini-arena-wall', 'Стена', 'Арена', 'mini-arena', 'wall', { targetHeight: 2 }), - m('mini-arena-weapon-rack', 'Оружие стойка', 'Арена', 'mini-arena', 'weapon-rack', { targetHeight: 1.5 }), - m('mini-arena-weapon-spear', 'Оружие Копьё', 'Арена', 'mini-arena', 'weapon-spear', { targetHeight: 1.5 }), - m('mini-arena-weapon-sword', 'Оружие Меч', 'Арена', 'mini-arena', 'weapon-sword', { targetHeight: 1.5 }), - m('conveyor-arrow-basic-rounded', 'Стрела basic rounded', 'Арена', 'conveyor-kit', 'arrow-basic-rounded', { targetHeight: 0.6 }), - m('conveyor-arrow-basic', 'Стрела basic', 'Арена', 'conveyor-kit', 'arrow-basic', { targetHeight: 0.6 }), - m('conveyor-arrow-rounded', 'Стрела rounded', 'Арена', 'conveyor-kit', 'arrow-rounded', { targetHeight: 0.6 }), - m('conveyor-arrow', 'Стрела', 'Арена', 'conveyor-kit', 'arrow', { targetHeight: 0.6 }), - m('conveyor-box-large', 'Коробка большой', 'Арена', 'conveyor-kit', 'box-large', { targetHeight: 1 }), - m('conveyor-box-long', 'Коробка длинный', 'Арена', 'conveyor-kit', 'box-long', { targetHeight: 1 }), - m('conveyor-box-small', 'Коробка маленький', 'Арена', 'conveyor-kit', 'box-small', { targetHeight: 1 }), - m('conveyor-box-wide', 'Коробка широкий', 'Арена', 'conveyor-kit', 'box-wide', { targetHeight: 1 }), - m('conveyor-conveyor-bars-fence', 'Конвейер bars Забор', 'Арена', 'conveyor-kit', 'conveyor-bars-fence', { targetHeight: 0.4 }), - m('conveyor-conveyor-bars-high', 'Конвейер bars высокий', 'Арена', 'conveyor-kit', 'conveyor-bars-high', { targetHeight: 0.4 }), - m('conveyor-conveyor-bars-sides', 'Конвейер bars sides', 'Арена', 'conveyor-kit', 'conveyor-bars-sides', { targetHeight: 0.4 }), - m('conveyor-conveyor-bars-stripe-fence', 'Конвейер bars stripe Забор', 'Арена', 'conveyor-kit', 'conveyor-bars-stripe-fence', { targetHeight: 0.4 }), - m('conveyor-conveyor-bars-stripe-high', 'Конвейер bars stripe высокий', 'Арена', 'conveyor-kit', 'conveyor-bars-stripe-high', { targetHeight: 0.4 }), - m('conveyor-conveyor-bars-stripe-side', 'Конвейер bars stripe бок', 'Арена', 'conveyor-kit', 'conveyor-bars-stripe-side', { targetHeight: 0.4 }), - m('conveyor-conveyor-bars-stripe', 'Конвейер bars stripe', 'Арена', 'conveyor-kit', 'conveyor-bars-stripe', { targetHeight: 0.4 }), - m('conveyor-conveyor-bars', 'Конвейер bars', 'Арена', 'conveyor-kit', 'conveyor-bars', { targetHeight: 0.4 }), - m('conveyor-conveyor-cross', 'Конвейер крест', 'Арена', 'conveyor-kit', 'conveyor-cross', { targetHeight: 0.4 }), - m('conveyor-conveyor-junction-t', 'Конвейер Развилка t', 'Арена', 'conveyor-kit', 'conveyor-junction-t', { targetHeight: 0.4 }), - m('conveyor-conveyor-long-part-end', 'Конвейер длинный part конец', 'Арена', 'conveyor-kit', 'conveyor-long-part-end', { targetHeight: 0.4 }), - m('conveyor-conveyor-long-part-middle', 'Конвейер длинный part middle', 'Арена', 'conveyor-kit', 'conveyor-long-part-middle', { targetHeight: 0.4 }), - m('conveyor-conveyor-long-sides-part-end', 'Конвейер длинный sides part конец', 'Арена', 'conveyor-kit', 'conveyor-long-sides-part-end', { targetHeight: 0.4 }), - m('conveyor-conveyor-long-sides-part-middle', 'Конвейер длинный sides part middle', 'Арена', 'conveyor-kit', 'conveyor-long-sides-part-middle', { targetHeight: 0.4 }), - m('conveyor-conveyor-long-sides', 'Конвейер длинный sides', 'Арена', 'conveyor-kit', 'conveyor-long-sides', { targetHeight: 0.4 }), - m('conveyor-conveyor-long-stripe-sides-part-end', 'Конвейер длинный stripe sides part конец', 'Арена', 'conveyor-kit', 'conveyor-long-stripe-sides-part-end', { targetHeight: 0.4 }), - m('conveyor-conveyor-long-stripe-sides-part-middle', 'Конвейер длинный stripe sides part middle', 'Арена', 'conveyor-kit', 'conveyor-long-stripe-sides-part-middle', { targetHeight: 0.4 }), - m('conveyor-conveyor-long-stripe-sides', 'Конвейер длинный stripe sides', 'Арена', 'conveyor-kit', 'conveyor-long-stripe-sides', { targetHeight: 0.4 }), - m('conveyor-conveyor-long-stripe', 'Конвейер длинный stripe', 'Арена', 'conveyor-kit', 'conveyor-long-stripe', { targetHeight: 0.4 }), - m('conveyor-conveyor-long', 'Конвейер длинный', 'Арена', 'conveyor-kit', 'conveyor-long', { targetHeight: 0.4 }), - - // === Персонажи === (33) - m('mini-characters-character-female-a', 'Аня', 'Персонажи', 'mini-characters', 'character-female-a', { targetHeight: 1.7 }), - m('mini-characters-character-female-b', 'Маша', 'Персонажи', 'mini-characters', 'character-female-b', { targetHeight: 1.7 }), - m('mini-characters-character-female-c', 'Лена', 'Персонажи', 'mini-characters', 'character-female-c', { targetHeight: 1.7 }), - m('mini-characters-character-female-d', 'Катя', 'Персонажи', 'mini-characters', 'character-female-d', { targetHeight: 1.7 }), - m('mini-characters-character-female-e', 'Оля', 'Персонажи', 'mini-characters', 'character-female-e', { targetHeight: 1.7 }), - m('mini-characters-character-female-f', 'Настя', 'Персонажи', 'mini-characters', 'character-female-f', { targetHeight: 1.7 }), - m('mini-characters-character-male-a', 'Костя', 'Персонажи', 'mini-characters', 'character-male-a', { targetHeight: 1.7 }), - m('mini-characters-character-male-b', 'Максим', 'Персонажи', 'mini-characters', 'character-male-b', { targetHeight: 1.7 }), - m('mini-characters-character-male-c', 'Дима', 'Персонажи', 'mini-characters', 'character-male-c', { targetHeight: 1.7 }), - m('mini-characters-character-male-d', 'Саша', 'Персонажи', 'mini-characters', 'character-male-d', { targetHeight: 1.7 }), - m('mini-characters-character-male-e', 'Артём', 'Персонажи', 'mini-characters', 'character-male-e', { targetHeight: 1.7 }), - m('mini-characters-character-male-f', 'Лёша', 'Персонажи', 'mini-characters', 'character-male-f', { targetHeight: 1.7 }), - - // === ДЕТСКАЯ ПЛОЩАДКА (Poly Pizza, CC-BY 3.0) === - // Используются в L2 «Игры в кальмара» (Дальгона). Атрибуция авторов - // в /public/playground-kit/CREDITS.txt. - mu('pg-slide-google', 'Горка (Poly)', 'Площадка', - '/playground-kit/slide_google.glb', { targetHeight: 4 }), - mu('pg-swing-google', 'Качели (Google)', 'Площадка', - '/playground-kit/swing_set_google.glb', { targetHeight: 3.5 }), - mu('pg-seesaw', 'Качели-балансир', 'Площадка', - '/playground-kit/seesaw_2.glb', { targetHeight: 1.5 }), - mu('pg-carousel', 'Карусель', 'Площадка', - '/playground-kit/merry_go_round.glb', { targetHeight: 2.5 }), - mu('pg-jungle-gym', 'Лазалка-комплекс', 'Площадка', - '/playground-kit/jungle_gym.glb', { targetHeight: 4 }), - // Kenney CC0 — старинная скамейка с кладбища (выбрана МИНом) - m('pg-bench', 'Скамья парковая', 'Площадка', 'graveyard-kit', 'bench', - { targetHeight: 1.2 }), - // Двойной фонарь с кладбища - m('pg-lamp-double', 'Фонарь двойной', 'Площадка', 'graveyard-kit', 'lightpost-double', - { targetHeight: 4 }), - // Детальное дерево из nature-kit - m('pg-tree-detailed', 'Дерево детальное', 'Площадка', 'nature-kit', 'tree_detailed', - { targetHeight: 4 }), - // Куст детальный - m('pg-bush-detailed', 'Куст', 'Площадка', 'nature-kit', 'plant_bushDetailed', - { targetHeight: 1.2 }), - // Забор из досок - m('pg-fence-planks', 'Забор', 'Площадка', 'nature-kit', 'fence_planks', - { targetHeight: 1.5 }), - -// TOTAL: 644 - -]; - -// Авто-проставляем gameplay для всех моделей в категории «Оружие» — -// бластеры (ranged), мечи/копья (melee), щиты пропускаем. -for (const m of MODEL_TYPES) { - if (m.category !== 'Оружие') continue; - if (m.gameplay) continue; // уже задан вручную - const id = m.id; - if (id.startsWith('shield')) continue; - if (id.startsWith('blaster-blaster-')) { - m.gameplay = { - type: 'weapon-ranged', - isWeapon: true, - weaponKind: 'ranged', - description: 'Дальнобойное оружие. Нажми «Добавить в инвентарь» чтобы выдать игроку.', - defaultParams: { - damage: 25, fireRate: 0.18, range: 80, - magazine: 30, reserve: 120, reloadTime: 1.6, auto: true, - }, - // Базовые настройки. Подкручиваются через window.weapon3rd(...). - viewModel: { - scale3rd: 1.2, scale1st: 0.7, - position3rd: { x: 0, y: 0, z: 0 }, - rotation3rd: { x: 0, y: 0, z: 0 }, - }, - }; - } else if (id === 'weapon-sword') { - m.gameplay = { - type: 'weapon-melee', isWeapon: true, weaponKind: 'melee', - description: 'Меч. ЛКМ — широкий взмах.', - defaultParams: { damage: 40, fireRate: 0.55, range: 2.4, meleeArc: 1.2, auto: false }, - viewModel: { - scale3rd: 1.4, scale1st: 1.0, - position3rd: { x: 0, y: 0, z: 0 }, - rotation3rd: { x: 0, y: 0, z: 0 }, - }, - }; - } else if (id === 'weapon-spear') { - m.gameplay = { - type: 'weapon-melee', isWeapon: true, weaponKind: 'melee', - description: 'Копьё. ЛКМ — выпад вперёд.', - defaultParams: { damage: 55, fireRate: 0.85, range: 3.2, meleeArc: 0.6, auto: false }, - viewModel: { - scale3rd: 1.4, scale1st: 1.0, - position3rd: { x: 0, y: 0, z: 0 }, - rotation3rd: { x: 0, y: 0, z: 0 }, - }, - }; - } -} - -export const MODEL_CATEGORIES = Array.from(new Set(MODEL_TYPES.map(m => m.category))); - -export function getModelType(id) { - return MODEL_TYPES.find(m => m.id === id) || null; -} +/** + * ModelTypes — реестр 3D-моделей (GLB) для Рублокс-редактора. + * + * Все модели — Kenney CC0, лежат в /public/kubikon-assets/models// + * где pack ∈ {dungeon, platformer, characters}. + * GLB файл ссылается на ./Textures/colormap.png — поэтому каждый pack лежит + * в своей подпапке со своей колормапой. + */ + +const M = '/kubikon-assets/models'; + +/** + * Создать запись о модели. + * pack — имя подпапки ('dungeon' | 'platformer' | 'characters'). + * file — имя GLB без расширения. + */ +const m = (id, name, category, pack, file, opts = {}) => ({ + id, name, category, + file: `${M}/${pack}/${file}.glb`, + scale: opts.scale ?? 1, + yOffset: opts.yOffset ?? 0, + ...opts, +}); + +/** + * Создать запись о модели с произвольным URL (вне kubikon-assets). + * url — полный путь от корня сайта, например '/playground-kit/slide.glb'. + */ +const mu = (id, name, category, url, opts = {}) => ({ + id, name, category, + file: url, + scale: opts.scale ?? 1, + yOffset: opts.yOffset ?? 0, + ...opts, +}); + +/** + * mc — «compound»-модель из нескольких частей. При постановке создаётся папка + * и каждая part добавляется внутрь. + * id, name, category — как у обычных моделей + * parts: [ + * { kind: 'mesh', model: 'id-простой-модели', dx, dy, dz, ry } + * { kind: 'primitive', type: 'cube'|'sphere'|..., sx, sy, sz, color, dx, dy, dz, rx, ry, rz } + * ] + * Координаты dx/dy/dz — смещение относительно центра компаунда; ry — локальный yaw. + */ +const mc = (id, name, category, parts, opts = {}) => ({ + id, name, category, + file: null, // нет основного GLB — модель собирается из частей + scale: 1, + parts, + isCompound: true, + ...opts, +}); + +export const MODEL_TYPES = [ + // === ПРИРОДА (platformer pack) === + m('tree', 'Дерево', 'Природа', 'platformer', 'tree', { targetHeight: 1.5 }), + m('tree-pine', 'Сосна', 'Природа', 'platformer', 'tree-pine', { targetHeight: 4 }), + m('tree-pine-small', 'Молодая сосна', 'Природа', 'platformer', 'tree-pine-small', { targetHeight: 2.5 }), + m('tree-pine-snow', 'Снежная сосна', 'Природа', 'platformer', 'tree-pine-snow', { targetHeight: 4 }), + m('tree-snow', 'Снежное дерево', 'Природа', 'platformer', 'tree-snow', { targetHeight: 4 }), + m('flowers', 'Цветы', 'Природа', 'platformer', 'flowers', { targetHeight: 0.6 }), + m('flowers-tall', 'Высокие цветы', 'Природа', 'platformer', 'flowers-tall', { targetHeight: 0.6 }), + m('mushrooms', 'Грибы', 'Природа', 'platformer', 'mushrooms', { targetHeight: 0.6 }), + m('plant', 'Растение', 'Природа', 'platformer', 'plant', { targetHeight: 0.7 }), + m('grass-model', 'Трава', 'Природа', 'platformer', 'grass', { targetHeight: 0.7 }), + m('hedge', 'Куст', 'Природа', 'platformer', 'hedge', { targetHeight: 0.7 }), + m('rocks-platformer','Камни', 'Природа', 'platformer', 'rocks', { targetHeight: 1.5 }), + m('rocks-dungeon', 'Скалы', 'Природа', 'dungeon', 'rocks', { targetHeight: 1.5 }), + m('stones', 'Булыжники', 'Природа', 'dungeon', 'stones', { targetHeight: 0.8 }), + + // === ДВЕРИ И ВОРОТА === + m('door-rotate', 'Дверь', 'Двери', 'platformer', 'door-rotate', { targetHeight: 1.8 }), + m('door-rotate-large', 'Большая дверь', 'Двери', 'platformer', 'door-rotate-large', { targetHeight: 1.8 }), + m('door-open', 'Открытая дверь', 'Двери', 'platformer', 'door-open', { targetHeight: 1.8 }), + m('door-large-open', 'Откр. бол. дверь','Двери', 'platformer', 'door-large-open', { targetHeight: 1.8 }), + m('gate', 'Ворота', 'Двери', 'dungeon', 'gate', { targetHeight: 1.8 }), + + // === ЗАБОРЫ (platformer) === + m('fence-straight', 'Забор', 'Заборы', 'platformer', 'fence-straight', { targetHeight: 1.2 }), + m('fence-corner', 'Угол забора', 'Заборы', 'platformer', 'fence-corner', { targetHeight: 1.2 }), + m('fence-broken', 'Сломанный забор', 'Заборы', 'platformer', 'fence-broken', { targetHeight: 1.2 }), + m('fence-rope', 'Верёвочный забор','Заборы', 'platformer', 'fence-rope', { targetHeight: 1.2 }), + m('fence-low-straight', 'Низкий забор', 'Заборы', 'platformer', 'fence-low-straight', { targetHeight: 1.2 }), + + // === МЕБЕЛЬ И ИНТЕРЬЕР === + m('chest', 'Сундук', 'Мебель', 'dungeon', 'chest', { targetHeight: 1.2 }), + m('barrel', 'Бочка', 'Мебель', 'dungeon', 'barrel', { targetHeight: 1.2 }), + m('crate', 'Ящик', 'Мебель', 'platformer', 'crate', { targetHeight: 1.2 }), + m('column', 'Колонна', 'Мебель', 'dungeon', 'column', { targetHeight: 1.2 }), + m('banner', 'Знамя', 'Мебель', 'dungeon', 'banner', { targetHeight: 1.2 }), + m('flag', 'Флаг', 'Мебель', 'platformer', 'flag', { targetHeight: 1.2 }), + m('sign', 'Табличка', 'Мебель', 'platformer', 'sign', { targetHeight: 1.2 }), + m('ladder', 'Лестница', 'Мебель', 'platformer', 'ladder', { targetHeight: 1.2 }), + m('ladder-long', 'Длин. лестница', 'Мебель', 'platformer', 'ladder-long', { targetHeight: 1.2 }), + m('ladder-broken', 'Слом. лестница', 'Мебель', 'platformer', 'ladder-broken', { targetHeight: 1.2 }), + m('stairs', 'Ступеньки', 'Мебель', 'dungeon', 'stairs', { targetHeight: 1.2 }), + m('wood-structure', 'Дерев. конструкция','Мебель','dungeon', 'wood-structure', { targetHeight: 1.2 }), + m('wood-support', 'Дерев. опора', 'Мебель', 'dungeon', 'wood-support', { targetHeight: 1.2 }), + m('wall', 'Стена', 'Мебель', 'dungeon', 'wall', { targetHeight: 1.2 }), + m('wall-half', 'Половина стены', 'Мебель', 'dungeon', 'wall-half', { targetHeight: 1.2 }), + m('wall-narrow', 'Узкая стена', 'Мебель', 'dungeon', 'wall-narrow', { targetHeight: 1.2 }), + m('wall-opening', 'Стена с проёмом', 'Мебель', 'dungeon', 'wall-opening', { targetHeight: 1.2 }), + m('floor', 'Пол', 'Мебель', 'dungeon', 'floor', { targetHeight: 1.2 }), + m('floor-detail', 'Узорный пол', 'Мебель', 'dungeon', 'floor-detail', { targetHeight: 1.2 }), + + // === МЕХАНИЗМЫ (platformer) === + m('lever', 'Рычаг', 'Механизмы', 'platformer', 'lever', { targetHeight: 1 }), + m('button-round', 'Кнопка круглая', 'Механизмы', 'platformer', 'button-round', { targetHeight: 1 }), + m('button-square', 'Кнопка квадратная','Механизмы','platformer', 'button-square', { targetHeight: 1 }), + m('spring', 'Пружина', 'Механизмы', 'platformer', 'spring', { targetHeight: 1 }), + m('saw', 'Пила', 'Механизмы', 'platformer', 'saw', { targetHeight: 1 }), + m('trap-dungeon', 'Ловушка', 'Механизмы', 'dungeon', 'trap', { targetHeight: 1 }), + m('trap-spikes', 'Шипы', 'Механизмы', 'platformer', 'trap-spikes', { targetHeight: 1 }), + m('trap-spikes-large', 'Большие шипы', 'Механизмы', 'platformer', 'trap-spikes-large', { targetHeight: 1 }), + m('spike-block', 'Шипастый блок', 'Механизмы', 'platformer', 'spike-block', { targetHeight: 1 }), + m('pipe', 'Труба', 'Механизмы', 'platformer', 'pipe', { targetHeight: 1 }), + m('poles', 'Столбы', 'Механизмы', 'platformer', 'poles', { targetHeight: 1 }), + m('bomb', 'Бомба', 'Механизмы', 'platformer', 'bomb', { targetHeight: 1 }), + + // === ПРЕДМЕТЫ === + m('coin', 'Монета', 'Предметы', 'dungeon', 'coin', { targetHeight: 0.6 }), + m('coin-gold', 'Золотая монета', 'Предметы', 'platformer', 'coin-gold', { targetHeight: 0.6 }), + m('coin-silver', 'Серебр. монета', 'Предметы', 'platformer', 'coin-silver', { targetHeight: 0.6 }), + m('coin-bronze', 'Бронз. монета', 'Предметы', 'platformer', 'coin-bronze', { targetHeight: 0.6 }), + m('jewel', 'Драгоценность', 'Предметы', 'platformer', 'jewel', { targetHeight: 0.6 }), + m('star', 'Звезда', 'Предметы', 'platformer', 'star', { targetHeight: 0.6 }), + m('heart', 'Сердце', 'Предметы', 'platformer', 'heart', { targetHeight: 0.6 }), + m('key', 'Ключ', 'Предметы', 'platformer', 'key', { targetHeight: 0.6 }), + m('lock', 'Замок', 'Предметы', 'platformer', 'lock', { targetHeight: 0.6 }), + m('arrow', 'Стрела', 'Предметы', 'platformer', 'arrow', { targetHeight: 0.6 }), + + // === ОРУЖИЕ (dungeon) === + m('weapon-sword', 'Меч', 'Оружие', 'dungeon', 'weapon-sword', { targetHeight: 1 }), + m('weapon-spear', 'Копьё', 'Оружие', 'dungeon', 'weapon-spear', { targetHeight: 1.2 }), + m('shield-round', 'Круглый щит', 'Оружие', 'dungeon', 'shield-round', { targetHeight: 1 }), + m('shield-rectangle', 'Прямоуг. щит', 'Оружие', 'dungeon', 'shield-rectangle', { targetHeight: 1 }), + + // === ВРАГИ (со встроенным AI) === + // Эти объекты имеют поведение в Play-режиме: AI, спавн, урон. + // gameplay содержит description для tooltip и defaultParams — настройки + // которые можно менять в Inspector. + m('zombie', 'Зомби', 'Враги', 'characters', 'character-c', { + targetHeight: 1.7, + // Скрыт из палитры — одиночный AI-зомби нестабилен (нерешённый баг с + // y-провалом на GLB-террейне, см. feedback_babylon про оптимизации). + // Используйте «Спавнер зомби» вместо одиночной модели. + hidden: true, + gameplay: { + type: 'zombie', + isZombie: true, + description: 'Враг с AI: бродит по миру, атакует игрока при приближении.', + defaultParams: { + hp: 50, + speed: 2.2, // м/с в погоне + wanderSpeed: 1.3, // м/с при патрулировании + detectionRadius: 16, // дистанция обнаружения игрока + attackRange: 1.8, // дистанция атаки + attackDamage: 10, // урон за удар + attackCooldown: 1.0, // секунд между ударами + wanderRadius: 14, // радиус патрулирования + }, + }, + }), + // Спавнер — синтетическая модель: вместо GLB ModelManager рисует диск-цилиндр. + // file=null + synthetic=true распознаётся в ModelManager._buildSyntheticInstance. + m('zombie-spawner', 'Спавнер зомби', 'Враги', 'characters', 'character-d', { + targetHeight: 0.3, + synthetic: 'spawner-disk', + gameplay: { + type: 'zombie-spawner', + isZombieSpawner: true, + description: 'Спавнит зомби с заданным интервалом, поддерживая лимит живых.', + defaultParams: { + maxAlive: 10, + spawnInterval: 10, + radius: 1, // 1 блок + zombieModelType: 'character-c', + zombieHp: 50, + zombieSpeed: 2.2, + zombieDamage: 10, + }, + }, + }), + + // === ПЕРСОНАЖИ === + m('character-a', 'Стив', 'Персонажи', 'characters', 'character-a', { targetHeight: 1.7 }), + m('character-b', 'Алекс', 'Персонажи', 'characters', 'character-b', { targetHeight: 1.7 }), + m('character-c', 'Виктор', 'Персонажи', 'characters', 'character-c', { targetHeight: 1.7 }), + m('character-d', 'Ирина', 'Персонажи', 'characters', 'character-d', { targetHeight: 1.7 }), + m('character-e', 'Паша', 'Персонажи', 'characters', 'character-e', { targetHeight: 1.7 }), + m('character-f', 'Юля', 'Персонажи', 'characters', 'character-f', { targetHeight: 1.7 }), + m('character-g', 'Андрей', 'Персонажи', 'characters', 'character-g', { targetHeight: 1.7 }), + + // === KENNEY PACKS — auto-generated === + // === Природа === (50) + m('nature-bridge-center-stone', 'Мост центр Камень', 'Природа', 'nature-kit', 'bridge_center_stone', { targetHeight: 1.5 }), + m('nature-bridge-center-stoneround', 'Мост центр кам. круглый', 'Природа', 'nature-kit', 'bridge_center_stoneRound', { targetHeight: 1.5 }), + m('nature-bridge-center-wood', 'Середина деревянного моста', 'Природа', 'nature-kit', 'bridge_center_wood', { targetHeight: 1.5 }), + m('nature-bridge-center-woodround', 'Мост центр дер. круглый', 'Природа', 'nature-kit', 'bridge_center_woodRound', { targetHeight: 1.5 }), + m('nature-bridge-side-stone', 'Мост бок Камень', 'Природа', 'nature-kit', 'bridge_side_stone', { targetHeight: 1.5 }), + m('nature-bridge-side-stoneround', 'Мост бок кам. круглый', 'Природа', 'nature-kit', 'bridge_side_stoneRound', { targetHeight: 1.5 }), + m('nature-bridge-side-wood', 'Край деревянного моста', 'Природа', 'nature-kit', 'bridge_side_wood', { targetHeight: 1.5 }), + m('nature-bridge-side-woodround', 'Мост бок дер. круглый', 'Природа', 'nature-kit', 'bridge_side_woodRound', { targetHeight: 1.5 }), + m('nature-bridge-stone', 'Мост Камень', 'Природа', 'nature-kit', 'bridge_stone', { targetHeight: 1.5 }), + m('nature-bridge-stonenarrow', 'Каменный узкий мост', 'Природа', 'nature-kit', 'bridge_stoneNarrow', { targetHeight: 1.5 }), + m('nature-bridge-stoneround', 'Каменный круглый мост', 'Природа', 'nature-kit', 'bridge_stoneRound', { targetHeight: 1.5 }), + m('nature-bridge-stoneroundnarrow', 'Каменный круглый узкий мост', 'Природа', 'nature-kit', 'bridge_stoneRoundNarrow', { targetHeight: 1.5 }), + m('nature-bridge-wood', 'Деревянный мост', 'Природа', 'nature-kit', 'bridge_wood', { targetHeight: 1.5 }), + m('nature-bridge-woodnarrow', 'Деревянный узкий мост', 'Природа', 'nature-kit', 'bridge_woodNarrow', { targetHeight: 1.5 }), + m('nature-bridge-woodround', 'Деревянный круглый мост', 'Природа', 'nature-kit', 'bridge_woodRound', { targetHeight: 1.5 }), + m('nature-bridge-woodroundnarrow', 'Деревянный круглый узкий мост', 'Природа', 'nature-kit', 'bridge_woodRoundNarrow', { targetHeight: 1.5 }), + m('nature-cactus-short', 'Кактус низкий', 'Природа', 'nature-kit', 'cactus_short', { targetHeight: 1.5 }), + m('nature-cactus-tall', 'Кактус высокий', 'Природа', 'nature-kit', 'cactus_tall', { targetHeight: 2.5 }), + m('nature-campfire-logs', 'Костёр (дрова)', 'Природа', 'nature-kit', 'campfire_logs', { targetHeight: 0.6 }), + m('nature-campfire-stones', 'Костёр Булыжники', 'Природа', 'nature-kit', 'campfire_stones', { targetHeight: 0.6 }), + m('nature-cliff-blockcave-rock', 'Скала пещерный блок Камень', 'Природа', 'nature-kit', 'cliff_blockCave_rock', { targetHeight: 1.5 }), + m('nature-cliff-blockcave-stone', 'Скала пещерный блок Камень', 'Природа', 'nature-kit', 'cliff_blockCave_stone', { targetHeight: 1.5 }), + m('nature-cliff-blockdiagonal-rock', 'Скала диагональный блок Камень', 'Природа', 'nature-kit', 'cliff_blockDiagonal_rock', { targetHeight: 1.5 }), + m('nature-cliff-blockdiagonal-stone', 'Скала диагональный блок Камень', 'Природа', 'nature-kit', 'cliff_blockDiagonal_stone', { targetHeight: 1.5 }), + m('nature-cliff-blockhalf-rock', 'Скала полублок Камень', 'Природа', 'nature-kit', 'cliff_blockHalf_rock', { targetHeight: 1.5 }), + m('nature-cliff-blockhalf-stone', 'Скала полублок Камень', 'Природа', 'nature-kit', 'cliff_blockHalf_stone', { targetHeight: 1.5 }), + m('nature-cliff-blockquarter-rock', 'Скала четверть-блок Камень', 'Природа', 'nature-kit', 'cliff_blockQuarter_rock', { targetHeight: 1.5 }), + m('nature-cliff-blockquarter-stone', 'Скала четверть-блок Камень', 'Природа', 'nature-kit', 'cliff_blockQuarter_stone', { targetHeight: 1.5 }), + m('nature-cliff-blockslopehalfwalls-rock', 'Скала наклон полублок со стенами Камень', 'Природа', 'nature-kit', 'cliff_blockSlopeHalfWalls_rock', { targetHeight: 1.5 }), + m('nature-cliff-blockslopehalfwalls-stone', 'Скала наклон полублок со стенами Камень', 'Природа', 'nature-kit', 'cliff_blockSlopeHalfWalls_stone', { targetHeight: 1.5 }), + m('nature-cliff-blockslopewalls-rock', 'Скала наклон блок со стенами Камень', 'Природа', 'nature-kit', 'cliff_blockSlopeWalls_rock', { targetHeight: 1.5 }), + m('nature-cliff-blockslopewalls-stone', 'Скала наклон блок со стенами Камень', 'Природа', 'nature-kit', 'cliff_blockSlopeWalls_stone', { targetHeight: 1.5 }), + m('nature-cliff-blockslope-rock', 'Скала наклон Камень', 'Природа', 'nature-kit', 'cliff_blockSlope_rock', { targetHeight: 1.5 }), + m('nature-cliff-blockslope-stone', 'Скала наклон Камень', 'Природа', 'nature-kit', 'cliff_blockSlope_stone', { targetHeight: 1.5 }), + m('nature-cliff-block-rock', 'Скала блок Камень', 'Природа', 'nature-kit', 'cliff_block_rock', { targetHeight: 1.5 }), + m('nature-cliff-block-stone', 'Скала блок Камень', 'Природа', 'nature-kit', 'cliff_block_stone', { targetHeight: 1.5 }), + m('nature-cliff-cave-rock', 'Скала пещера Камень', 'Природа', 'nature-kit', 'cliff_cave_rock', { targetHeight: 1.5 }), + m('nature-cliff-cave-stone', 'Скала пещера Камень', 'Природа', 'nature-kit', 'cliff_cave_stone', { targetHeight: 1.5 }), + m('nature-cliff-cornerinnerlarge-rock', 'Скала внутр. угол большой Камень', 'Природа', 'nature-kit', 'cliff_cornerInnerLarge_rock', { targetHeight: 1.5 }), + m('nature-cliff-cornerinnerlarge-stone', 'Скала внутр. угол большой Камень', 'Природа', 'nature-kit', 'cliff_cornerInnerLarge_stone', { targetHeight: 1.5 }), + m('nature-cliff-cornerinnertop-rock', 'Скала внутр. верхний угол Камень', 'Природа', 'nature-kit', 'cliff_cornerInnerTop_rock', { targetHeight: 1.5 }), + m('nature-cliff-cornerinnertop-stone', 'Скала внутр. верхний угол Камень', 'Природа', 'nature-kit', 'cliff_cornerInnerTop_stone', { targetHeight: 1.5 }), + m('nature-cliff-cornerinner-rock', 'Скала внутр. угол Камень', 'Природа', 'nature-kit', 'cliff_cornerInner_rock', { targetHeight: 1.5 }), + m('nature-cliff-cornerinner-stone', 'Скала внутр. угол Камень', 'Природа', 'nature-kit', 'cliff_cornerInner_stone', { targetHeight: 1.5 }), + m('nature-cliff-cornerlarge-rock', 'Скала угол большой Камень', 'Природа', 'nature-kit', 'cliff_cornerLarge_rock', { targetHeight: 1.5 }), + m('nature-cliff-cornerlarge-stone', 'Скала угол большой Камень', 'Природа', 'nature-kit', 'cliff_cornerLarge_stone', { targetHeight: 1.5 }), + m('nature-cliff-cornertop-rock', 'Скала верхний угол Камень', 'Природа', 'nature-kit', 'cliff_cornerTop_rock', { targetHeight: 1.5 }), + m('nature-cliff-cornertop-stone', 'Скала верхний угол Камень', 'Природа', 'nature-kit', 'cliff_cornerTop_stone', { targetHeight: 1.5 }), + m('nature-cliff-corner-rock', 'Скала угол Камень', 'Природа', 'nature-kit', 'cliff_corner_rock', { targetHeight: 1.5 }), + m('nature-cliff-corner-stone', 'Скала угол Камень', 'Природа', 'nature-kit', 'cliff_corner_stone', { targetHeight: 1.5 }), + + // === Транспорт === (47) + m('car-ambulance', 'Скорая', 'Транспорт', 'car-kit', 'ambulance', { targetHeight: 2.5 }), + m('car-delivery-flat', 'Доставка плоская', 'Транспорт', 'car-kit', 'delivery-flat', { targetHeight: 2.2 }), + m('car-delivery', 'Фургон', 'Транспорт', 'car-kit', 'delivery', { targetHeight: 2.2 }), + m('car-firetruck', 'Пожарная', 'Транспорт', 'car-kit', 'firetruck', { targetHeight: 2.5 }), + m('car-garbage-truck', 'Мусоровоз', 'Транспорт', 'car-kit', 'garbage-truck', { targetHeight: 2.5 }), + m('car-hatchback-sports', 'Хэтчбек спорт', 'Транспорт', 'car-kit', 'hatchback-sports', { targetHeight: 1.5 }), + m('car-kart-oobi', 'Карт ооби', 'Транспорт', 'car-kit', 'kart-oobi', { targetHeight: 1.2 }), + m('car-kart-oodi', 'Карт ооди', 'Транспорт', 'car-kit', 'kart-oodi', { targetHeight: 1.2 }), + m('car-kart-ooli', 'Карт ооли', 'Транспорт', 'car-kit', 'kart-ooli', { targetHeight: 1.2 }), + m('car-kart-oopi', 'Карт оопи', 'Транспорт', 'car-kit', 'kart-oopi', { targetHeight: 1.2 }), + m('car-kart-oozi', 'Карт оози', 'Транспорт', 'car-kit', 'kart-oozi', { targetHeight: 1.2 }), + m('car-police', 'Полицейская', 'Транспорт', 'car-kit', 'police', { targetHeight: 1.5 }), + m('car-race-future', 'Болид будущего', 'Транспорт', 'car-kit', 'race-future', { targetHeight: 1.5 }), + m('car-race', 'Гоночная', 'Транспорт', 'car-kit', 'race', { targetHeight: 1.5 }), + m('car-sedan-sports', 'Седан спорт', 'Транспорт', 'car-kit', 'sedan-sports', { targetHeight: 1.5 }), + m('car-sedan', 'Седан', 'Транспорт', 'car-kit', 'sedan', { targetHeight: 1.5 }), + m('car-suv-luxury', 'Внедорожник люкс', 'Транспорт', 'car-kit', 'suv-luxury', { targetHeight: 1.8 }), + m('car-suv', 'Внедорожник', 'Транспорт', 'car-kit', 'suv', { targetHeight: 1.8 }), + m('car-taxi', 'Такси', 'Транспорт', 'car-kit', 'taxi', { targetHeight: 1.5 }), + m('car-tractor-police', 'Трактор полиции', 'Транспорт', 'car-kit', 'tractor-police', { targetHeight: 2.2 }), + m('car-tractor-shovel', 'Трактор-погрузчик', 'Транспорт', 'car-kit', 'tractor-shovel', { targetHeight: 2.2 }), + m('car-tractor', 'Трактор', 'Транспорт', 'car-kit', 'tractor', { targetHeight: 2.2 }), + m('car-truck-flat', 'Грузовик плоский', 'Транспорт', 'car-kit', 'truck-flat', { targetHeight: 2.2 }), + m('car-truck', 'Грузовик', 'Транспорт', 'car-kit', 'truck', { targetHeight: 2.2 }), + m('car-van', 'Минивэн', 'Транспорт', 'car-kit', 'van', { targetHeight: 1.8 }), + m('car-wheel-dark', 'Колесо тёмное', 'Транспорт', 'car-kit', 'wheel-dark', { targetHeight: 0.5 }), + m('car-wheel-default', 'Колесо обычное', 'Транспорт', 'car-kit', 'wheel-default', { targetHeight: 0.5 }), + m('car-wheel-racing', 'Колесо гоночное', 'Транспорт', 'car-kit', 'wheel-racing', { targetHeight: 0.5 }), + m('car-wheel-tractor-back', 'Колесо Трактор зад', 'Транспорт', 'car-kit', 'wheel-tractor-back', { targetHeight: 2.2 }), + m('car-wheel-tractor-dark-back', 'Колесо Трактор тёмный зад', 'Транспорт', 'car-kit', 'wheel-tractor-dark-back', { targetHeight: 2.2 }), + m('car-wheel-tractor-dark-front', 'Колесо Трактор тёмный перед', 'Транспорт', 'car-kit', 'wheel-tractor-dark-front', { targetHeight: 2.2 }), + m('car-wheel-tractor-front', 'Колесо Трактор перед', 'Транспорт', 'car-kit', 'wheel-tractor-front', { targetHeight: 2.2 }), + m('car-wheel-truck', 'Колесо Грузовик', 'Транспорт', 'car-kit', 'wheel-truck', { targetHeight: 2.2 }), + m('toy-car-vehicle-drag-racer', 'Vehicle тяга гонщик', 'Транспорт', 'toy-car-kit', 'vehicle-drag-racer', { targetHeight: 1.5 }), + m('toy-car-vehicle-monster-truck', 'Vehicle monster Грузовик', 'Транспорт', 'toy-car-kit', 'vehicle-monster-truck', { targetHeight: 2.2 }), + m('toy-car-vehicle-racer-low', 'Vehicle гонщик низкий', 'Транспорт', 'toy-car-kit', 'vehicle-racer-low', { targetHeight: 1.5 }), + m('toy-car-vehicle-racer', 'Vehicle гонщик', 'Транспорт', 'toy-car-kit', 'vehicle-racer', { targetHeight: 1.5 }), + m('toy-car-vehicle-suv', 'Vehicle Внедорожник', 'Транспорт', 'toy-car-kit', 'vehicle-suv', { targetHeight: 1.8 }), + m('toy-car-vehicle-truck', 'Vehicle Грузовик', 'Транспорт', 'toy-car-kit', 'vehicle-truck', { targetHeight: 2.2 }), + m('toy-car-vehicle-vintage-racer', 'Vehicle vintage гонщик', 'Транспорт', 'toy-car-kit', 'vehicle-vintage-racer', { targetHeight: 1.5 }), + m('toy-car-wheel-large', 'Колесо большой', 'Транспорт', 'toy-car-kit', 'wheel-large', { targetHeight: 0.5 }), + m('toy-car-wheel-medium', 'Колесо средний', 'Транспорт', 'toy-car-kit', 'wheel-medium', { targetHeight: 0.5 }), + m('toy-car-wheel-small', 'Колесо маленький', 'Транспорт', 'toy-car-kit', 'wheel-small', { targetHeight: 0.5 }), + m('racing-racecargreen', 'Гоночная машина зелёный', 'Транспорт', 'racing-kit', 'raceCarGreen', { targetHeight: 1.5 }), + m('racing-racecarorange', 'Гоночная машина оранжевый', 'Транспорт', 'racing-kit', 'raceCarOrange', { targetHeight: 1.5 }), + m('racing-racecarred', 'Гоночная машина красный', 'Транспорт', 'racing-kit', 'raceCarRed', { targetHeight: 1.5 }), + m('racing-racecarwhite', 'Гоночная машина белый', 'Транспорт', 'racing-kit', 'raceCarWhite', { targetHeight: 1.5 }), + + // === Лодки === (43) + m('watercraft-boat-fan', 'Воздушная лодка', 'Лодки', 'watercraft-kit', 'boat-fan', { targetHeight: 1.8 }), + m('watercraft-boat-fishing-small', 'Маленькая рыболовная лодка', 'Лодки', 'watercraft-kit', 'boat-fishing-small', { targetHeight: 1.8 }), + m('watercraft-boat-house-a', 'Плавучий дом А', 'Лодки', 'watercraft-kit', 'boat-house-a', { targetHeight: 1.8 }), + m('watercraft-boat-house-b', 'Плавучий дом Б', 'Лодки', 'watercraft-kit', 'boat-house-b', { targetHeight: 1.8 }), + m('watercraft-boat-house-c', 'Плавучий дом В', 'Лодки', 'watercraft-kit', 'boat-house-c', { targetHeight: 1.8 }), + m('watercraft-boat-house-d', 'Плавучий дом Г', 'Лодки', 'watercraft-kit', 'boat-house-d', { targetHeight: 1.8 }), + m('watercraft-boat-row-large', 'Большая гребная лодка', 'Лодки', 'watercraft-kit', 'boat-row-large', { targetHeight: 1.8 }), + m('watercraft-boat-row-small', 'Маленькая гребная лодка', 'Лодки', 'watercraft-kit', 'boat-row-small', { targetHeight: 1.8 }), + m('watercraft-boat-sail-a', 'Парусник «Галеон»', 'Лодки', 'watercraft-kit', 'boat-sail-a', { targetHeight: 1.8 }), + m('watercraft-boat-sail-b', 'Парусник «Бриг»', 'Лодки', 'watercraft-kit', 'boat-sail-b', { targetHeight: 1.8 }), + m('watercraft-boat-speed-a', 'Скоростной катер «Молния»', 'Лодки', 'watercraft-kit', 'boat-speed-a', { targetHeight: 1.8 }), + m('watercraft-boat-speed-b', 'Скоростной катер «Шторм»', 'Лодки', 'watercraft-kit', 'boat-speed-b', { targetHeight: 1.8 }), + m('watercraft-boat-speed-c', 'Скоростной катер «Акула»', 'Лодки', 'watercraft-kit', 'boat-speed-c', { targetHeight: 1.8 }), + m('watercraft-boat-speed-d', 'Скоростной катер «Барракуда»', 'Лодки', 'watercraft-kit', 'boat-speed-d', { targetHeight: 1.8 }), + m('watercraft-boat-speed-e', 'Скоростной катер «Дельфин»', 'Лодки', 'watercraft-kit', 'boat-speed-e', { targetHeight: 1.8 }), + m('watercraft-boat-speed-f', 'Скоростной катер «Стрела»', 'Лодки', 'watercraft-kit', 'boat-speed-f', { targetHeight: 1.8 }), + m('watercraft-boat-speed-g', 'Скоростной катер «Орка»', 'Лодки', 'watercraft-kit', 'boat-speed-g', { targetHeight: 1.8 }), + m('watercraft-boat-speed-h', 'Скоростной катер «Кит»', 'Лодки', 'watercraft-kit', 'boat-speed-h', { targetHeight: 1.8 }), + m('watercraft-boat-speed-i', 'Скоростной катер «Парус»', 'Лодки', 'watercraft-kit', 'boat-speed-i', { targetHeight: 1.8 }), + m('watercraft-boat-speed-j', 'Скоростной катер «Нептун»', 'Лодки', 'watercraft-kit', 'boat-speed-j', { targetHeight: 1.8 }), + m('watercraft-boat-tow-a', 'Лодка tow a', 'Лодки', 'watercraft-kit', 'boat-tow-a', { targetHeight: 1.8 }), + m('watercraft-boat-tow-b', 'Лодка tow b', 'Лодки', 'watercraft-kit', 'boat-tow-b', { targetHeight: 1.8 }), + m('watercraft-boat-tug-a', 'Лодка tug a', 'Лодки', 'watercraft-kit', 'boat-tug-a', { targetHeight: 1.8 }), + m('watercraft-boat-tug-b', 'Лодка tug b', 'Лодки', 'watercraft-kit', 'boat-tug-b', { targetHeight: 1.8 }), + m('watercraft-boat-tug-c', 'Лодка tug c', 'Лодки', 'watercraft-kit', 'boat-tug-c', { targetHeight: 1.8 }), + m('watercraft-ship-cargo-a', 'Корабль грузовой a', 'Лодки', 'watercraft-kit', 'ship-cargo-a', { targetHeight: 4 }), + m('watercraft-ship-cargo-b', 'Корабль грузовой b', 'Лодки', 'watercraft-kit', 'ship-cargo-b', { targetHeight: 4 }), + m('watercraft-ship-cargo-c', 'Корабль грузовой c', 'Лодки', 'watercraft-kit', 'ship-cargo-c', { targetHeight: 4 }), + m('watercraft-ship-large', 'Корабль большой', 'Лодки', 'watercraft-kit', 'ship-large', { targetHeight: 4 }), + m('watercraft-ship-ocean-liner-small', 'Корабль ocean liner маленький', 'Лодки', 'watercraft-kit', 'ship-ocean-liner-small', { targetHeight: 4 }), + m('watercraft-ship-ocean-liner', 'Корабль ocean liner', 'Лодки', 'watercraft-kit', 'ship-ocean-liner', { targetHeight: 4 }), + m('watercraft-ship-small-ghost', 'Корабль маленький Призрак', 'Лодки', 'watercraft-kit', 'ship-small-ghost', { targetHeight: 4 }), + m('watercraft-ship-small', 'Корабль маленький', 'Лодки', 'watercraft-kit', 'ship-small', { targetHeight: 4 }), + m('pirate-boat-row-large', 'Большая гребная лодка', 'Лодки', 'pirate-kit', 'boat-row-large', { targetHeight: 1.8 }), + m('pirate-boat-row-small', 'Маленькая гребная лодка', 'Лодки', 'pirate-kit', 'boat-row-small', { targetHeight: 1.8 }), + m('pirate-ship-ghost', 'Корабль Призрак', 'Лодки', 'pirate-kit', 'ship-ghost', { targetHeight: 4 }), + m('pirate-ship-large', 'Корабль большой', 'Лодки', 'pirate-kit', 'ship-large', { targetHeight: 4 }), + m('pirate-ship-medium', 'Корабль средний', 'Лодки', 'pirate-kit', 'ship-medium', { targetHeight: 4 }), + m('pirate-ship-pirate-large', 'Пиратский корабль большой', 'Лодки', 'pirate-kit', 'ship-pirate-large', { targetHeight: 4 }), + m('pirate-ship-pirate-medium', 'Пиратский корабль средний', 'Лодки', 'pirate-kit', 'ship-pirate-medium', { targetHeight: 4 }), + m('pirate-ship-pirate-small', 'Пиратский корабль маленький', 'Лодки', 'pirate-kit', 'ship-pirate-small', { targetHeight: 4 }), + m('pirate-ship-small', 'Корабль маленький', 'Лодки', 'pirate-kit', 'ship-small', { targetHeight: 4 }), + m('pirate-ship-wreck', 'Корабль Обломок', 'Лодки', 'pirate-kit', 'ship-wreck', { targetHeight: 4 }), + + // === Sci-Fi === (50) + m('space-alien', 'Пришелец', 'Sci-Fi', 'space-kit', 'alien', { targetHeight: 1.7 }), + m('space-astronauta', 'Космонавт А', 'Sci-Fi', 'space-kit', 'astronautA', { targetHeight: 1.7 }), + m('space-astronautb', 'Космонавт Б', 'Sci-Fi', 'space-kit', 'astronautB', { targetHeight: 1.7 }), + m('space-barrel', 'Бочка', 'Sci-Fi', 'space-kit', 'barrel', { targetHeight: 1 }), + m('space-barrels', 'Бочки', 'Sci-Fi', 'space-kit', 'barrels', { targetHeight: 1 }), + m('space-barrels-rail', 'Бочки Рельс', 'Sci-Fi', 'space-kit', 'barrels_rail', { targetHeight: 1 }), + m('space-bones', 'Кости', 'Sci-Fi', 'space-kit', 'bones', { targetHeight: 2 }), + m('space-chimney', 'Дымоход', 'Sci-Fi', 'space-kit', 'chimney', { targetHeight: 2 }), + m('space-chimney-detailed', 'Дымоход детальный', 'Sci-Fi', 'space-kit', 'chimney_detailed', { targetHeight: 2 }), + m('space-corridor', 'Коридор', 'Sci-Fi', 'space-kit', 'corridor', { targetHeight: 2 }), + m('space-corridor-corner', 'Коридор угол', 'Sci-Fi', 'space-kit', 'corridor_corner', { targetHeight: 2 }), + m('space-corridor-cornerround', 'Коридор угол круглый', 'Sci-Fi', 'space-kit', 'corridor_cornerRound', { targetHeight: 2 }), + m('space-corridor-cornerroundwindow', 'Коридор угол круглый Окно', 'Sci-Fi', 'space-kit', 'corridor_cornerRoundWindow', { targetHeight: 2 }), + m('space-corridor-cross', 'Коридор крест', 'Sci-Fi', 'space-kit', 'corridor_cross', { targetHeight: 2 }), + m('space-corridor-detailed', 'Коридор детальный', 'Sci-Fi', 'space-kit', 'corridor_detailed', { targetHeight: 2 }), + m('space-corridor-end', 'Коридор конец', 'Sci-Fi', 'space-kit', 'corridor_end', { targetHeight: 2 }), + m('space-corridor-open', 'Коридор открытый', 'Sci-Fi', 'space-kit', 'corridor_open', { targetHeight: 2 }), + m('space-corridor-roof', 'Коридор Крыша', 'Sci-Fi', 'space-kit', 'corridor_roof', { targetHeight: 2 }), + m('space-corridor-split', 'Коридор split', 'Sci-Fi', 'space-kit', 'corridor_split', { targetHeight: 2 }), + m('space-corridor-wall', 'Коридор Стена', 'Sci-Fi', 'space-kit', 'corridor_wall', { targetHeight: 2 }), + m('space-corridor-wallcorner', 'Коридор Стена угол', 'Sci-Fi', 'space-kit', 'corridor_wallCorner', { targetHeight: 2 }), + m('space-corridor-window', 'Коридор Окно', 'Sci-Fi', 'space-kit', 'corridor_window', { targetHeight: 2 }), + m('space-corridor-windowclosed', 'Коридор Окно закрытый', 'Sci-Fi', 'space-kit', 'corridor_windowClosed', { targetHeight: 2 }), + m('space-craft-cargoa', 'Корабль грузовой A', 'Sci-Fi', 'space-kit', 'craft_cargoA', { targetHeight: 3 }), + m('space-craft-cargob', 'Корабль грузовой B', 'Sci-Fi', 'space-kit', 'craft_cargoB', { targetHeight: 3 }), + m('space-craft-miner', 'Рудный корабль', 'Sci-Fi', 'space-kit', 'craft_miner', { targetHeight: 3 }), + m('space-craft-racer', 'Гоночный корабль', 'Sci-Fi', 'space-kit', 'craft_racer', { targetHeight: 3 }), + m('space-craft-speedera', 'Корабль Спидер A', 'Sci-Fi', 'space-kit', 'craft_speederA', { targetHeight: 3 }), + m('space-craft-speederb', 'Корабль Спидер B', 'Sci-Fi', 'space-kit', 'craft_speederB', { targetHeight: 3 }), + m('space-craft-speederc', 'Корабль Спидер C', 'Sci-Fi', 'space-kit', 'craft_speederC', { targetHeight: 3 }), + m('space-craft-speederd', 'Корабль Спидер D', 'Sci-Fi', 'space-kit', 'craft_speederD', { targetHeight: 3 }), + m('space-crater', 'Кратер', 'Sci-Fi', 'space-kit', 'crater', { targetHeight: 2 }), + m('space-craterlarge', 'Кратер большой', 'Sci-Fi', 'space-kit', 'craterLarge', { targetHeight: 2 }), + m('space-desk-chair', 'Письменный стол Стул', 'Sci-Fi', 'space-kit', 'desk_chair', { targetHeight: 2 }), + m('space-desk-chairarms', 'Письменный стол Стул Arms', 'Sci-Fi', 'space-kit', 'desk_chairArms', { targetHeight: 2 }), + m('space-desk-chairstool', 'Письменный стол Стул Табурет', 'Sci-Fi', 'space-kit', 'desk_chairStool', { targetHeight: 2 }), + m('space-desk-computer', 'Письменный стол Компьютер', 'Sci-Fi', 'space-kit', 'desk_computer', { targetHeight: 2 }), + m('space-desk-computercorner', 'Письменный стол Компьютер угол', 'Sci-Fi', 'space-kit', 'desk_computerCorner', { targetHeight: 2 }), + m('space-desk-computerscreen', 'Письменный стол Компьютер Screen', 'Sci-Fi', 'space-kit', 'desk_computerScreen', { targetHeight: 2 }), + m('space-gate-complex', 'Ворота сложный', 'Sci-Fi', 'space-kit', 'gate_complex', { targetHeight: 2 }), + m('space-gate-simple', 'Ворота simple', 'Sci-Fi', 'space-kit', 'gate_simple', { targetHeight: 2 }), + m('space-hangar-largea', 'Ангар большой A', 'Sci-Fi', 'space-kit', 'hangar_largeA', { targetHeight: 5 }), + m('space-hangar-largeb', 'Ангар большой B', 'Sci-Fi', 'space-kit', 'hangar_largeB', { targetHeight: 5 }), + m('space-hangar-rounda', 'Ангар круглый A', 'Sci-Fi', 'space-kit', 'hangar_roundA', { targetHeight: 5 }), + m('space-hangar-roundb', 'Ангар круглый B', 'Sci-Fi', 'space-kit', 'hangar_roundB', { targetHeight: 5 }), + m('space-hangar-roundglass', 'Ангар круглый Стакан', 'Sci-Fi', 'space-kit', 'hangar_roundGlass', { targetHeight: 5 }), + m('space-hangar-smalla', 'Ангар маленький A', 'Sci-Fi', 'space-kit', 'hangar_smallA', { targetHeight: 5 }), + m('space-hangar-smallb', 'Ангар маленький B', 'Sci-Fi', 'space-kit', 'hangar_smallB', { targetHeight: 5 }), + m('space-machine-barrel', 'Машина Бочка', 'Sci-Fi', 'space-kit', 'machine_barrel', { targetHeight: 1 }), + m('space-machine-barrellarge', 'Машина Бочка большой', 'Sci-Fi', 'space-kit', 'machine_barrelLarge', { targetHeight: 1 }), + + // === Здания === (21) + m('city-suburban-building-type-a', 'Жёлтый дом', 'Здания', 'city-kit-suburban', 'building-type-a', { targetHeight: 8 }), + m('city-suburban-building-type-b', 'Особняк с гаражом', 'Здания', 'city-kit-suburban', 'building-type-b', { targetHeight: 8 }), + m('city-suburban-building-type-c', 'Дом с террасой', 'Здания', 'city-kit-suburban', 'building-type-c', { targetHeight: 8 }), + m('city-suburban-building-type-d', 'Двухэтажный коттедж', 'Здания', 'city-kit-suburban', 'building-type-d', { targetHeight: 8 }), + m('city-suburban-building-type-e', 'Дом с мансардой', 'Здания', 'city-kit-suburban', 'building-type-e', { targetHeight: 8 }), + m('city-suburban-building-type-f', 'Современный дом', 'Здания', 'city-kit-suburban', 'building-type-f', { targetHeight: 8 }), + m('city-suburban-building-type-g', 'Кирпичный дом', 'Здания', 'city-kit-suburban', 'building-type-g', { targetHeight: 8 }), + m('city-suburban-building-type-h', 'Бунгало', 'Здания', 'city-kit-suburban', 'building-type-h', { targetHeight: 8 }), + m('city-suburban-building-type-i', 'Викторианский дом', 'Здания', 'city-kit-suburban', 'building-type-i', { targetHeight: 8 }), + m('city-suburban-building-type-j', 'Угловой дом', 'Здания', 'city-kit-suburban', 'building-type-j', { targetHeight: 8 }), + m('city-suburban-building-type-k', 'Дом с балконом', 'Здания', 'city-kit-suburban', 'building-type-k', { targetHeight: 8 }), + m('city-suburban-building-type-l', 'Загородный дом', 'Здания', 'city-kit-suburban', 'building-type-l', { targetHeight: 8 }), + m('city-suburban-building-type-m', 'Дом с крыльцом', 'Здания', 'city-kit-suburban', 'building-type-m', { targetHeight: 8 }), + m('city-suburban-building-type-n', 'Дом с башенкой', 'Здания', 'city-kit-suburban', 'building-type-n', { targetHeight: 8 }), + m('city-suburban-building-type-o', 'Семейный дом', 'Здания', 'city-kit-suburban', 'building-type-o', { targetHeight: 8 }), + m('city-suburban-building-type-p', 'Дом-шале', 'Здания', 'city-kit-suburban', 'building-type-p', { targetHeight: 8 }), + m('city-suburban-building-type-q', 'Дом с эркером', 'Здания', 'city-kit-suburban', 'building-type-q', { targetHeight: 8 }), + m('city-suburban-building-type-r', 'Городской дом', 'Здания', 'city-kit-suburban', 'building-type-r', { targetHeight: 8 }), + m('city-suburban-building-type-s', 'Дом-куб', 'Здания', 'city-kit-suburban', 'building-type-s', { targetHeight: 8 }), + m('city-suburban-building-type-t', 'Просторный дом', 'Здания', 'city-kit-suburban', 'building-type-t', { targetHeight: 8 }), + m('city-suburban-building-type-u', 'Загородная вилла', 'Здания', 'city-kit-suburban', 'building-type-u', { targetHeight: 8 }), + + // === Дороги === (50) + m('city-roads-bridge-pillar-wide', 'Мост Широкая колонна', 'Дороги', 'city-kit-roads', 'bridge-pillar-wide'), + m('city-roads-bridge-pillar', 'Мост Колонна', 'Дороги', 'city-kit-roads', 'bridge-pillar'), + m('city-roads-construction-barrier', 'Стройка барьер', 'Дороги', 'city-kit-roads', 'construction-barrier'), + m('city-roads-construction-cone', 'Стройка Конус', 'Дороги', 'city-kit-roads', 'construction-cone'), + m('city-roads-construction-light', 'Стройка свет', 'Дороги', 'city-kit-roads', 'construction-light'), + m('city-roads-light-curved-cross', 'Свет поворот d крест', 'Дороги', 'city-kit-roads', 'light-curved-cross'), + m('city-roads-light-curved-double', 'Свет поворот d двойной', 'Дороги', 'city-kit-roads', 'light-curved-double'), + m('city-roads-light-curved', 'Свет поворот d', 'Дороги', 'city-kit-roads', 'light-curved'), + m('city-roads-light-square-cross', 'Свет квадратный крест', 'Дороги', 'city-kit-roads', 'light-square-cross'), + m('city-roads-light-square-double', 'Свет квадратный двойной', 'Дороги', 'city-kit-roads', 'light-square-double'), + m('city-roads-light-square', 'Свет квадратный', 'Дороги', 'city-kit-roads', 'light-square'), + m('city-roads-road-bend-barrier', 'Дорога b конец барьер', 'Дороги', 'city-kit-roads', 'road-bend-barrier'), + m('city-roads-road-bend-sidewalk', 'Дорога b конец Тротуар', 'Дороги', 'city-kit-roads', 'road-bend-sidewalk'), + m('city-roads-road-bend-square-barrier', 'Дорога b конец квадратный барьер', 'Дороги', 'city-kit-roads', 'road-bend-square-barrier'), + m('city-roads-road-bend-square', 'Дорога b конец квадратный', 'Дороги', 'city-kit-roads', 'road-bend-square'), + m('city-roads-road-bend', 'Дорога b конец', 'Дороги', 'city-kit-roads', 'road-bend'), + m('city-roads-road-bridge', 'Дорога Мост', 'Дороги', 'city-kit-roads', 'road-bridge'), + m('city-roads-road-crossing', 'Дорога Переход', 'Дороги', 'city-kit-roads', 'road-crossing'), + m('city-roads-road-crossroad-barrier', 'Дорога Перекрёсток барьер', 'Дороги', 'city-kit-roads', 'road-crossroad-barrier'), + m('city-roads-road-crossroad-line', 'Дорога Перекрёсток линия', 'Дороги', 'city-kit-roads', 'road-crossroad-line'), + m('city-roads-road-crossroad-path', 'Дорога Перекрёсток Тропа', 'Дороги', 'city-kit-roads', 'road-crossroad-path'), + m('city-roads-road-crossroad', 'Дорога Перекрёсток', 'Дороги', 'city-kit-roads', 'road-crossroad'), + m('city-roads-road-curve-barrier', 'Дорога Поворот барьер', 'Дороги', 'city-kit-roads', 'road-curve-barrier'), + m('city-roads-road-curve-intersection-barrier', 'Дорога Поворот Перекрёсток барьер', 'Дороги', 'city-kit-roads', 'road-curve-intersection-barrier'), + m('city-roads-road-curve-intersection', 'Дорога Поворот Перекрёсток', 'Дороги', 'city-kit-roads', 'road-curve-intersection'), + m('city-roads-road-curve-pavement', 'Дорога Поворот pavement', 'Дороги', 'city-kit-roads', 'road-curve-pavement'), + m('city-roads-road-curve', 'Дорога Поворот', 'Дороги', 'city-kit-roads', 'road-curve'), + m('city-roads-road-driveway-double-barrier', 'Дорога въезд двойной барьер', 'Дороги', 'city-kit-roads', 'road-driveway-double-barrier'), + m('city-roads-road-driveway-double', 'Дорога въезд двойной', 'Дороги', 'city-kit-roads', 'road-driveway-double'), + m('city-roads-road-driveway-single-barrier', 'Дорога въезд одинарный барьер', 'Дороги', 'city-kit-roads', 'road-driveway-single-barrier'), + m('city-roads-road-driveway-single', 'Дорога въезд одинарный', 'Дороги', 'city-kit-roads', 'road-driveway-single'), + m('city-roads-road-end-barrier', 'Дорога конец барьер', 'Дороги', 'city-kit-roads', 'road-end-barrier'), + m('city-roads-road-end-round-barrier', 'Дорога конец круглый барьер', 'Дороги', 'city-kit-roads', 'road-end-round-barrier'), + m('city-roads-road-end-round', 'Дорога конец круглый', 'Дороги', 'city-kit-roads', 'road-end-round'), + m('city-roads-road-end', 'Дорога конец', 'Дороги', 'city-kit-roads', 'road-end'), + m('city-roads-road-intersection-barrier', 'Дорога Перекрёсток барьер', 'Дороги', 'city-kit-roads', 'road-intersection-barrier'), + m('city-roads-road-intersection-line', 'Дорога Перекрёсток линия', 'Дороги', 'city-kit-roads', 'road-intersection-line'), + m('city-roads-road-intersection-path', 'Дорога Перекрёсток Тропа', 'Дороги', 'city-kit-roads', 'road-intersection-path'), + m('city-roads-road-intersection', 'Дорога Перекрёсток', 'Дороги', 'city-kit-roads', 'road-intersection'), + m('city-roads-road-roundabout-barrier', 'Дорога круговое движение барьер', 'Дороги', 'city-kit-roads', 'road-roundabout-barrier'), + m('city-roads-road-roundabout', 'Дорога круговое движение', 'Дороги', 'city-kit-roads', 'road-roundabout'), + m('city-roads-road-side-barrier', 'Дорога бок барьер', 'Дороги', 'city-kit-roads', 'road-side-barrier'), + m('city-roads-road-side-entry-barrier', 'Дорога бок вход барьер', 'Дороги', 'city-kit-roads', 'road-side-entry-barrier'), + m('city-roads-road-side-entry', 'Дорога бок вход', 'Дороги', 'city-kit-roads', 'road-side-entry'), + m('city-roads-road-side-exit-barrier', 'Дорога бок выход барьер', 'Дороги', 'city-kit-roads', 'road-side-exit-barrier'), + m('city-roads-road-side-exit', 'Дорога бок выход', 'Дороги', 'city-kit-roads', 'road-side-exit'), + m('city-roads-road-side', 'Дорога бок', 'Дороги', 'city-kit-roads', 'road-side'), + m('city-roads-road-slant-barrier', 'Дорога slant барьер', 'Дороги', 'city-kit-roads', 'road-slant-barrier'), + m('city-roads-road-slant-curve-barrier', 'Дорога slant Поворот барьер', 'Дороги', 'city-kit-roads', 'road-slant-curve-barrier'), + m('city-roads-road-slant-curve', 'Дорога slant Поворот', 'Дороги', 'city-kit-roads', 'road-slant-curve'), + + // === Замки === (50) + m('tower-defense-detail-crystal-large', 'Деталь Кристалл большой', 'Замки', 'tower-defense-kit', 'detail-crystal-large', { targetHeight: 0.8 }), + m('tower-defense-detail-crystal', 'Деталь Кристалл', 'Замки', 'tower-defense-kit', 'detail-crystal', { targetHeight: 0.8 }), + m('tower-defense-detail-dirt-large', 'Земля (декор) большой', 'Замки', 'tower-defense-kit', 'detail-dirt-large', { targetHeight: 1 }), + m('tower-defense-detail-dirt', 'Земля (декор)', 'Замки', 'tower-defense-kit', 'detail-dirt', { targetHeight: 1 }), + m('tower-defense-detail-rocks-large', 'Деталь Камни большой', 'Замки', 'tower-defense-kit', 'detail-rocks-large', { targetHeight: 1 }), + m('tower-defense-detail-rocks', 'Деталь Камни', 'Замки', 'tower-defense-kit', 'detail-rocks', { targetHeight: 1 }), + m('tower-defense-detail-tree-large', 'Деталь Большое дерево', 'Замки', 'tower-defense-kit', 'detail-tree-large', { targetHeight: 3 }), + m('tower-defense-detail-tree', 'Деталь Дерево', 'Замки', 'tower-defense-kit', 'detail-tree', { targetHeight: 3 }), + m('tower-defense-enemy-ufo-a-weapon', 'Враг НЛО a Оружие', 'Замки', 'tower-defense-kit', 'enemy-ufo-a-weapon', { targetHeight: 1.7 }), + m('tower-defense-enemy-ufo-a', 'Враг НЛО a', 'Замки', 'tower-defense-kit', 'enemy-ufo-a', { targetHeight: 1.7 }), + m('tower-defense-enemy-ufo-b-weapon', 'Враг НЛО b Оружие', 'Замки', 'tower-defense-kit', 'enemy-ufo-b-weapon', { targetHeight: 1.7 }), + m('tower-defense-enemy-ufo-b', 'Враг НЛО b', 'Замки', 'tower-defense-kit', 'enemy-ufo-b', { targetHeight: 1.7 }), + m('tower-defense-enemy-ufo-beam-burst', 'Враг НЛО beam burst', 'Замки', 'tower-defense-kit', 'enemy-ufo-beam-burst', { targetHeight: 1.7 }), + m('tower-defense-enemy-ufo-beam', 'Враг НЛО beam', 'Замки', 'tower-defense-kit', 'enemy-ufo-beam', { targetHeight: 1.7 }), + m('tower-defense-enemy-ufo-c-weapon', 'Враг НЛО c Оружие', 'Замки', 'tower-defense-kit', 'enemy-ufo-c-weapon', { targetHeight: 1.7 }), + m('tower-defense-enemy-ufo-c', 'Враг НЛО c', 'Замки', 'tower-defense-kit', 'enemy-ufo-c', { targetHeight: 1.7 }), + m('tower-defense-enemy-ufo-d-weapon', 'Враг НЛО d Оружие', 'Замки', 'tower-defense-kit', 'enemy-ufo-d-weapon', { targetHeight: 1.7 }), + m('tower-defense-enemy-ufo-d', 'Враг НЛО d', 'Замки', 'tower-defense-kit', 'enemy-ufo-d', { targetHeight: 1.7 }), + m('tower-defense-selection-a', 'Выделение А', 'Замки', 'tower-defense-kit', 'selection-a', { targetHeight: 0.2 }), + m('tower-defense-selection-b', 'Выделение Б', 'Замки', 'tower-defense-kit', 'selection-b', { targetHeight: 0.2 }), + m('tower-defense-snow-detail-crystal-large', 'Снег Деталь Кристалл большой', 'Замки', 'tower-defense-kit', 'snow-detail-crystal-large', { targetHeight: 0.8 }), + m('tower-defense-snow-detail-crystal', 'Снег Деталь Кристалл', 'Замки', 'tower-defense-kit', 'snow-detail-crystal', { targetHeight: 0.8 }), + m('tower-defense-snow-detail-dirt-large', 'Снег Земля (декор) большой', 'Замки', 'tower-defense-kit', 'snow-detail-dirt-large', { targetHeight: 1 }), + m('tower-defense-snow-detail-dirt', 'Снег Земля (декор)', 'Замки', 'tower-defense-kit', 'snow-detail-dirt', { targetHeight: 1 }), + m('tower-defense-snow-detail-rocks-large', 'Снег Деталь Камни большой', 'Замки', 'tower-defense-kit', 'snow-detail-rocks-large', { targetHeight: 1 }), + m('tower-defense-snow-detail-rocks', 'Снег Деталь Камни', 'Замки', 'tower-defense-kit', 'snow-detail-rocks', { targetHeight: 1 }), + m('tower-defense-snow-detail-tree-large', 'Снег Деталь Большое дерево', 'Замки', 'tower-defense-kit', 'snow-detail-tree-large', { targetHeight: 3 }), + m('tower-defense-snow-detail-tree', 'Снег Деталь Дерево', 'Замки', 'tower-defense-kit', 'snow-detail-tree', { targetHeight: 3 }), + m('tower-defense-snow-tile-bump', 'Снег Плитка кочка', 'Замки', 'tower-defense-kit', 'snow-tile-bump', { targetHeight: 0.4 }), + m('tower-defense-snow-tile-corner-inner', 'Снег Плитка угол внутр.', 'Замки', 'tower-defense-kit', 'snow-tile-corner-inner', { targetHeight: 0.4 }), + m('tower-defense-snow-tile-corner-large', 'Снег Плитка угол большой', 'Замки', 'tower-defense-kit', 'snow-tile-corner-large', { targetHeight: 0.4 }), + m('tower-defense-snow-tile-corner-outer', 'Снег Плитка угол внеш.', 'Замки', 'tower-defense-kit', 'snow-tile-corner-outer', { targetHeight: 0.4 }), + m('tower-defense-snow-tile-corner-round', 'Снег Плитка угол круглый', 'Замки', 'tower-defense-kit', 'snow-tile-corner-round', { targetHeight: 0.4 }), + m('tower-defense-snow-tile-corner-square', 'Снег Плитка угол квадратный', 'Замки', 'tower-defense-kit', 'snow-tile-corner-square', { targetHeight: 0.4 }), + m('tower-defense-snow-tile-crossing', 'Снег Плитка Переход', 'Замки', 'tower-defense-kit', 'snow-tile-crossing', { targetHeight: 0.4 }), + m('tower-defense-snow-tile-crystal', 'Снег Плитка Кристалл', 'Замки', 'tower-defense-kit', 'snow-tile-crystal', { targetHeight: 0.8 }), + m('tower-defense-snow-tile-dirt', 'Снег Плитка земли', 'Замки', 'tower-defense-kit', 'snow-tile-dirt', { targetHeight: 0.4 }), + m('tower-defense-snow-tile-end-round', 'Снег Плитка конец круглый', 'Замки', 'tower-defense-kit', 'snow-tile-end-round', { targetHeight: 0.4 }), + m('tower-defense-snow-tile-end', 'Снег Плитка конец', 'Замки', 'tower-defense-kit', 'snow-tile-end', { targetHeight: 0.4 }), + m('tower-defense-snow-tile-hill', 'Снег Плитка холм', 'Замки', 'tower-defense-kit', 'snow-tile-hill', { targetHeight: 0.4 }), + m('tower-defense-snow-tile-river-bridge', 'Снег Плитка river Мост', 'Замки', 'tower-defense-kit', 'snow-tile-river-bridge', { targetHeight: 0.4 }), + m('tower-defense-snow-tile-river-corner', 'Снег Плитка river угол', 'Замки', 'tower-defense-kit', 'snow-tile-river-corner', { targetHeight: 0.4 }), + m('tower-defense-snow-tile-river-slope-large', 'Снег Плитка river наклон большой', 'Замки', 'tower-defense-kit', 'snow-tile-river-slope-large', { targetHeight: 0.4 }), + m('tower-defense-snow-tile-river-slope', 'Снег Плитка river наклон', 'Замки', 'tower-defense-kit', 'snow-tile-river-slope', { targetHeight: 0.4 }), + m('tower-defense-snow-tile-river-straight', 'Снег Плитка river Прямой участок', 'Замки', 'tower-defense-kit', 'snow-tile-river-straight', { targetHeight: 0.4 }), + m('tower-defense-snow-tile-river-transition', 'Снег Плитка river transition', 'Замки', 'tower-defense-kit', 'snow-tile-river-transition', { targetHeight: 0.4 }), + m('tower-defense-snow-tile-river-waterfall', 'Снег Плитка river waterfall', 'Замки', 'tower-defense-kit', 'snow-tile-river-waterfall', { targetHeight: 0.4 }), + m('tower-defense-snow-tile-rock', 'Снег Плитка Камень', 'Замки', 'tower-defense-kit', 'snow-tile-rock', { targetHeight: 0.4 }), + m('tower-defense-snow-tile-slope', 'Снег Плитка наклон', 'Замки', 'tower-defense-kit', 'snow-tile-slope', { targetHeight: 0.4 }), + m('tower-defense-snow-tile-spawn-end-round', 'Снег Плитка spawn конец круглый', 'Замки', 'tower-defense-kit', 'snow-tile-spawn-end-round', { targetHeight: 0.4 }), + + // === Мебель === (50) + m('furniture-bathroomcabinet', 'Шкафчик ванной', 'Мебель', 'furniture-kit', 'bathroomCabinet', { targetHeight: 2.2 }), + m('furniture-bathroomcabinetdrawer', 'Тумба ванной с ящиком', 'Мебель', 'furniture-kit', 'bathroomCabinetDrawer', { targetHeight: 2.2 }), + m('furniture-bathroommirror', 'Ванная Зеркало', 'Мебель', 'furniture-kit', 'bathroomMirror', { targetHeight: 1 }), + m('furniture-bathroomsink', 'Ванная Раковина', 'Мебель', 'furniture-kit', 'bathroomSink', { targetHeight: 1.2 }), + m('furniture-bathroomsinksquare', 'Ванная Раковина квадратный', 'Мебель', 'furniture-kit', 'bathroomSinkSquare', { targetHeight: 1.2 }), + m('furniture-bathtub', 'Ванна', 'Мебель', 'furniture-kit', 'bathtub', { targetHeight: 1.2 }), + m('furniture-bear', 'Медведь', 'Мебель', 'furniture-kit', 'bear', { targetHeight: 1.2 }), + m('furniture-bedbunk', 'Кровать Bunk', 'Мебель', 'furniture-kit', 'bedBunk', { targetHeight: 1 }), + m('furniture-beddouble', 'Кровать двуспальная', 'Мебель', 'furniture-kit', 'bedDouble', { targetHeight: 1 }), + m('furniture-bedsingle', 'Кровать односпальная', 'Мебель', 'furniture-kit', 'bedSingle', { targetHeight: 1 }), + m('furniture-bench', 'Скамейка', 'Мебель', 'furniture-kit', 'bench', { targetHeight: 1.2 }), + m('furniture-benchcushion', 'Скамейка подушка', 'Мебель', 'furniture-kit', 'benchCushion', { targetHeight: 1.2 }), + m('furniture-benchcushionlow', 'Скамейка подушка низкий', 'Мебель', 'furniture-kit', 'benchCushionLow', { targetHeight: 1.2 }), + m('furniture-bookcaseclosed', 'Книжный шкаф закрытый', 'Мебель', 'furniture-kit', 'bookcaseClosed', { targetHeight: 2.2 }), + m('furniture-bookcasecloseddoors', 'Книжный шкаф закрытый Doors', 'Мебель', 'furniture-kit', 'bookcaseClosedDoors', { targetHeight: 2.2 }), + m('furniture-bookcaseclosedwide', 'Книжный шкаф закрытый широкий', 'Мебель', 'furniture-kit', 'bookcaseClosedWide', { targetHeight: 2.2 }), + m('furniture-bookcaseopen', 'Книжный шкаф открытый', 'Мебель', 'furniture-kit', 'bookcaseOpen', { targetHeight: 2.2 }), + m('furniture-bookcaseopenlow', 'Книжный шкаф открытый низкий', 'Мебель', 'furniture-kit', 'bookcaseOpenLow', { targetHeight: 2.2 }), + m('furniture-books', 'Книги', 'Мебель', 'furniture-kit', 'books', { targetHeight: 1.2 }), + m('furniture-cabinetbed', 'Шкафчик Кровать', 'Мебель', 'furniture-kit', 'cabinetBed', { targetHeight: 2.2 }), + m('furniture-cabinetbeddrawer', 'Шкафчик Кровать ящик', 'Мебель', 'furniture-kit', 'cabinetBedDrawer', { targetHeight: 2.2 }), + m('furniture-cabinetbeddrawertable', 'Шкафчик Кровать ящик Стол', 'Мебель', 'furniture-kit', 'cabinetBedDrawerTable', { targetHeight: 2.2 }), + m('furniture-cabinettelevision', 'Шкафчик Телевизор', 'Мебель', 'furniture-kit', 'cabinetTelevision', { targetHeight: 0.8 }), + m('furniture-cabinettelevisiondoors', 'Шкафчик Телевизор Doors', 'Мебель', 'furniture-kit', 'cabinetTelevisionDoors', { targetHeight: 0.8 }), + m('furniture-cardboardboxclosed', 'Картон Коробка закрытый', 'Мебель', 'furniture-kit', 'cardboardBoxClosed', { targetHeight: 1.2 }), + m('furniture-cardboardboxopen', 'Картон Коробка открытый', 'Мебель', 'furniture-kit', 'cardboardBoxOpen', { targetHeight: 1.2 }), + m('furniture-ceilingfan', 'Потолок вентилятор', 'Мебель', 'furniture-kit', 'ceilingFan', { targetHeight: 1.2 }), + m('furniture-chair', 'Стул', 'Мебель', 'furniture-kit', 'chair', { targetHeight: 1.2 }), + m('furniture-chaircushion', 'Стул подушка', 'Мебель', 'furniture-kit', 'chairCushion', { targetHeight: 1.2 }), + m('furniture-chairdesk', 'Стул Письменный стол', 'Мебель', 'furniture-kit', 'chairDesk', { targetHeight: 1.2 }), + m('furniture-chairmoderncushion', 'Стул современный подушка', 'Мебель', 'furniture-kit', 'chairModernCushion', { targetHeight: 1.2 }), + m('furniture-chairmodernframecushion', 'Стул современный Рамка подушка', 'Мебель', 'furniture-kit', 'chairModernFrameCushion', { targetHeight: 1.2 }), + m('furniture-chairrounded', 'Стул Rounded', 'Мебель', 'furniture-kit', 'chairRounded', { targetHeight: 1.2 }), + m('furniture-coatrack', 'Пальто стойка', 'Мебель', 'furniture-kit', 'coatRack', { targetHeight: 1.2 }), + m('furniture-coatrackstanding', 'Пальто стойка Standing', 'Мебель', 'furniture-kit', 'coatRackStanding', { targetHeight: 1.2 }), + m('furniture-computerkeyboard', 'Компьютер Keyboard', 'Мебель', 'furniture-kit', 'computerKeyboard', { targetHeight: 0.8 }), + m('furniture-computermouse', 'Компьютер Mouse', 'Мебель', 'furniture-kit', 'computerMouse', { targetHeight: 0.8 }), + m('furniture-computerscreen', 'Компьютер Screen', 'Мебель', 'furniture-kit', 'computerScreen', { targetHeight: 0.8 }), + m('furniture-desk', 'Письменный стол', 'Мебель', 'furniture-kit', 'desk', { targetHeight: 1.2 }), + m('furniture-deskcorner', 'Письменный стол угол', 'Мебель', 'furniture-kit', 'deskCorner', { targetHeight: 1.2 }), + m('furniture-doorway', 'Проём', 'Мебель', 'furniture-kit', 'doorway', { targetHeight: 1.2 }), + m('furniture-doorwayfront', 'Проём перед', 'Мебель', 'furniture-kit', 'doorwayFront', { targetHeight: 1.2 }), + m('furniture-doorwayopen', 'Проём открытый', 'Мебель', 'furniture-kit', 'doorwayOpen', { targetHeight: 1.2 }), + m('furniture-dryer', 'Сушилка', 'Мебель', 'furniture-kit', 'dryer', { targetHeight: 1.2 }), + m('furniture-floorcorner', 'Пол угол', 'Мебель', 'furniture-kit', 'floorCorner', { targetHeight: 1.2 }), + m('furniture-floorcornerround', 'Пол угол круглый', 'Мебель', 'furniture-kit', 'floorCornerRound', { targetHeight: 1.2 }), + m('furniture-floorfull', 'Пол полный', 'Мебель', 'furniture-kit', 'floorFull', { targetHeight: 1.2 }), + m('furniture-floorhalf', 'Пол половина', 'Мебель', 'furniture-kit', 'floorHalf', { targetHeight: 1.2 }), + m('furniture-hoodlarge', 'Hood большой', 'Мебель', 'furniture-kit', 'hoodLarge', { targetHeight: 1.2 }), + m('furniture-hoodmodern', 'Hood современный', 'Мебель', 'furniture-kit', 'hoodModern', { targetHeight: 1.2 }), + + // === Еда === (50) + m('food-advocado-half', 'Авокадо (половинка)', 'Еда', 'food-kit', 'advocado-half', { targetHeight: 0.5 }), + m('food-apple-half', 'Яблоко (половинка)', 'Еда', 'food-kit', 'apple-half', { targetHeight: 0.4 }), + m('food-apple', 'Яблоко', 'Еда', 'food-kit', 'apple', { targetHeight: 0.4 }), + m('food-avocado', 'Авокадо', 'Еда', 'food-kit', 'avocado', { targetHeight: 0.5 }), + m('food-bacon-raw', 'Сырой бекон', 'Еда', 'food-kit', 'bacon-raw', { targetHeight: 0.5 }), + m('food-bacon', 'Бекон', 'Еда', 'food-kit', 'bacon', { targetHeight: 0.5 }), + m('food-bag-flat', 'Пакет плоский', 'Еда', 'food-kit', 'bag-flat', { targetHeight: 0.5 }), + m('food-bag', 'Пакет', 'Еда', 'food-kit', 'bag', { targetHeight: 0.5 }), + m('food-banana', 'Банан', 'Еда', 'food-kit', 'banana', { targetHeight: 0.4 }), + m('food-barrel', 'Бочка', 'Еда', 'food-kit', 'barrel', { targetHeight: 0.5 }), + m('food-beet', 'Свёкла', 'Еда', 'food-kit', 'beet', { targetHeight: 0.4 }), + m('food-bottle-ketchup', 'Кетчуп', 'Еда', 'food-kit', 'bottle-ketchup', { targetHeight: 0.7 }), + m('food-bottle-musterd', 'Горчица', 'Еда', 'food-kit', 'bottle-musterd', { targetHeight: 0.7 }), + m('food-bottle-oil', 'Масло', 'Еда', 'food-kit', 'bottle-oil', { targetHeight: 0.7 }), + m('food-bowl-broth', 'Тарелка с бульоном', 'Еда', 'food-kit', 'bowl-broth', { targetHeight: 0.3 }), + m('food-bowl-cereal', 'Тарелка с хлопьями', 'Еда', 'food-kit', 'bowl-cereal', { targetHeight: 0.3 }), + m('food-bowl-soup', 'Миска Суп', 'Еда', 'food-kit', 'bowl-soup', { targetHeight: 0.3 }), + m('food-bowl', 'Миска', 'Еда', 'food-kit', 'bowl', { targetHeight: 0.3 }), + m('food-bread', 'Хлеб', 'Еда', 'food-kit', 'bread', { targetHeight: 0.5 }), + m('food-broccoli', 'Брокколи', 'Еда', 'food-kit', 'broccoli', { targetHeight: 0.5 }), + m('food-burger-cheese-double', 'Бургер Сыр двойной', 'Еда', 'food-kit', 'burger-cheese-double', { targetHeight: 0.5 }), + m('food-burger-cheese', 'Бургер Сыр', 'Еда', 'food-kit', 'burger-cheese', { targetHeight: 0.5 }), + m('food-burger-double', 'Бургер двойной', 'Еда', 'food-kit', 'burger-double', { targetHeight: 0.5 }), + m('food-burger', 'Бургер', 'Еда', 'food-kit', 'burger', { targetHeight: 0.5 }), + m('food-cabbage', 'Капуста', 'Еда', 'food-kit', 'cabbage', { targetHeight: 0.5 }), + m('food-cake-birthday', 'Торт день рождения', 'Еда', 'food-kit', 'cake-birthday', { targetHeight: 0.7 }), + m('food-cake-slicer', 'Торт кусок', 'Еда', 'food-kit', 'cake-slicer', { targetHeight: 0.7 }), + m('food-cake', 'Торт', 'Еда', 'food-kit', 'cake', { targetHeight: 0.7 }), + m('food-can-open', 'Банка открытый', 'Еда', 'food-kit', 'can-open', { targetHeight: 0.5 }), + m('food-can-small', 'Банка маленький', 'Еда', 'food-kit', 'can-small', { targetHeight: 0.5 }), + m('food-can', 'Банка', 'Еда', 'food-kit', 'can', { targetHeight: 0.5 }), + m('food-candy-bar-wrapper', 'Конфета батончик обёртка', 'Еда', 'food-kit', 'candy-bar-wrapper', { targetHeight: 0.5 }), + m('food-candy-bar', 'Конфета батончик', 'Еда', 'food-kit', 'candy-bar', { targetHeight: 0.5 }), + m('food-carrot', 'Морковь', 'Еда', 'food-kit', 'carrot', { targetHeight: 0.4 }), + m('food-carton-small', 'Пакет маленький', 'Еда', 'food-kit', 'carton-small', { targetHeight: 0.5 }), + m('food-carton', 'Пакет', 'Еда', 'food-kit', 'carton', { targetHeight: 0.5 }), + m('food-cauliflower', 'Цветная капуста', 'Еда', 'food-kit', 'cauliflower', { targetHeight: 0.5 }), + m('food-celery-stick', 'Сельдерей Палка', 'Еда', 'food-kit', 'celery-stick', { targetHeight: 0.5 }), + m('food-cheese-cut', 'Сыр cut', 'Еда', 'food-kit', 'cheese-cut', { targetHeight: 0.5 }), + m('food-cheese-slicer', 'Сыр кусок', 'Еда', 'food-kit', 'cheese-slicer', { targetHeight: 0.5 }), + m('food-cheese', 'Сыр', 'Еда', 'food-kit', 'cheese', { targetHeight: 0.5 }), + m('food-cherries', 'Черешня', 'Еда', 'food-kit', 'cherries', { targetHeight: 0.5 }), + m('food-chinese', 'Chinese', 'Еда', 'food-kit', 'chinese', { targetHeight: 0.5 }), + m('food-chocolate-wrapper', 'Шоколад обёртка', 'Еда', 'food-kit', 'chocolate-wrapper', { targetHeight: 0.5 }), + m('food-chocolate', 'Шоколад', 'Еда', 'food-kit', 'chocolate', { targetHeight: 0.5 }), + m('food-chopstic-decorative', 'Chopstic декоративный', 'Еда', 'food-kit', 'chopstic-decorative', { targetHeight: 0.5 }), + m('food-chopstick', 'Палочка', 'Еда', 'food-kit', 'chopstick', { targetHeight: 0.5 }), + m('food-cocktail', 'Коктейль', 'Еда', 'food-kit', 'cocktail', { targetHeight: 0.5 }), + m('food-coconut-half', 'Половинка кокоса', 'Еда', 'food-kit', 'coconut-half', { targetHeight: 0.5 }), + m('food-coconut', 'Кокос', 'Еда', 'food-kit', 'coconut', { targetHeight: 0.5 }), + + // === Оружие === (40) + m('blaster-blaster-a', 'Бластер a', 'Оружие', 'blaster-kit', 'blaster-a', { targetHeight: 1.2 }), + m('blaster-blaster-b', 'Бластер b', 'Оружие', 'blaster-kit', 'blaster-b', { targetHeight: 1.2 }), + m('blaster-blaster-c', 'Бластер c', 'Оружие', 'blaster-kit', 'blaster-c', { targetHeight: 1.2 }), + m('blaster-blaster-d', 'Бластер d', 'Оружие', 'blaster-kit', 'blaster-d', { targetHeight: 1.2 }), + m('blaster-blaster-e', 'Бластер e', 'Оружие', 'blaster-kit', 'blaster-e', { targetHeight: 1.2 }), + m('blaster-blaster-f', 'Бластер f', 'Оружие', 'blaster-kit', 'blaster-f', { targetHeight: 1.2 }), + m('blaster-blaster-g', 'Бластер g', 'Оружие', 'blaster-kit', 'blaster-g', { targetHeight: 1.2 }), + m('blaster-blaster-h', 'Бластер h', 'Оружие', 'blaster-kit', 'blaster-h', { targetHeight: 1.2 }), + m('blaster-blaster-i', 'Бластер i', 'Оружие', 'blaster-kit', 'blaster-i', { targetHeight: 1.2 }), + m('blaster-blaster-j', 'Бластер j', 'Оружие', 'blaster-kit', 'blaster-j', { targetHeight: 1.2 }), + m('blaster-blaster-k', 'Бластер k', 'Оружие', 'blaster-kit', 'blaster-k', { targetHeight: 1.2 }), + m('blaster-blaster-l', 'Бластер l', 'Оружие', 'blaster-kit', 'blaster-l', { targetHeight: 1.2 }), + m('blaster-blaster-m', 'Бластер m', 'Оружие', 'blaster-kit', 'blaster-m', { targetHeight: 1.2 }), + m('blaster-blaster-n', 'Бластер n', 'Оружие', 'blaster-kit', 'blaster-n', { targetHeight: 1.2 }), + m('blaster-blaster-o', 'Бластер o', 'Оружие', 'blaster-kit', 'blaster-o', { targetHeight: 1.2 }), + m('blaster-blaster-p', 'Бластер p', 'Оружие', 'blaster-kit', 'blaster-p', { targetHeight: 1.2 }), + m('blaster-blaster-q', 'Бластер q', 'Оружие', 'blaster-kit', 'blaster-q', { targetHeight: 1.2 }), + m('blaster-blaster-r', 'Бластер r', 'Оружие', 'blaster-kit', 'blaster-r', { targetHeight: 1.2 }), + m('blaster-bullet-foam-thick', 'Толстая пенопл. пуля', 'Оружие', 'blaster-kit', 'bullet-foam-thick', { targetHeight: 0.4 }), + m('blaster-bullet-foam-tip-thick', 'Толстая пенопл. пуля с наконеч.', 'Оружие', 'blaster-kit', 'bullet-foam-tip-thick', { targetHeight: 0.4 }), + m('blaster-bullet-foam-tip', 'Пенопл. пуля с наконеч.', 'Оружие', 'blaster-kit', 'bullet-foam-tip', { targetHeight: 0.4 }), + m('blaster-bullet-foam', 'Пенопл. пуля', 'Оружие', 'blaster-kit', 'bullet-foam', { targetHeight: 0.4 }), + m('blaster-clip-large', 'Скрепка большой', 'Оружие', 'blaster-kit', 'clip-large', { targetHeight: 1 }), + m('blaster-clip-small', 'Скрепка маленький', 'Оружие', 'blaster-kit', 'clip-small', { targetHeight: 1 }), + m('blaster-crate-medium', 'Ящик средний', 'Оружие', 'blaster-kit', 'crate-medium', { targetHeight: 1 }), + m('blaster-crate-small', 'Ящик маленький', 'Оружие', 'blaster-kit', 'crate-small', { targetHeight: 1 }), + m('blaster-crate-wide', 'Ящик широкий', 'Оружие', 'blaster-kit', 'crate-wide', { targetHeight: 1 }), + m('blaster-grenade-a', 'Граната a', 'Оружие', 'blaster-kit', 'grenade-a', { targetHeight: 0.6 }), + m('blaster-grenade-b', 'Граната b', 'Оружие', 'blaster-kit', 'grenade-b', { targetHeight: 0.6 }), + m('blaster-scope-large-a', 'Scope большой a', 'Оружие', 'blaster-kit', 'scope-large-a', { targetHeight: 1 }), + m('blaster-scope-large-b', 'Scope большой b', 'Оружие', 'blaster-kit', 'scope-large-b', { targetHeight: 1 }), + m('blaster-scope-small', 'Scope маленький', 'Оружие', 'blaster-kit', 'scope-small', { targetHeight: 1 }), + m('blaster-silencer-larger', 'Silencer larger', 'Оружие', 'blaster-kit', 'silencer-larger', { targetHeight: 1 }), + m('blaster-silencer-small', 'Silencer маленький', 'Оружие', 'blaster-kit', 'silencer-small', { targetHeight: 1 }), + m('blaster-smoke', 'Дым', 'Оружие', 'blaster-kit', 'smoke', { targetHeight: 1 }), + m('blaster-target-detail', 'Мишень Деталь', 'Оружие', 'blaster-kit', 'target-detail', { targetHeight: 1 }), + m('blaster-target-fragment-large', 'Мишень фрагмент большой', 'Оружие', 'blaster-kit', 'target-fragment-large', { targetHeight: 1 }), + m('blaster-target-fragment-small', 'Мишень фрагмент маленький', 'Оружие', 'blaster-kit', 'target-fragment-small', { targetHeight: 1 }), + m('blaster-target-large', 'Мишень большой', 'Оружие', 'blaster-kit', 'target-large', { targetHeight: 1 }), + m('blaster-target-small', 'Мишень маленький', 'Оружие', 'blaster-kit', 'target-small', { targetHeight: 1 }), + + // === Праздники === (50) + m('holiday-bench-short', 'Скамейка короткий', 'Праздники', 'holiday-kit', 'bench-short', { targetHeight: 1.5 }), + m('holiday-bench', 'Скамейка', 'Праздники', 'holiday-kit', 'bench', { targetHeight: 1.5 }), + m('holiday-cabin-corner-bottom', 'Хижина угол низ', 'Праздники', 'holiday-kit', 'cabin-corner-bottom', { targetHeight: 5 }), + m('holiday-cabin-corner-logs', 'Хижина угол брёвна', 'Праздники', 'holiday-kit', 'cabin-corner-logs', { targetHeight: 5 }), + m('holiday-cabin-corner', 'Хижина угол', 'Праздники', 'holiday-kit', 'cabin-corner', { targetHeight: 5 }), + m('holiday-cabin-door-rotate', 'Хижина Дверь', 'Праздники', 'holiday-kit', 'cabin-door-rotate', { targetHeight: 5 }), + m('holiday-cabin-doorway-center', 'Хижина проём центр', 'Праздники', 'holiday-kit', 'cabin-doorway-center', { targetHeight: 5 }), + m('holiday-cabin-doorway-left', 'Хижина проём лев.', 'Праздники', 'holiday-kit', 'cabin-doorway-left', { targetHeight: 5 }), + m('holiday-cabin-doorway-right', 'Хижина проём прав.', 'Праздники', 'holiday-kit', 'cabin-doorway-right', { targetHeight: 5 }), + m('holiday-cabin-doorway', 'Хижина проём', 'Праздники', 'holiday-kit', 'cabin-doorway', { targetHeight: 5 }), + m('holiday-cabin-fence', 'Хижина Забор', 'Праздники', 'holiday-kit', 'cabin-fence', { targetHeight: 5 }), + m('holiday-cabin-overhang-door-rotate', 'Хижина с навесом Дверь', 'Праздники', 'holiday-kit', 'cabin-overhang-door-rotate', { targetHeight: 5 }), + m('holiday-cabin-overhang-doorway', 'Хижина с навесом проём', 'Праздники', 'holiday-kit', 'cabin-overhang-doorway', { targetHeight: 5 }), + m('holiday-cabin-roof-chimney', 'Хижина Крыша Дымоход', 'Праздники', 'holiday-kit', 'cabin-roof-chimney', { targetHeight: 5 }), + m('holiday-cabin-roof-corner', 'Хижина Крыша угол', 'Праздники', 'holiday-kit', 'cabin-roof-corner', { targetHeight: 5 }), + m('holiday-cabin-roof-dormer', 'Хижина Крыша мансарда', 'Праздники', 'holiday-kit', 'cabin-roof-dormer', { targetHeight: 5 }), + m('holiday-cabin-roof-point', 'Хижина Крыша остриё', 'Праздники', 'holiday-kit', 'cabin-roof-point', { targetHeight: 5 }), + m('holiday-cabin-roof-snow-chimney', 'Хижина Крыша Снег Дымоход', 'Праздники', 'holiday-kit', 'cabin-roof-snow-chimney', { targetHeight: 5 }), + m('holiday-cabin-roof-snow-corner', 'Хижина Крыша Снег угол', 'Праздники', 'holiday-kit', 'cabin-roof-snow-corner', { targetHeight: 5 }), + m('holiday-cabin-roof-snow-dormer', 'Хижина Крыша Снег мансарда', 'Праздники', 'holiday-kit', 'cabin-roof-snow-dormer', { targetHeight: 5 }), + m('holiday-cabin-roof-snow-point', 'Хижина Крыша Снег остриё', 'Праздники', 'holiday-kit', 'cabin-roof-snow-point', { targetHeight: 5 }), + m('holiday-cabin-roof-snow', 'Хижина Крыша Снег', 'Праздники', 'holiday-kit', 'cabin-roof-snow', { targetHeight: 5 }), + m('holiday-cabin-roof-top', 'Хижина Крыша верх', 'Праздники', 'holiday-kit', 'cabin-roof-top', { targetHeight: 5 }), + m('holiday-cabin-roof', 'Хижина Крыша', 'Праздники', 'holiday-kit', 'cabin-roof', { targetHeight: 5 }), + m('holiday-cabin-wall-low', 'Хижина Стена низкий', 'Праздники', 'holiday-kit', 'cabin-wall-low', { targetHeight: 5 }), + m('holiday-cabin-wall-roof-center', 'Хижина Стена Крыша центр', 'Праздники', 'holiday-kit', 'cabin-wall-roof-center', { targetHeight: 5 }), + m('holiday-cabin-wall-roof', 'Хижина Стена Крыша', 'Праздники', 'holiday-kit', 'cabin-wall-roof', { targetHeight: 5 }), + m('holiday-cabin-wall-wreath', 'Хижина Стена венок', 'Праздники', 'holiday-kit', 'cabin-wall-wreath', { targetHeight: 5 }), + m('holiday-cabin-wall', 'Хижина Стена', 'Праздники', 'holiday-kit', 'cabin-wall', { targetHeight: 5 }), + m('holiday-cabin-window-a', 'Хижина Окно a', 'Праздники', 'holiday-kit', 'cabin-window-a', { targetHeight: 5 }), + m('holiday-cabin-window-b', 'Хижина Окно b', 'Праздники', 'holiday-kit', 'cabin-window-b', { targetHeight: 5 }), + m('holiday-cabin-window-c', 'Хижина Окно c', 'Праздники', 'holiday-kit', 'cabin-window-c', { targetHeight: 5 }), + m('holiday-cabin-window-large', 'Хижина Окно большой', 'Праздники', 'holiday-kit', 'cabin-window-large', { targetHeight: 5 }), + m('holiday-candy-cane-green', 'Конфета cane зелёный', 'Праздники', 'holiday-kit', 'candy-cane-green', { targetHeight: 1.5 }), + m('holiday-candy-cane-red', 'Конфета cane красный', 'Праздники', 'holiday-kit', 'candy-cane-red', { targetHeight: 1.5 }), + m('holiday-festivus-pole', 'Festivus pole', 'Праздники', 'holiday-kit', 'festivus-pole', { targetHeight: 1.5 }), + m('holiday-floor-stone', 'Пол Камень', 'Праздники', 'holiday-kit', 'floor-stone', { targetHeight: 1.5 }), + m('holiday-floor-wood-snow', 'Пол дерево Снег', 'Праздники', 'holiday-kit', 'floor-wood-snow', { targetHeight: 0.8 }), + m('holiday-floor-wood', 'Пол дерево', 'Праздники', 'holiday-kit', 'floor-wood', { targetHeight: 1.5 }), + m('holiday-gingerbread-man', 'Имбирный пряник man', 'Праздники', 'holiday-kit', 'gingerbread-man', { targetHeight: 1.5 }), + m('holiday-gingerbread-woman', 'Имбирный пряник woman', 'Праздники', 'holiday-kit', 'gingerbread-woman', { targetHeight: 1.5 }), + m('holiday-hanukkah-dreidel', 'Ханука дрейдл', 'Праздники', 'holiday-kit', 'hanukkah-dreidel', { targetHeight: 1.5 }), + m('holiday-hanukkah-menorah-candles', 'Ханука менора candles', 'Праздники', 'holiday-kit', 'hanukkah-menorah-candles', { targetHeight: 0.6 }), + m('holiday-hanukkah-menorah', 'Ханука менора', 'Праздники', 'holiday-kit', 'hanukkah-menorah', { targetHeight: 1.5 }), + m('holiday-kwanzaa-kikombe', 'Kwanzaa kikombe', 'Праздники', 'holiday-kit', 'kwanzaa-kikombe', { targetHeight: 1.5 }), + m('holiday-kwanzaa-kinara-alternative', 'Kwanzaa kinara alternative', 'Праздники', 'holiday-kit', 'kwanzaa-kinara-alternative', { targetHeight: 1.5 }), + m('holiday-kwanzaa-kinara', 'Kwanzaa kinara', 'Праздники', 'holiday-kit', 'kwanzaa-kinara', { targetHeight: 1.5 }), + m('holiday-lantern-hanging', 'Фонарь подвесной', 'Праздники', 'holiday-kit', 'lantern-hanging', { targetHeight: 1.5 }), + m('holiday-lantern', 'Фонарь', 'Праздники', 'holiday-kit', 'lantern', { targetHeight: 1.5 }), + m('holiday-lights-colored', 'Свет цветной', 'Праздники', 'holiday-kit', 'lights-colored', { targetHeight: 1.5 }), + + // === Поезд === (модели holiday-kit: локомотив, вагоны, рельсы. + // GLB-файлы уже в kubikon-assets/models/holiday-kit/ — регистрируем + // в каталоге, чтобы можно было ставить на сцену и в раннер-играх). + m('train-locomotive', 'Поезд: локомотив', 'Поезд', 'holiday-kit', 'train-locomotive', { targetHeight: 3 }), + m('train-tender', 'Поезд: тендер', 'Поезд', 'holiday-kit', 'train-tender', { targetHeight: 3 }), + m('train-wagon', 'Поезд: вагон', 'Поезд', 'holiday-kit', 'train-wagon', { targetHeight: 3 }), + m('train-wagon-short', 'Поезд: вагон короткий', 'Поезд', 'holiday-kit', 'train-wagon-short', { targetHeight: 3 }), + m('train-wagon-flat', 'Поезд: платформа', 'Поезд', 'holiday-kit', 'train-wagon-flat', { targetHeight: 2 }), + m('train-wagon-flat-short', 'Поезд: платформа короткая', 'Поезд', 'holiday-kit', 'train-wagon-flat-short', { targetHeight: 2 }), + m('train-wagon-logs', 'Поезд: вагон с брёвнами', 'Поезд', 'holiday-kit', 'train-wagon-logs', { targetHeight: 3 }), + m('trainset-rail-straight', 'Рельсы прямые', 'Поезд', 'holiday-kit', 'trainset-rail-straight', { targetHeight: 0.4 }), + m('trainset-rail-detailed-straight', 'Рельсы прямые детальные', 'Поезд', 'holiday-kit', 'trainset-rail-detailed-straight', { targetHeight: 0.4 }), + m('trainset-rail-bend', 'Рельсы поворот', 'Поезд', 'holiday-kit', 'trainset-rail-bend', { targetHeight: 0.4 }), + m('trainset-rail-corner', 'Рельсы угол', 'Поезд', 'holiday-kit', 'trainset-rail-corner', { targetHeight: 0.4 }), + + // === Выживание === (50) + m('survival-barrel-open', 'Бочка открытый', 'Выживание', 'survival-kit', 'barrel-open', { targetHeight: 1 }), + m('survival-barrel', 'Бочка', 'Выживание', 'survival-kit', 'barrel', { targetHeight: 1 }), + m('survival-bedroll-frame', 'Спальник рама', 'Выживание', 'survival-kit', 'bedroll-frame', { targetHeight: 1 }), + m('survival-bedroll-packed', 'Свёрнутый коврик', 'Выживание', 'survival-kit', 'bedroll-packed', { targetHeight: 1 }), + m('survival-bedroll', 'Спальник', 'Выживание', 'survival-kit', 'bedroll', { targetHeight: 1 }), + m('survival-bottle-large', 'Бутылка большой', 'Выживание', 'survival-kit', 'bottle-large', { targetHeight: 1 }), + m('survival-bottle', 'Бутылка', 'Выживание', 'survival-kit', 'bottle', { targetHeight: 1 }), + m('survival-box-large-open', 'Коробка большой открытый', 'Выживание', 'survival-kit', 'box-large-open', { targetHeight: 0.8 }), + m('survival-box-large', 'Коробка большой', 'Выживание', 'survival-kit', 'box-large', { targetHeight: 0.8 }), + m('survival-box-open', 'Коробка открытый', 'Выживание', 'survival-kit', 'box-open', { targetHeight: 0.8 }), + m('survival-box', 'Коробка', 'Выживание', 'survival-kit', 'box', { targetHeight: 0.8 }), + m('survival-bucket', 'Ведро', 'Выживание', 'survival-kit', 'bucket', { targetHeight: 0.8 }), + m('survival-campfire-fishing-stand', 'Костёр рыболов. Подставка', 'Выживание', 'survival-kit', 'campfire-fishing-stand', { targetHeight: 1 }), + m('survival-campfire-pit', 'Костёр яма', 'Выживание', 'survival-kit', 'campfire-pit', { targetHeight: 1 }), + m('survival-campfire-stand', 'Костёр Подставка', 'Выживание', 'survival-kit', 'campfire-stand', { targetHeight: 1 }), + m('survival-chest', 'Сундук', 'Выживание', 'survival-kit', 'chest', { targetHeight: 0.8 }), + m('survival-fence-doorway', 'Забор проём', 'Выживание', 'survival-kit', 'fence-doorway', { targetHeight: 1 }), + m('survival-fence-fortified', 'Забор укреплённый', 'Выживание', 'survival-kit', 'fence-fortified', { targetHeight: 1 }), + m('survival-fence', 'Забор', 'Выживание', 'survival-kit', 'fence', { targetHeight: 1 }), + m('survival-fish-large', 'Рыба большой', 'Выживание', 'survival-kit', 'fish-large', { targetHeight: 1 }), + m('survival-fish', 'Рыба', 'Выживание', 'survival-kit', 'fish', { targetHeight: 1 }), + m('survival-floor-hole', 'Дыра в полу', 'Выживание', 'survival-kit', 'floor-hole', { targetHeight: 1 }), + m('survival-floor-old', 'Пол старый', 'Выживание', 'survival-kit', 'floor-old', { targetHeight: 1 }), + m('survival-floor', 'Пол', 'Выживание', 'survival-kit', 'floor', { targetHeight: 1 }), + m('survival-grass-large', 'Высокая трава', 'Выживание', 'survival-kit', 'grass-large', { targetHeight: 1 }), + m('survival-grass', 'Трава', 'Выживание', 'survival-kit', 'grass', { targetHeight: 1 }), + m('survival-metal-panel-narrow', 'Metal panel узкий', 'Выживание', 'survival-kit', 'metal-panel-narrow', { targetHeight: 1 }), + m('survival-metal-panel-screws-half', 'Metal panel screws половина', 'Выживание', 'survival-kit', 'metal-panel-screws-half', { targetHeight: 1 }), + m('survival-metal-panel-screws-narrow', 'Metal panel screws узкий', 'Выживание', 'survival-kit', 'metal-panel-screws-narrow', { targetHeight: 1 }), + m('survival-metal-panel-screws', 'Metal panel screws', 'Выживание', 'survival-kit', 'metal-panel-screws', { targetHeight: 1 }), + m('survival-metal-panel', 'Metal panel', 'Выживание', 'survival-kit', 'metal-panel', { targetHeight: 1 }), + m('survival-patch-grass-large', 'Patch Высокая трава', 'Выживание', 'survival-kit', 'patch-grass-large', { targetHeight: 1 }), + m('survival-patch-grass', 'Patch Трава', 'Выживание', 'survival-kit', 'patch-grass', { targetHeight: 1 }), + m('survival-resource-planks', 'Resource planks', 'Выживание', 'survival-kit', 'resource-planks', { targetHeight: 1 }), + m('survival-resource-stone-large', 'Resource Камень большой', 'Выживание', 'survival-kit', 'resource-stone-large', { targetHeight: 1 }), + m('survival-resource-stone', 'Resource Камень', 'Выживание', 'survival-kit', 'resource-stone', { targetHeight: 1 }), + m('survival-resource-wood', 'Resource дерево', 'Выживание', 'survival-kit', 'resource-wood', { targetHeight: 1 }), + m('survival-rock-a', 'Камень a', 'Выживание', 'survival-kit', 'rock-a', { targetHeight: 1 }), + m('survival-rock-b', 'Камень b', 'Выживание', 'survival-kit', 'rock-b', { targetHeight: 1 }), + m('survival-rock-c', 'Камень c', 'Выживание', 'survival-kit', 'rock-c', { targetHeight: 1 }), + m('survival-rock-flat-grass', 'Камень плоский Трава', 'Выживание', 'survival-kit', 'rock-flat-grass', { targetHeight: 1 }), + m('survival-rock-flat', 'Камень плоский', 'Выживание', 'survival-kit', 'rock-flat', { targetHeight: 1 }), + m('survival-rock-sand-a', 'Камень Песок a', 'Выживание', 'survival-kit', 'rock-sand-a', { targetHeight: 1 }), + m('survival-rock-sand-b', 'Камень Песок b', 'Выживание', 'survival-kit', 'rock-sand-b', { targetHeight: 1 }), + m('survival-rock-sand-c', 'Камень Песок c', 'Выживание', 'survival-kit', 'rock-sand-c', { targetHeight: 1 }), + m('survival-signpost-single', 'Signpost одинарный', 'Выживание', 'survival-kit', 'signpost-single', { targetHeight: 1 }), + m('survival-signpost', 'Signpost', 'Выживание', 'survival-kit', 'signpost', { targetHeight: 1 }), + m('survival-structure-canvas', 'Structure canvas', 'Выживание', 'survival-kit', 'structure-canvas', { targetHeight: 1 }), + m('survival-structure-floor', 'Structure пол', 'Выживание', 'survival-kit', 'structure-floor', { targetHeight: 1 }), + m('survival-structure-metal-doorway', 'Structure metal проём', 'Выживание', 'survival-kit', 'structure-metal-doorway', { targetHeight: 1 }), + + // === Арена === (50) + m('mini-arena-banner', 'Знамя', 'Арена', 'mini-arena', 'banner', { targetHeight: 1.5 }), + m('mini-arena-block', 'Блок', 'Арена', 'mini-arena', 'block', { targetHeight: 1.2 }), + m('mini-arena-border-corner', 'Бордюр угол', 'Арена', 'mini-arena', 'border-corner', { targetHeight: 1.2 }), + m('mini-arena-border-straight', 'Бордюр Прямой участок', 'Арена', 'mini-arena', 'border-straight', { targetHeight: 1.2 }), + m('mini-arena-bricks', 'Кирпичи', 'Арена', 'mini-arena', 'bricks', { targetHeight: 1.2 }), + m('mini-arena-character-soldier', 'Персонаж Солдат', 'Арена', 'mini-arena', 'character-soldier', { targetHeight: 1.2 }), + m('mini-arena-column-damaged', 'Колонна повреждённый', 'Арена', 'mini-arena', 'column-damaged', { targetHeight: 2 }), + m('mini-arena-column', 'Колонна', 'Арена', 'mini-arena', 'column', { targetHeight: 2 }), + m('mini-arena-floor-detail', 'Пол Деталь', 'Арена', 'mini-arena', 'floor-detail', { targetHeight: 0.4 }), + m('mini-arena-floor', 'Пол', 'Арена', 'mini-arena', 'floor', { targetHeight: 0.4 }), + m('mini-arena-stairs-corner-inner', 'Лестница угол внутр.', 'Арена', 'mini-arena', 'stairs-corner-inner', { targetHeight: 1 }), + m('mini-arena-stairs-corner', 'Лестница угол', 'Арена', 'mini-arena', 'stairs-corner', { targetHeight: 1 }), + m('mini-arena-stairs', 'Лестница', 'Арена', 'mini-arena', 'stairs', { targetHeight: 1 }), + m('mini-arena-statue', 'Статуя', 'Арена', 'mini-arena', 'statue', { targetHeight: 3 }), + m('mini-arena-tree', 'Дерево', 'Арена', 'mini-arena', 'tree', { targetHeight: 1.2 }), + m('mini-arena-trophy', 'Кубок', 'Арена', 'mini-arena', 'trophy', { targetHeight: 1 }), + m('mini-arena-wall-corner', 'Стена угол', 'Арена', 'mini-arena', 'wall-corner', { targetHeight: 2 }), + m('mini-arena-wall-gate', 'Стена Ворота', 'Арена', 'mini-arena', 'wall-gate', { targetHeight: 2 }), + m('mini-arena-wall', 'Стена', 'Арена', 'mini-arena', 'wall', { targetHeight: 2 }), + m('mini-arena-weapon-rack', 'Оружие стойка', 'Арена', 'mini-arena', 'weapon-rack', { targetHeight: 1.5 }), + m('mini-arena-weapon-spear', 'Оружие Копьё', 'Арена', 'mini-arena', 'weapon-spear', { targetHeight: 1.5 }), + m('mini-arena-weapon-sword', 'Оружие Меч', 'Арена', 'mini-arena', 'weapon-sword', { targetHeight: 1.5 }), + m('conveyor-arrow-basic-rounded', 'Стрела basic rounded', 'Арена', 'conveyor-kit', 'arrow-basic-rounded', { targetHeight: 0.6 }), + m('conveyor-arrow-basic', 'Стрела basic', 'Арена', 'conveyor-kit', 'arrow-basic', { targetHeight: 0.6 }), + m('conveyor-arrow-rounded', 'Стрела rounded', 'Арена', 'conveyor-kit', 'arrow-rounded', { targetHeight: 0.6 }), + m('conveyor-arrow', 'Стрела', 'Арена', 'conveyor-kit', 'arrow', { targetHeight: 0.6 }), + m('conveyor-box-large', 'Коробка большой', 'Арена', 'conveyor-kit', 'box-large', { targetHeight: 1 }), + m('conveyor-box-long', 'Коробка длинный', 'Арена', 'conveyor-kit', 'box-long', { targetHeight: 1 }), + m('conveyor-box-small', 'Коробка маленький', 'Арена', 'conveyor-kit', 'box-small', { targetHeight: 1 }), + m('conveyor-box-wide', 'Коробка широкий', 'Арена', 'conveyor-kit', 'box-wide', { targetHeight: 1 }), + m('conveyor-conveyor-bars-fence', 'Конвейер bars Забор', 'Арена', 'conveyor-kit', 'conveyor-bars-fence', { targetHeight: 0.4 }), + m('conveyor-conveyor-bars-high', 'Конвейер bars высокий', 'Арена', 'conveyor-kit', 'conveyor-bars-high', { targetHeight: 0.4 }), + m('conveyor-conveyor-bars-sides', 'Конвейер bars sides', 'Арена', 'conveyor-kit', 'conveyor-bars-sides', { targetHeight: 0.4 }), + m('conveyor-conveyor-bars-stripe-fence', 'Конвейер bars stripe Забор', 'Арена', 'conveyor-kit', 'conveyor-bars-stripe-fence', { targetHeight: 0.4 }), + m('conveyor-conveyor-bars-stripe-high', 'Конвейер bars stripe высокий', 'Арена', 'conveyor-kit', 'conveyor-bars-stripe-high', { targetHeight: 0.4 }), + m('conveyor-conveyor-bars-stripe-side', 'Конвейер bars stripe бок', 'Арена', 'conveyor-kit', 'conveyor-bars-stripe-side', { targetHeight: 0.4 }), + m('conveyor-conveyor-bars-stripe', 'Конвейер bars stripe', 'Арена', 'conveyor-kit', 'conveyor-bars-stripe', { targetHeight: 0.4 }), + m('conveyor-conveyor-bars', 'Конвейер bars', 'Арена', 'conveyor-kit', 'conveyor-bars', { targetHeight: 0.4 }), + m('conveyor-conveyor-cross', 'Конвейер крест', 'Арена', 'conveyor-kit', 'conveyor-cross', { targetHeight: 0.4 }), + m('conveyor-conveyor-junction-t', 'Конвейер Развилка t', 'Арена', 'conveyor-kit', 'conveyor-junction-t', { targetHeight: 0.4 }), + m('conveyor-conveyor-long-part-end', 'Конвейер длинный part конец', 'Арена', 'conveyor-kit', 'conveyor-long-part-end', { targetHeight: 0.4 }), + m('conveyor-conveyor-long-part-middle', 'Конвейер длинный part middle', 'Арена', 'conveyor-kit', 'conveyor-long-part-middle', { targetHeight: 0.4 }), + m('conveyor-conveyor-long-sides-part-end', 'Конвейер длинный sides part конец', 'Арена', 'conveyor-kit', 'conveyor-long-sides-part-end', { targetHeight: 0.4 }), + m('conveyor-conveyor-long-sides-part-middle', 'Конвейер длинный sides part middle', 'Арена', 'conveyor-kit', 'conveyor-long-sides-part-middle', { targetHeight: 0.4 }), + m('conveyor-conveyor-long-sides', 'Конвейер длинный sides', 'Арена', 'conveyor-kit', 'conveyor-long-sides', { targetHeight: 0.4 }), + m('conveyor-conveyor-long-stripe-sides-part-end', 'Конвейер длинный stripe sides part конец', 'Арена', 'conveyor-kit', 'conveyor-long-stripe-sides-part-end', { targetHeight: 0.4 }), + m('conveyor-conveyor-long-stripe-sides-part-middle', 'Конвейер длинный stripe sides part middle', 'Арена', 'conveyor-kit', 'conveyor-long-stripe-sides-part-middle', { targetHeight: 0.4 }), + m('conveyor-conveyor-long-stripe-sides', 'Конвейер длинный stripe sides', 'Арена', 'conveyor-kit', 'conveyor-long-stripe-sides', { targetHeight: 0.4 }), + m('conveyor-conveyor-long-stripe', 'Конвейер длинный stripe', 'Арена', 'conveyor-kit', 'conveyor-long-stripe', { targetHeight: 0.4 }), + m('conveyor-conveyor-long', 'Конвейер длинный', 'Арена', 'conveyor-kit', 'conveyor-long', { targetHeight: 0.4 }), + + // === Персонажи === (33) + m('mini-characters-character-female-a', 'Аня', 'Персонажи', 'mini-characters', 'character-female-a', { targetHeight: 1.7 }), + m('mini-characters-character-female-b', 'Маша', 'Персонажи', 'mini-characters', 'character-female-b', { targetHeight: 1.7 }), + m('mini-characters-character-female-c', 'Лена', 'Персонажи', 'mini-characters', 'character-female-c', { targetHeight: 1.7 }), + m('mini-characters-character-female-d', 'Катя', 'Персонажи', 'mini-characters', 'character-female-d', { targetHeight: 1.7 }), + m('mini-characters-character-female-e', 'Оля', 'Персонажи', 'mini-characters', 'character-female-e', { targetHeight: 1.7 }), + m('mini-characters-character-female-f', 'Настя', 'Персонажи', 'mini-characters', 'character-female-f', { targetHeight: 1.7 }), + m('mini-characters-character-male-a', 'Костя', 'Персонажи', 'mini-characters', 'character-male-a', { targetHeight: 1.7 }), + m('mini-characters-character-male-b', 'Максим', 'Персонажи', 'mini-characters', 'character-male-b', { targetHeight: 1.7 }), + m('mini-characters-character-male-c', 'Дима', 'Персонажи', 'mini-characters', 'character-male-c', { targetHeight: 1.7 }), + m('mini-characters-character-male-d', 'Саша', 'Персонажи', 'mini-characters', 'character-male-d', { targetHeight: 1.7 }), + m('mini-characters-character-male-e', 'Артём', 'Персонажи', 'mini-characters', 'character-male-e', { targetHeight: 1.7 }), + m('mini-characters-character-male-f', 'Лёша', 'Персонажи', 'mini-characters', 'character-male-f', { targetHeight: 1.7 }), + + // === ДЕТСКАЯ ПЛОЩАДКА (Poly Pizza, CC-BY 3.0) === + // Используются в L2 «Игры в кальмара» (Дальгона). Атрибуция авторов + // в /public/playground-kit/CREDITS.txt. + mu('pg-slide-google', 'Горка (Poly)', 'Площадка', + '/playground-kit/slide_google.glb', { targetHeight: 4 }), + mu('pg-swing-google', 'Качели (Google)', 'Площадка', + '/playground-kit/swing_set_google.glb', { targetHeight: 3.5 }), + mu('pg-seesaw', 'Качели-балансир', 'Площадка', + '/playground-kit/seesaw_2.glb', { targetHeight: 1.5 }), + mu('pg-carousel', 'Карусель', 'Площадка', + '/playground-kit/merry_go_round.glb', { targetHeight: 2.5 }), + mu('pg-jungle-gym', 'Лазалка-комплекс', 'Площадка', + '/playground-kit/jungle_gym.glb', { targetHeight: 4 }), + // Kenney CC0 — старинная скамейка с кладбища (выбрана МИНом) + m('pg-bench', 'Скамья парковая', 'Площадка', 'graveyard-kit', 'bench', + { targetHeight: 1.2 }), + // Двойной фонарь с кладбища + m('pg-lamp-double', 'Фонарь двойной', 'Площадка', 'graveyard-kit', 'lightpost-double', + { targetHeight: 4 }), + // Детальное дерево из nature-kit + m('pg-tree-detailed', 'Дерево детальное', 'Площадка', 'nature-kit', 'tree_detailed', + { targetHeight: 4 }), + // Куст детальный + m('pg-bush-detailed', 'Куст', 'Площадка', 'nature-kit', 'plant_bushDetailed', + { targetHeight: 1.2 }), + // Забор из досок + m('pg-fence-planks', 'Забор', 'Площадка', 'nature-kit', 'fence_planks', + { targetHeight: 1.5 }), + + // === ЛЕГО-СЕТ (задача 09) — паритет со студией === + mc('lego-brick-1x1', 'Лего 1×1', 'Лего-сет', [ + { kind: 'primitive', type: 'cube', sx: 1, sy: 1, sz: 1, color: '#e02a2a', material: 'studs', dy: 0.5 }, + ]), + mc('lego-brick-1x2', 'Лего 1×2', 'Лего-сет', [ + { kind: 'primitive', type: 'cube', sx: 2, sy: 1, sz: 1, color: '#2a6fe0', material: 'studs', dy: 0.5 }, + ]), + mc('lego-brick-1x4', 'Лего 1×4', 'Лего-сет', [ + { kind: 'primitive', type: 'cube', sx: 4, sy: 1, sz: 1, color: '#f0c020', material: 'studs', dy: 0.5 }, + ]), + mc('lego-brick-2x2', 'Лего 2×2', 'Лего-сет', [ + { kind: 'primitive', type: 'cube', sx: 2, sy: 1, sz: 2, color: '#35ba5c', material: 'studs', dy: 0.5 }, + ]), + mc('lego-brick-2x4', 'Лего 2×4', 'Лего-сет', [ + { kind: 'primitive', type: 'cube', sx: 4, sy: 1, sz: 2, color: '#e07a30', material: 'studs', dy: 0.5 }, + ]), + mc('lego-brick-2x8', 'Лего 2×8', 'Лего-сет', [ + { kind: 'primitive', type: 'cube', sx: 8, sy: 1, sz: 2, color: '#9b5cf0', material: 'studs', dy: 0.5 }, + ]), + mc('lego-plate-1x1', 'Плита 1×1', 'Лего-сет', [ + { kind: 'primitive', type: 'cube', sx: 1, sy: 0.35, sz: 1, color: '#cfd2d6', material: 'studs', dy: 0.175 }, + ]), + mc('lego-plate-1x2', 'Плита 1×2', 'Лего-сет', [ + { kind: 'primitive', type: 'cube', sx: 2, sy: 0.35, sz: 1, color: '#cfd2d6', material: 'studs', dy: 0.175 }, + ]), + mc('lego-plate-2x2', 'Плита 2×2', 'Лего-сет', [ + { kind: 'primitive', type: 'cube', sx: 2, sy: 0.35, sz: 2, color: '#cfd2d6', material: 'studs', dy: 0.175 }, + ]), + mc('lego-plate-4x4', 'Плита 4×4', 'Лего-сет', [ + { kind: 'primitive', type: 'cube', sx: 4, sy: 0.35, sz: 4, color: '#9aa0a6', material: 'studs', dy: 0.175 }, + ]), + mc('lego-slope-30', 'Скат 30°', 'Лего-сет', [ + { kind: 'primitive', type: 'wedge', sx: 2, sy: 1, sz: 2, color: '#e02a2a', material: 'studs', dy: 0.5 }, + ]), + mc('lego-slope-45', 'Скат 45°', 'Лего-сет', [ + { kind: 'primitive', type: 'wedge', sx: 2, sy: 2, sz: 2, color: '#2a6fe0', material: 'studs', dy: 1 }, + ]), + mc('lego-slope-60', 'Скат 60°', 'Лего-сет', [ + { kind: 'primitive', type: 'wedge', sx: 2, sy: 3, sz: 2, color: '#f0c020', material: 'studs', dy: 1.5 }, + ]), + mc('lego-tree', 'Лего-дерево', 'Лего-сет', [ + { kind: 'primitive', type: 'cube', sx: 1, sy: 3, sz: 1, color: '#8a5a2b', material: 'studs', dy: 1.5 }, + { kind: 'primitive', type: 'cube', sx: 3, sy: 2, sz: 3, color: '#35ba5c', material: 'studs', dy: 4 }, + { kind: 'primitive', type: 'cube', sx: 2, sy: 1.5, sz: 2, color: '#2e9e4c', material: 'studs', dy: 5.5 }, + ], { targetHeight: 6 }), + mc('lego-bush', 'Лего-куст', 'Лего-сет', [ + { kind: 'primitive', type: 'cube', sx: 2, sy: 1, sz: 2, color: '#2e9e4c', material: 'studs', dy: 0.5 }, + { kind: 'primitive', type: 'cube', sx: 1, sy: 1, sz: 1, color: '#35ba5c', material: 'studs', dy: 1.3, dx: 0.4 }, + { kind: 'primitive', type: 'cube', sx: 1, sy: 1, sz: 1, color: '#35ba5c', material: 'studs', dy: 1.3, dx: -0.5, dz: 0.3 }, + ], { targetHeight: 1.8 }), + mc('lego-house-small', 'Лего-дом', 'Лего-сет', [ + { kind: 'primitive', type: 'cube', sx: 6, sy: 4, sz: 6, color: '#e02a2a', material: 'studs', dy: 2 }, + { kind: 'primitive', type: 'wedge', sx: 7, sy: 2.5, sz: 7, color: '#2a6fe0', material: 'studs', dy: 5.25 }, + { kind: 'primitive', type: 'cube', sx: 1.4, sy: 2.4, sz: 0.3, color: '#f0c020', material: 'studs', dy: 1.2, dz: -3.05 }, + { kind: 'primitive', type: 'cube', sx: 1.2, sy: 1.2, sz: 0.3, color: '#9ad0ff', material: 'studs', dy: 2.6, dz: -3.05, dx: 1.8 }, + ], { targetHeight: 6.5 }), + mc('lego-car-racer', 'Лего-машина', 'Лего-сет', [ + { kind: 'primitive', type: 'cube', sx: 6, sy: 1, sz: 3, color: '#e02a2a', material: 'studs', dy: 0.9 }, + { kind: 'primitive', type: 'cube', sx: 2.5, sy: 1.2, sz: 2.6, color: '#2a6fe0', material: 'studs', dy: 1.9, dx: 0.6 }, + { kind: 'primitive', type: 'cylinder', sx: 1, sy: 0.6, sz: 1, color: '#222428', material: 'studs', dy: 0.5, dx: 1.8, dz: 1.6, rz: Math.PI / 2 }, + { kind: 'primitive', type: 'cylinder', sx: 1, sy: 0.6, sz: 1, color: '#222428', material: 'studs', dy: 0.5, dx: 1.8, dz: -1.6, rz: Math.PI / 2 }, + { kind: 'primitive', type: 'cylinder', sx: 1, sy: 0.6, sz: 1, color: '#222428', material: 'studs', dy: 0.5, dx: -1.8, dz: 1.6, rz: Math.PI / 2 }, + { kind: 'primitive', type: 'cylinder', sx: 1, sy: 0.6, sz: 1, color: '#222428', material: 'studs', dy: 0.5, dx: -1.8, dz: -1.6, rz: Math.PI / 2 }, + ], { targetHeight: 2.5 }), + mc('lego-stairs', 'Лего-ступеньки', 'Лего-сет', [ + { kind: 'primitive', type: 'cube', sx: 3, sy: 1, sz: 1.2, color: '#cfd2d6', material: 'studs', dy: 0.5, dz: 1.8 }, + { kind: 'primitive', type: 'cube', sx: 3, sy: 2, sz: 1.2, color: '#cfd2d6', material: 'studs', dy: 1.0, dz: 0.6 }, + { kind: 'primitive', type: 'cube', sx: 3, sy: 3, sz: 1.2, color: '#cfd2d6', material: 'studs', dy: 1.5, dz: -0.6 }, + { kind: 'primitive', type: 'cube', sx: 3, sy: 4, sz: 1.2, color: '#cfd2d6', material: 'studs', dy: 2.0, dz: -1.8 }, + ], { targetHeight: 4 }), + mc('lego-minifig', 'Лего-человечек', 'Лего-сет', [ + { kind: 'primitive', type: 'cube', sx: 1.4, sy: 0.6, sz: 0.9, color: '#f0c020', material: 'studs', dy: 0.3 }, + { kind: 'primitive', type: 'cube', sx: 1.2, sy: 1.6, sz: 0.8, color: '#2a6fe0', material: 'studs', dy: 1.4 }, + { kind: 'primitive', type: 'cube', sx: 0.4, sy: 1.4, sz: 0.4, color: '#f0c020', material: 'studs', dy: 1.4, dx: 0.85 }, + { kind: 'primitive', type: 'cube', sx: 0.4, sy: 1.4, sz: 0.4, color: '#f0c020', material: 'studs', dy: 1.4, dx: -0.85 }, + { kind: 'primitive', type: 'cube', sx: 1.1, sy: 1.0, sz: 0.85, color: '#f5c84a', material: 'studs', dy: 2.7 }, + { kind: 'primitive', type: 'cylinder', sx: 0.9, sy: 0.5, sz: 0.9, color: '#e02a2a', material: 'studs', dy: 3.4 }, + ], { targetHeight: 3.8 }), + +// TOTAL: 644 + +]; + +// Авто-проставляем gameplay для всех моделей в категории «Оружие» — +// бластеры (ranged), мечи/копья (melee), щиты пропускаем. +for (const m of MODEL_TYPES) { + if (m.category !== 'Оружие') continue; + if (m.gameplay) continue; // уже задан вручную + const id = m.id; + if (id.startsWith('shield')) continue; + if (id.startsWith('blaster-blaster-')) { + m.gameplay = { + type: 'weapon-ranged', + isWeapon: true, + weaponKind: 'ranged', + description: 'Дальнобойное оружие. Нажми «Добавить в инвентарь» чтобы выдать игроку.', + defaultParams: { + damage: 25, fireRate: 0.18, range: 80, + magazine: 30, reserve: 120, reloadTime: 1.6, auto: true, + }, + // Базовые настройки. Подкручиваются через window.weapon3rd(...). + viewModel: { + scale3rd: 1.2, scale1st: 0.7, + position3rd: { x: 0, y: 0, z: 0 }, + rotation3rd: { x: 0, y: 0, z: 0 }, + }, + }; + } else if (id === 'weapon-sword') { + m.gameplay = { + type: 'weapon-melee', isWeapon: true, weaponKind: 'melee', + description: 'Меч. ЛКМ — широкий взмах.', + defaultParams: { damage: 40, fireRate: 0.55, range: 2.4, meleeArc: 1.2, auto: false }, + viewModel: { + scale3rd: 1.4, scale1st: 1.0, + position3rd: { x: 0, y: 0, z: 0 }, + rotation3rd: { x: 0, y: 0, z: 0 }, + }, + }; + } else if (id === 'weapon-spear') { + m.gameplay = { + type: 'weapon-melee', isWeapon: true, weaponKind: 'melee', + description: 'Копьё. ЛКМ — выпад вперёд.', + defaultParams: { damage: 55, fireRate: 0.85, range: 3.2, meleeArc: 0.6, auto: false }, + viewModel: { + scale3rd: 1.4, scale1st: 1.0, + position3rd: { x: 0, y: 0, z: 0 }, + rotation3rd: { x: 0, y: 0, z: 0 }, + }, + }; + } +} + +export const MODEL_CATEGORIES = Array.from(new Set(MODEL_TYPES.map(m => m.category))); + +export function getModelType(id) { + return MODEL_TYPES.find(m => m.id === id) || null; +} diff --git a/src/engine/PrimitiveManager.js b/src/engine/PrimitiveManager.js index 6300fd2..4f6ace3 100644 --- a/src/engine/PrimitiveManager.js +++ b/src/engine/PrimitiveManager.js @@ -33,6 +33,30 @@ import { DynamicTexture } from '@babylonjs/core/Materials/Textures/dynamicTextur import { Texture } from '@babylonjs/core/Materials/Textures/texture'; import { getPrimitiveType } from './PrimitiveTypes'; +// === Материал «studs» (лего-кружки, задача 09) — паритет со студией === +const STUDS_DIFFUSE_URL = '/kubikon-assets/materials/studs_diffuse.png'; +const STUDS_NORMAL_URL = '/kubikon-assets/materials/studs_normal.png'; +const STUD_UNIT = 1; +const STUDS_GRID = 4; +const _studsTexCache = new WeakMap(); +function _getStudsTextures(scene) { + let c = _studsTexCache.get(scene); + if (!c) { + c = { diffuse: new Texture(STUDS_DIFFUSE_URL, scene), normal: new Texture(STUDS_NORMAL_URL, scene) }; + _studsTexCache.set(scene, c); + } + return c; +} +function _studsTiling(type, sx, sy, sz) { + const f = STUD_UNIT * STUDS_GRID; + let u = Math.max(sx, sz) / f; + let v = sy / f; + if (type === 'cylinder') { u = (Math.PI * sx) / f; v = sy / f; } + else if (type === 'sphere') { u = (Math.PI * sx) / f; v = (Math.PI * sy) / f; } + else if (type === 'plane') { u = sx / f; v = sz / f; } + return { u: Math.max(0.25, u), v: Math.max(0.25, v) }; +} + export class PrimitiveManager { constructor(scene) { this.scene = scene; @@ -121,6 +145,7 @@ export class PrimitiveManager { name: opts.name || null, folderId: opts.folderId ?? null, }; + mesh._studsDims = { type, sx, sy, sz }; this._applyMaterial(mesh, typeDef, color, material); this._applyVisible(mesh, visible, typeDef); // Пользовательская текстура — поверх базового материала. @@ -431,6 +456,23 @@ export class PrimitiveManager { mat.emissiveColor = Color3.FromHexString(color || '#888888'); mat.specularColor = new Color3(0, 0, 0); break; + case 'studs': { + // Лего-материал (паритет со студией): серая diffuse с кружками + // × цвет меша + normal map. Тайлинг по размеру меша. + const tex = _getStudsTextures(this.scene); + const dt = tex.diffuse.clone(); + const nt = tex.normal.clone(); + const dims = mesh._studsDims || { type: 'cube', sx: 1, sy: 1, sz: 1 }; + const tile = _studsTiling(dims.type, dims.sx, dims.sy, dims.sz); + dt.uScale = nt.uScale = tile.u; + dt.vScale = nt.vScale = tile.v; + mat.diffuseTexture = dt; + mat.bumpTexture = nt; + mat.diffuseColor = Color3.FromHexString(color || '#cccccc'); + mat.specularColor = new Color3(0.25, 0.25, 0.25); + mat.specularPower = 24; + break; + } case 'matte': default: mat.specularColor = new Color3(0, 0, 0); @@ -601,6 +643,7 @@ export class PrimitiveManager { if (data.mesh.material) { try { data.mesh.material.dispose(); } catch (e) { /* ignore */ } } + data.mesh._studsDims = { type: data.type, sx: data.sx, sy: data.sy, sz: data.sz }; this._applyMaterial(data.mesh, typeDef, data.color, data.material); } // Текстуру переприменяем если: сменили саму текстуру, или @@ -614,6 +657,7 @@ export class PrimitiveManager { if (data.mesh.material) { try { data.mesh.material.dispose(); } catch (e) { /* ignore */ } } + data.mesh._studsDims = { type: data.type, sx: data.sx, sy: data.sy, sz: data.sz }; this._applyMaterial(data.mesh, typeDef, data.color, data.material); } @@ -717,6 +761,16 @@ export class PrimitiveManager { catch (e) { /* ignore */ } data.mesh = newMesh; + newMesh._studsDims = { type: data.type, sx: data.sx, sy: data.sy, sz: data.sz }; + if (data.material === 'studs' && oldMat && oldMat.diffuseTexture) { + const tile = _studsTiling(data.type, data.sx, data.sy, data.sz); + oldMat.diffuseTexture.uScale = tile.u; + oldMat.diffuseTexture.vScale = tile.v; + if (oldMat.bumpTexture) { + oldMat.bumpTexture.uScale = tile.u; + oldMat.bumpTexture.vScale = tile.v; + } + } } /** Удалить инстанс. */ diff --git a/src/engine/ScriptSandboxWorker.js b/src/engine/ScriptSandboxWorker.js index 1184a3d..286be21 100644 --- a/src/engine/ScriptSandboxWorker.js +++ b/src/engine/ScriptSandboxWorker.js @@ -1410,7 +1410,8 @@ const game = { if (kind === 'block') { const ix = Math.round(x), iy = Math.round(y), iz = Math.round(z); const ref = 'block:' + ix + ',' + iy + ',' + iz; - _send('scene.spawn', { kind: 'block', subType, x: ix, y: iy, z: iz, ref }); + // color — для окрашиваемых блоков (studs-block, задача 09). + _send('scene.spawn', { kind: 'block', subType, x: ix, y: iy, z: iz, ref, color: opts.color }); if (opts.lifetime != null) _scheduleDelete(ref, opts.lifetime); return ref; } -- 2.47.2 From d5968f7cb8e674655abac353222c2776aa8f38c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=98=D0=9D?= Date: Sun, 31 May 2026 12:22:03 +0300 Subject: [PATCH 2/4] =?UTF-8?q?feat(09):=20=D1=81=D0=BE=D1=87=D0=BD=D1=8B?= =?UTF-8?q?=D0=B5=20=D0=BA=D1=80=D1=83=D0=B3=D0=BB=D1=8B=D0=B5=20studs=20(?= =?UTF-8?q?v4)=20=E2=80=94=20=D0=BF=D0=B0=D1=80=D0=B8=D1=82=D0=B5=D1=82=20?= =?UTF-8?q?=D1=81=D0=BE=20=D1=81=D1=82=D1=83=D0=B4=D0=B8=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Текстура studs v4 (круглые, объём+тени, сочный цвет), URL studs_v4_*. - PrimitiveManager: emissive 45% цвета + новые константы (GRID 4, UNIT 1). - BlockManager/BlockTypes: studs-block на v4-текстуре, specular убран. Co-Authored-By: Claude Opus 4.8 --- src/engine/BlockManager.js | 5 +++-- src/engine/BlockTypes.js | 4 ++-- src/engine/GameRuntime.js | 3 +++ src/engine/PrimitiveManager.js | 15 ++++++++------- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/engine/BlockManager.js b/src/engine/BlockManager.js index 8ea6e1a..37e0bd9 100644 --- a/src/engine/BlockManager.js +++ b/src/engine/BlockManager.js @@ -373,8 +373,9 @@ export class BlockManager { if (blockType.normal) { try { mat.bumpTexture = new Texture(blockType.normal, this.scene); } catch (e) {} } - mat.specularColor = new Color3(0.2, 0.2, 0.2); - mat.specularPower = 24; + // Сочность (Roblox-look): почти-белая текстура × яркий vertex color, + // specular убран (он белит/тускнит цвет). + mat.specularColor = new Color3(0, 0, 0); mat.useVertexColors = true; return mat; } diff --git a/src/engine/BlockTypes.js b/src/engine/BlockTypes.js index d2762b0..75e65ee 100644 --- a/src/engine/BlockTypes.js +++ b/src/engine/BlockTypes.js @@ -108,8 +108,8 @@ export const BLOCK_TYPES = [ // === ОКРАШИВАЕМЫЕ (задача 09) — паритет со студией === cube('studs-block', 'Лего-кирпич', 'Окрашиваемые', - '/kubikon-assets/materials/studs_diffuse.png', - { colorable: true, normal: '/kubikon-assets/materials/studs_normal.png', defaultColor: '#3a7aff' }), + '/kubikon-assets/materials/studs_v4_diffuse.png', + { colorable: true, normal: '/kubikon-assets/materials/studs_v4_normal.png', defaultColor: '#3a7aff' }), ]; /** Все доступные категории в порядке появления. */ diff --git a/src/engine/GameRuntime.js b/src/engine/GameRuntime.js index 143d080..c376a49 100644 --- a/src/engine/GameRuntime.js +++ b/src/engine/GameRuntime.js @@ -2407,6 +2407,9 @@ export class GameRuntime { if (data.material === 'neon') { data.mesh.material.emissiveColor = c; } + if (data.material === 'studs') { + data.mesh.material.emissiveColor = new Color3(c.r * 0.45, c.g * 0.45, c.b * 0.45); + } } } } catch (e) { diff --git a/src/engine/PrimitiveManager.js b/src/engine/PrimitiveManager.js index 4f6ace3..2048214 100644 --- a/src/engine/PrimitiveManager.js +++ b/src/engine/PrimitiveManager.js @@ -34,8 +34,8 @@ import { Texture } from '@babylonjs/core/Materials/Textures/texture'; import { getPrimitiveType } from './PrimitiveTypes'; // === Материал «studs» (лего-кружки, задача 09) — паритет со студией === -const STUDS_DIFFUSE_URL = '/kubikon-assets/materials/studs_diffuse.png'; -const STUDS_NORMAL_URL = '/kubikon-assets/materials/studs_normal.png'; +const STUDS_DIFFUSE_URL = '/kubikon-assets/materials/studs_v4_diffuse.png'; +const STUDS_NORMAL_URL = '/kubikon-assets/materials/studs_v4_normal.png'; const STUD_UNIT = 1; const STUDS_GRID = 4; const _studsTexCache = new WeakMap(); @@ -457,8 +457,8 @@ export class PrimitiveManager { mat.specularColor = new Color3(0, 0, 0); break; case 'studs': { - // Лего-материал (паритет со студией): серая diffuse с кружками - // × цвет меша + normal map. Тайлинг по размеру меша. + // Лего-материал (паритет со студией): почти-белая diffuse × цвет + // меша + normal map. emissive = доля цвета → сочность (Roblox-look). const tex = _getStudsTextures(this.scene); const dt = tex.diffuse.clone(); const nt = tex.normal.clone(); @@ -468,9 +468,10 @@ export class PrimitiveManager { dt.vScale = nt.vScale = tile.v; mat.diffuseTexture = dt; mat.bumpTexture = nt; - mat.diffuseColor = Color3.FromHexString(color || '#cccccc'); - mat.specularColor = new Color3(0.25, 0.25, 0.25); - mat.specularPower = 24; + const sc = Color3.FromHexString(color || '#cccccc'); + mat.diffuseColor = sc; + mat.emissiveColor = new Color3(sc.r * 0.45, sc.g * 0.45, sc.b * 0.45); + mat.specularColor = new Color3(0, 0, 0); break; } case 'matte': -- 2.47.2 From ae83926a5a7e9f64eadb3c3ca19e5458c1dde9ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=98=D0=9D?= Date: Sun, 31 May 2026 13:26:52 +0300 Subject: [PATCH 3/4] =?UTF-8?q?feat(09):=20per-face=20UV=20studs=20+=20stu?= =?UTF-8?q?dDensity=20(=D0=BF=D0=B0=D1=80=D0=B8=D1=82=D0=B5=D1=82=20=D1=81?= =?UTF-8?q?=D0=BE=20=D1=81=D1=82=D1=83=D0=B4=D0=B8=D0=B5=D0=B9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit faceUV для куба (кружки одного размера на всех гранях) + studDensity (плотность кружков) — портировано из студии. Co-Authored-By: Claude Opus 4.8 --- src/engine/PrimitiveManager.js | 99 ++++++++++++++++++++++++++-------- 1 file changed, 78 insertions(+), 21 deletions(-) diff --git a/src/engine/PrimitiveManager.js b/src/engine/PrimitiveManager.js index 2048214..8b6b38a 100644 --- a/src/engine/PrimitiveManager.js +++ b/src/engine/PrimitiveManager.js @@ -19,7 +19,7 @@ * При касании игроком обновляет spawnPoint сцены. */ import { - MeshBuilder, StandardMaterial, Color3, Vector3, PointLight, + MeshBuilder, StandardMaterial, Color3, Vector3, Vector4, PointLight, Mesh, VertexData, } from '@babylonjs/core'; // CRA→Vite адаптация: оригинальный код в setTexture()/_applyMaterial()/ @@ -47,8 +47,10 @@ function _getStudsTextures(scene) { } return c; } -function _studsTiling(type, sx, sy, sz) { - const f = STUD_UNIT * STUDS_GRID; +function _studsTiling(type, sx, sy, sz, density) { + // density — множитель плотности кружков (1=стандарт, 2=вдвое мельче/чаще). + const d = density && density > 0 ? density : 1; + const f = (STUD_UNIT * STUDS_GRID) / d; let u = Math.max(sx, sz) / f; let v = sy / f; if (type === 'cylinder') { u = (Math.PI * sx) / f; v = sy / f; } @@ -56,6 +58,31 @@ function _studsTiling(type, sx, sy, sz) { else if (type === 'plane') { u = sx / f; v = sz / f; } return { u: Math.max(0.25, u), v: Math.max(0.25, v) }; } +/** + * faceUV для куба со studs — КАЖДАЯ грань тайлится по СВОИМ реальным размерам, + * чтобы кружки были одного размера на всех гранях (не растягивались на длинных). + * Грани CreateBox: 0=front(z-) 1=back(z+) 2=right(x+) 3=left(x-) 4=top(y+) 5=bottom(y-). + * front/back → ширина=sx, высота=sy + * left/right → ширина=sz, высота=sy + * top/bottom → ширина=sx, высота=sz + * UV-диапазон грани = (0,0)..(кол-во_studs_по_ширине, кол-во_по_высоте). + */ +function _studsCubeFaceUV(sx, sy, sz, density) { + const d = density && density > 0 ? density : 1; + const f = (STUD_UNIT * STUDS_GRID) / d; + const nx = Math.max(0.25, sx / f); // studs вдоль X + const ny = Math.max(0.25, sy / f); // studs вдоль Y + const nz = Math.max(0.25, sz / f); // studs вдоль Z + // Vector4(u0, v0, u1, v1) + return [ + new Vector4(0, 0, nx, ny), // front (z-): X×Y + new Vector4(0, 0, nx, ny), // back (z+): X×Y + new Vector4(0, 0, nz, ny), // right (x+): Z×Y + new Vector4(0, 0, nz, ny), // left (x-): Z×Y + new Vector4(0, 0, nx, nz), // top (y+): X×Z + new Vector4(0, 0, nx, nz), // bottom (y-): X×Z + ]; +} export class PrimitiveManager { constructor(scene) { @@ -97,6 +124,8 @@ export class PrimitiveManager { const isGlowingGd = isGdKind; const isGdSpike = typeDef.kind === 'gd_spike'; const material = opts.material ?? (isGlowingGd ? 'neon' : 'matte'); + // studDensity — плотность кружков studs (1=стандарт, >1 мельче/чаще). + const studDensity = Number.isFinite(opts.studDensity) ? opts.studDensity : 1; // canCollide: для всех GD-сущностей и шипов — false (игрок проходит сквозь, логика по дистанции) const canCollide = opts.canCollide !== false && !isGdKind && !isGdSpike; const visible = opts.visible !== false; @@ -114,7 +143,7 @@ export class PrimitiveManager { const rotationY = opts.rotationY ?? 0; const rotationZ = opts.rotationZ ?? 0; - const mesh = this._createMeshForType(typeDef, id, sx, sy, sz); + const mesh = this._createMeshForType(typeDef, id, sx, sy, sz, material, studDensity); mesh.position = new Vector3(x, y, z); mesh.rotation = new Vector3(rotationX, rotationY, rotationZ); mesh.isPickable = true; @@ -138,14 +167,15 @@ export class PrimitiveManager { id, mesh, type, x, y, z, sx, sy, sz, rotationX, rotationY, rotationZ, color, material, canCollide, visible, anchored, mass, - textureAsset, + textureAsset, studDensity, // locked — объект защищён от выделения/перемещения в редакторе // (Фаза 5.11). На геймплей не влияет. locked: opts.locked === true, name: opts.name || null, folderId: opts.folderId ?? null, }; - mesh._studsDims = { type, sx, sy, sz }; + // Размеры для тайлинга studs-материала (читается в _applyMaterial). + mesh._studsDims = { type, sx, sy, sz, density: studDensity }; this._applyMaterial(mesh, typeDef, color, material); this._applyVisible(mesh, visible, typeDef); // Пользовательская текстура — поверх базового материала. @@ -210,13 +240,17 @@ export class PrimitiveManager { } /** Создать базовый mesh нужной формы (без материала). */ - _createMeshForType(typeDef, id, sx, sy, sz) { + _createMeshForType(typeDef, id, sx, sy, sz, material, studDensity) { const name = `prim_${typeDef.id}_${id}`; switch (typeDef.id) { case 'cube': - case 'trigger': - return MeshBuilder.CreateBox(name, - { width: sx, height: sy, depth: sz }, this.scene); + case 'trigger': { + const boxOpts = { width: sx, height: sy, depth: sz }; + // studs — per-face UV, чтобы кружки были одного размера на всех + // гранях (не растягивались на длинной стороне). + if (material === 'studs') boxOpts.faceUV = _studsCubeFaceUV(sx, sy, sz, studDensity); + return MeshBuilder.CreateBox(name, boxOpts, this.scene); + } case 'sphere': return MeshBuilder.CreateSphere(name, { diameterX: sx, diameterY: sy, diameterZ: sz, segments: 24 }, this.scene); @@ -463,9 +497,16 @@ export class PrimitiveManager { const dt = tex.diffuse.clone(); const nt = tex.normal.clone(); const dims = mesh._studsDims || { type: 'cube', sx: 1, sy: 1, sz: 1 }; - const tile = _studsTiling(dims.type, dims.sx, dims.sy, dims.sz); - dt.uScale = nt.uScale = tile.u; - dt.vScale = nt.vScale = tile.v; + // Куб/триггер тайлятся через faceUV геометрии (uScale=1) — кружки + // одного размера на всех гранях. Остальные формы — через uScale. + if (dims.type === 'cube' || dims.type === 'trigger') { + dt.uScale = nt.uScale = 1; + dt.vScale = nt.vScale = 1; + } else { + const tile = _studsTiling(dims.type, dims.sx, dims.sy, dims.sz, dims.density); + dt.uScale = nt.uScale = tile.u; + dt.vScale = nt.vScale = tile.v; + } mat.diffuseTexture = dt; mat.bumpTexture = nt; const sc = Color3.FromHexString(color || '#cccccc'); @@ -619,6 +660,12 @@ export class PrimitiveManager { if (patch.sx !== undefined) { data.sx = patch.sx; scaleChanged = true; } if (patch.sy !== undefined) { data.sy = patch.sy; scaleChanged = true; } if (patch.sz !== undefined) { data.sz = patch.sz; scaleChanged = true; } + // Плотность studs (мелкие/крупные кружки) — требует пересоздания меша + // (faceUV для куба зашит в геометрию). + if (patch.studDensity !== undefined) { + data.studDensity = Number.isFinite(patch.studDensity) ? patch.studDensity : 1; + scaleChanged = true; + } if (scaleChanged) { // Поскольку MeshBuilder уже создал mesh с базовыми размерами, // изменения через scaling кажутся правильными. Простой способ — @@ -749,7 +796,7 @@ export class PrimitiveManager { const oldMat = oldMesh.material; const typeDef = getPrimitiveType(data.type); - const newMesh = this._createMeshForType(typeDef, data.id, data.sx, data.sy, data.sz); + const newMesh = this._createMeshForType(typeDef, data.id, data.sx, data.sy, data.sz, data.material, data.studDensity); newMesh.position = oldPos; if (oldRot) newMesh.rotation = oldRot; newMesh.material = oldMat; @@ -762,14 +809,22 @@ export class PrimitiveManager { catch (e) { /* ignore */ } data.mesh = newMesh; - newMesh._studsDims = { type: data.type, sx: data.sx, sy: data.sy, sz: data.sz }; + newMesh._studsDims = { type: data.type, sx: data.sx, sy: data.sy, sz: data.sz, density: data.studDensity }; + // studs-материал: пересчитать тайлинг под новый размер меша. + // Куб уже пересоздан с новым faceUV (тайлинг в геометрии) — uScale=1. + // Для остальных форм пересчитываем uScale/vScale по размеру. if (data.material === 'studs' && oldMat && oldMat.diffuseTexture) { - const tile = _studsTiling(data.type, data.sx, data.sy, data.sz); - oldMat.diffuseTexture.uScale = tile.u; - oldMat.diffuseTexture.vScale = tile.v; - if (oldMat.bumpTexture) { - oldMat.bumpTexture.uScale = tile.u; - oldMat.bumpTexture.vScale = tile.v; + if (data.type === 'cube' || data.type === 'trigger') { + oldMat.diffuseTexture.uScale = oldMat.diffuseTexture.vScale = 1; + if (oldMat.bumpTexture) oldMat.bumpTexture.uScale = oldMat.bumpTexture.vScale = 1; + } else { + const tile = _studsTiling(data.type, data.sx, data.sy, data.sz, data.studDensity); + oldMat.diffuseTexture.uScale = tile.u; + oldMat.diffuseTexture.vScale = tile.v; + if (oldMat.bumpTexture) { + oldMat.bumpTexture.uScale = tile.u; + oldMat.bumpTexture.vScale = tile.v; + } } } } @@ -820,6 +875,8 @@ export class PrimitiveManager { ...(d.locked ? { locked: true } : {}), // id пользовательской текстуры (картинка из AssetManager). ...(d.textureAsset ? { textureAsset: d.textureAsset } : {}), + // Плотность studs (если не 1) — мелкие/крупные кружки. + ...(d.studDensity && d.studDensity !== 1 ? { studDensity: d.studDensity } : {}), // Параметры лампы (только для type='light', иначе undefined) ...(d.light ? { brightness: d.brightness, range: d.range } : {}), // Параметр эмиттера (только для type='emitter') -- 2.47.2 From 8504549928616c8fbd44f6bebd2d1c175dd44a99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=98=D0=9D?= Date: Sun, 31 May 2026 13:37:44 +0300 Subject: [PATCH 4/4] =?UTF-8?q?fix(09):=20=5FrecreateMesh=20studs=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D1=91=D1=82=20?= =?UTF-8?q?=D0=BC=D0=B0=D1=82=D0=B5=D1=80=D0=B8=D0=B0=D0=BB=20(=D0=BF?= =?UTF-8?q?=D0=B0=D1=80=D0=B8=D1=82=D0=B5=D1=82=20=D1=81=D0=BE=20=D1=81?= =?UTF-8?q?=D1=82=D1=83=D0=B4=D0=B8=D0=B5=D0=B9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 --- src/engine/PrimitiveManager.js | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/src/engine/PrimitiveManager.js b/src/engine/PrimitiveManager.js index 8b6b38a..ad2f045 100644 --- a/src/engine/PrimitiveManager.js +++ b/src/engine/PrimitiveManager.js @@ -799,7 +799,14 @@ export class PrimitiveManager { const newMesh = this._createMeshForType(typeDef, data.id, data.sx, data.sy, data.sz, data.material, data.studDensity); newMesh.position = oldPos; if (oldRot) newMesh.rotation = oldRot; - newMesh.material = oldMat; + // studs — материал пересоздаём заново (свежий faceUV/тайлинг). Иначе перенос. + if (data.material === 'studs') { + newMesh._studsDims = { type: data.type, sx: data.sx, sy: data.sy, sz: data.sz, density: data.studDensity }; + this._applyMaterial(newMesh, typeDef, data.color, data.material); + try { oldMat?.dispose(); } catch (e) { /* ignore */ } + } else { + newMesh.material = oldMat; + } newMesh.isPickable = true; newMesh.metadata = { ...oldMesh.metadata }; newMesh.setEnabled(data.visible); @@ -809,24 +816,7 @@ export class PrimitiveManager { catch (e) { /* ignore */ } data.mesh = newMesh; - newMesh._studsDims = { type: data.type, sx: data.sx, sy: data.sy, sz: data.sz, density: data.studDensity }; - // studs-материал: пересчитать тайлинг под новый размер меша. - // Куб уже пересоздан с новым faceUV (тайлинг в геометрии) — uScale=1. - // Для остальных форм пересчитываем uScale/vScale по размеру. - if (data.material === 'studs' && oldMat && oldMat.diffuseTexture) { - if (data.type === 'cube' || data.type === 'trigger') { - oldMat.diffuseTexture.uScale = oldMat.diffuseTexture.vScale = 1; - if (oldMat.bumpTexture) oldMat.bumpTexture.uScale = oldMat.bumpTexture.vScale = 1; - } else { - const tile = _studsTiling(data.type, data.sx, data.sy, data.sz, data.studDensity); - oldMat.diffuseTexture.uScale = tile.u; - oldMat.diffuseTexture.vScale = tile.v; - if (oldMat.bumpTexture) { - oldMat.bumpTexture.uScale = tile.u; - oldMat.bumpTexture.vScale = tile.v; - } - } - } + // _studsDims и материал studs уже выставлены выше. } /** Удалить инстанс. */ -- 2.47.2