import { useState } from 'react';
import { BadgeCheck, CheckCircle2, Mountain, Plus } from 'lucide-react';
import { Button, Select } from '../../components/ui';
import {
CERTIFIED_MAP_ASSETS,
MAP_ASSET_DRAG_MIME,
MAP_ASSET_PLACEMENT_MIME,
} from '../../map/editor/assetCatalog';
import {
MAP_OBJECT_PLACEMENT_LABELS,
type EditableMapDocument,
type EditableMapObjectType,
type MapObjectPlacementMode,
} from '../../map/editor/types';
import {
PHYSICAL_MAP_PRESET_LABELS,
SYSTEM_TERRAIN_PRESETS,
type SystemTerrainPreset,
} from '../../map/types';
function AssetPreview({ type, color }: { type: EditableMapObjectType; color: string }) {
const shape =
type === 'cylinder'
? 'h-9 w-9 rounded-full'
: type === 'capsule'
? 'h-10 w-6 rounded-full'
: type === 'ramp'
? 'h-0 w-0 border-b-[34px] border-l-[48px] border-l-transparent'
: type === 'stairs'
? 'h-9 w-11 [clip-path:polygon(0_100%,0_66%,34%_66%,34%_33%,67%_33%,67%_0,100%_0,100%_100%)]'
: 'h-9 w-9 rounded-sm';
return (
);
}
function TerrainPreview({ preset }: { preset: SystemTerrainPreset }) {
const grid = (
);
let shape;
if (preset === 'discrete_obstacles')
shape = (
);
else if (preset === 'gap')
shape = (
);
else if (preset === 'inverted_pyramid_stairs' || preset === 'pit')
shape = (
{preset === 'inverted_pyramid_stairs' && (
)}
);
else if (preset === 'pyramid_stairs')
shape = (
);
else if (preset === 'rails')
shape = (
);
else if (preset === 'rough')
shape = (
);
else if (preset === 'stepping_stones')
shape = (
);
else
shape = (
);
return (
);
}
function AddAction({ label }: { label: string }) {
return (
{label}
);
}
export function MapAssetLibrary({
disabled,
terrainSize,
document,
onAdd,
onSelectTerrain,
onSelectObject,
}: {
disabled: boolean;
terrainSize: number;
document?: EditableMapDocument | null;
onAdd: (
type: EditableMapObjectType,
placementMode: MapObjectPlacementMode,
) => void | Promise;
onSelectTerrain: (preset: SystemTerrainPreset) => void;
onSelectObject?: (id: string) => void;
}) {
const [placementMode, setPlacementMode] = useState('auto_ground');
return (
场景结构
{document?.objects.length ?? 0} 个对象
{document?.objects.length ? (
{document.objects.map((object) => (
))}
) : (
选择工程地图后,这里显示场景对象层级;可从下方资产库创建场景。
)}
{CERTIFIED_MAP_ASSETS.map((asset) => (
{
if (disabled) {
event.preventDefault();
return;
}
event.dataTransfer.effectAllowed = 'copy';
event.dataTransfer.setData(MAP_ASSET_DRAG_MIME, asset.type);
event.dataTransfer.setData(MAP_ASSET_PLACEMENT_MIME, placementMode);
event.dataTransfer.setData('text/plain', asset.name);
}}
>
{asset.name}
{asset.description}
))}
系统参数化地形
本地确定性生成;点击“添加”后在右侧“地图”调整尺寸、难度和随机种子。
{SYSTEM_TERRAIN_PRESETS.map((preset) => (
{PHYSICAL_MAP_PRESET_LABELS[preset]}
{terrainSize.toFixed(2)} × {terrainSize.toFixed(2)} m
))}
);
}