@vgai/editor 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/README.md +35 -0
- package/dist/a/b/c/test-nested.json +1 -0
- package/dist/assets/CCDIKSolver-Dz-ysxZF.js +1 -0
- package/dist/assets/SelectionBox-BXsv_6aH.js +1 -0
- package/dist/assets/browser-project-scripts-DOru4L1x.js +2 -0
- package/dist/assets/browserAll-CEkWYlFk.js +1 -0
- package/dist/assets/collision-world-DniMB0qq.glb +0 -0
- package/dist/assets/create-runtime-DYIWr3va.js +1 -0
- package/dist/assets/data-asset-Bb9sIM7i.js +5 -0
- package/dist/assets/esbuild-BHljloGq.wasm +0 -0
- package/dist/assets/fake-three-BMTQ9rl_.js +1 -0
- package/dist/assets/game-8SDZPPgH.js +1 -0
- package/dist/assets/game-BI111o5f.js +10 -0
- package/dist/assets/game-CevorxyV.js +1 -0
- package/dist/assets/game-Di1H0gFj.js +1 -0
- package/dist/assets/game-Di7XlywD.js +1 -0
- package/dist/assets/game-DjnCaw8R.js +1 -0
- package/dist/assets/game-Q9A0aXSV.js +1 -0
- package/dist/assets/game-pt_1lQLv.js +1 -0
- package/dist/assets/game-source-CvidN7AB.js +1 -0
- package/dist/assets/game-xsOho_wg.js +83 -0
- package/dist/assets/index-Bp5cecD6.js +12 -0
- package/dist/assets/index-CPVV6pjw.js +1 -0
- package/dist/assets/index-CpOnYyeD.js +213 -0
- package/dist/assets/index-Cs8xwv3e.js +1 -0
- package/dist/assets/index-DL7RcQ0n.js +27 -0
- package/dist/assets/index-Dr8H_6Rl.js +1 -0
- package/dist/assets/index-_bCaipUk.js +13650 -0
- package/dist/assets/ingest-siblings-Dz8eEqrV.js +1 -0
- package/dist/assets/mount-manifest-Bhk0ohsl.js +1 -0
- package/dist/assets/recast-navigation.wasm-compat-CvP4UGK6.js +1 -0
- package/dist/assets/scene-query-BivAHhJu.js +1 -0
- package/dist/assets/stats.module--VATS4Kh.js +1 -0
- package/dist/assets/webworkerAll-BLrH0F6F.js +1 -0
- package/dist/assets/xstate-animation-binding-1NGLmw6y.js +1 -0
- package/dist/assets/xstate.esm-BgUD33nl.js +3 -0
- package/dist/index.html +37 -0
- package/dist/ingest/racing-game/UPSTREAM.md +68 -0
- package/dist/ingest/racing-game/a/Inter-Black.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-Black.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-BlackItalic.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-BlackItalic.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-Bold.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-Bold.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-BoldItalic.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-BoldItalic.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-ExtraBold.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-ExtraBold.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-ExtraBoldItalic.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-ExtraBoldItalic.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-ExtraLight.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-ExtraLight.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-ExtraLightItalic.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-ExtraLightItalic.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-Italic.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-Italic.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-Light.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-Light.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-LightItalic.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-LightItalic.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-Medium.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-Medium.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-MediumItalic.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-MediumItalic.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-Regular.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-Regular.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-SemiBold.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-SemiBold.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-SemiBoldItalic.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-SemiBoldItalic.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-Thin.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-Thin.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-ThinItalic.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-ThinItalic.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-italic.var.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-roman.var.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter.var.woff2 +0 -0
- package/dist/ingest/racing-game/a/index.css +1 -0
- package/dist/ingest/racing-game/images/bronze.png +0 -0
- package/dist/ingest/racing-game/images/gold.png +0 -0
- package/dist/ingest/racing-game/images/silver.png +0 -0
- package/dist/ingest/racing-game/index.html +15 -0
- package/dist/ingest/racing-game/models/chassis-draco.glb +0 -0
- package/dist/ingest/racing-game/models/track-draco.glb +0 -0
- package/dist/ingest/racing-game/models/wheel-draco.glb +0 -0
- package/dist/ingest/racing-game/rg-entry.js +1 -0
- package/dist/ingest/racing-game/sounds/accelerate.mp3 +0 -0
- package/dist/ingest/racing-game/sounds/boost.mp3 +0 -0
- package/dist/ingest/racing-game/sounds/crash.mp3 +0 -0
- package/dist/ingest/racing-game/sounds/engine.mp3 +0 -0
- package/dist/ingest/racing-game/sounds/honk.mp3 +0 -0
- package/dist/ingest/racing-game/sounds/tire-brake.mp3 +0 -0
- package/dist/ingest/racing-game/sounds/train.mp3 +0 -0
- package/dist/ingest/racing-game/sounds/water.mp3 +0 -0
- package/dist/ingest/racing-game/textures/cursor.svg +3 -0
- package/dist/ingest/racing-game/textures/dikhololo_night_1k.hdr +0 -0
- package/dist/ingest/racing-game/textures/heightmap_1024.png +0 -0
- package/dist/ingest/racing-game/textures/mask.svg +11 -0
- package/dist/ingest/racing-game/textures/no_sound.png +0 -0
- package/dist/ingest/racing-game/three-r139.module.js +50617 -0
- package/dist/ingest/racing-game/vendor.js +179 -0
- package/dist/ingest/racing-game/vgai.game.json +20 -0
- package/dist/ingest/simcity/UPSTREAM.md +65 -0
- package/dist/ingest/simcity/favicon.ico +0 -0
- package/dist/ingest/simcity/fonts/Bebas-Regular.otf +0 -0
- package/dist/ingest/simcity/fonts/Digitalt.otf +0 -0
- package/dist/ingest/simcity/fonts/Stanberry.ttf +0 -0
- package/dist/ingest/simcity/icons/bulldozer-color.png +0 -0
- package/dist/ingest/simcity/icons/bulldozer.png +0 -0
- package/dist/ingest/simcity/icons/calendar.png +0 -0
- package/dist/ingest/simcity/icons/factory-color.png +0 -0
- package/dist/ingest/simcity/icons/factory.png +0 -0
- package/dist/ingest/simcity/icons/house-color.png +0 -0
- package/dist/ingest/simcity/icons/house.png +0 -0
- package/dist/ingest/simcity/icons/job.png +0 -0
- package/dist/ingest/simcity/icons/office.png +0 -0
- package/dist/ingest/simcity/icons/pause-color.png +0 -0
- package/dist/ingest/simcity/icons/pause.png +0 -0
- package/dist/ingest/simcity/icons/person.png +0 -0
- package/dist/ingest/simcity/icons/play-color.png +0 -0
- package/dist/ingest/simcity/icons/play.png +0 -0
- package/dist/ingest/simcity/icons/power-color.png +0 -0
- package/dist/ingest/simcity/icons/power-line-color.png +0 -0
- package/dist/ingest/simcity/icons/power.png +0 -0
- package/dist/ingest/simcity/icons/road-color.png +0 -0
- package/dist/ingest/simcity/icons/road.png +0 -0
- package/dist/ingest/simcity/icons/select-color.png +0 -0
- package/dist/ingest/simcity/icons/select.png +0 -0
- package/dist/ingest/simcity/icons/store-color.png +0 -0
- package/dist/ingest/simcity/index.html +94 -0
- package/dist/ingest/simcity/index.js +58 -0
- package/dist/ingest/simcity/main.css +233 -0
- package/dist/ingest/simcity/models/armored-truck.glb +0 -0
- package/dist/ingest/simcity/models/building-block-4floor-corner.glb +0 -0
- package/dist/ingest/simcity/models/building-block-4floor-short.glb +0 -0
- package/dist/ingest/simcity/models/building-block-5floor.glb +0 -0
- package/dist/ingest/simcity/models/building-burger-joint.glb +0 -0
- package/dist/ingest/simcity/models/building-cafe.glb +0 -0
- package/dist/ingest/simcity/models/building-casino.glb +0 -0
- package/dist/ingest/simcity/models/building-cinema.glb +0 -0
- package/dist/ingest/simcity/models/building-house-block-big.glb +0 -0
- package/dist/ingest/simcity/models/building-house-family-large.glb +0 -0
- package/dist/ingest/simcity/models/building-house-family-small.glb +0 -0
- package/dist/ingest/simcity/models/building-office-balcony.glb +0 -0
- package/dist/ingest/simcity/models/building-office-big.glb +0 -0
- package/dist/ingest/simcity/models/building-office-pyramid.glb +0 -0
- package/dist/ingest/simcity/models/building-office-tall.glb +0 -0
- package/dist/ingest/simcity/models/building-office.glb +0 -0
- package/dist/ingest/simcity/models/building-restaurant.glb +0 -0
- package/dist/ingest/simcity/models/building-skyscraper.glb +0 -0
- package/dist/ingest/simcity/models/car-ambulance-pickup.glb +0 -0
- package/dist/ingest/simcity/models/car-baywatch.glb +0 -0
- package/dist/ingest/simcity/models/car-hippie-van.glb +0 -0
- package/dist/ingest/simcity/models/car-passenger-race.glb +0 -0
- package/dist/ingest/simcity/models/car-passenger.glb +0 -0
- package/dist/ingest/simcity/models/car-police.glb +0 -0
- package/dist/ingest/simcity/models/car-taxi.glb +0 -0
- package/dist/ingest/simcity/models/car-tow-truck.glb +0 -0
- package/dist/ingest/simcity/models/car-truck-dump.glb +0 -0
- package/dist/ingest/simcity/models/car-veteran.glb +0 -0
- package/dist/ingest/simcity/models/construction-small.glb +0 -0
- package/dist/ingest/simcity/models/data-center.glb +0 -0
- package/dist/ingest/simcity/models/industry-factory-old.glb +0 -0
- package/dist/ingest/simcity/models/industry-factory.glb +0 -0
- package/dist/ingest/simcity/models/industry-refinery.glb +0 -0
- package/dist/ingest/simcity/models/industry-warehouse.glb +0 -0
- package/dist/ingest/simcity/models/power_line_pole_modified.glb +0 -0
- package/dist/ingest/simcity/models/tile-plain_grass.glb +0 -0
- package/dist/ingest/simcity/models/tile-road-curve.glb +0 -0
- package/dist/ingest/simcity/models/tile-road-end.glb +0 -0
- package/dist/ingest/simcity/models/tile-road-intersection-t.glb +0 -0
- package/dist/ingest/simcity/models/tile-road-intersection.glb +0 -0
- package/dist/ingest/simcity/models/tile-road-straight.glb +0 -0
- package/dist/ingest/simcity/models/truck.glb +0 -0
- package/dist/ingest/simcity/statusIcons/no-power.png +0 -0
- package/dist/ingest/simcity/statusIcons/no-road-access.png +0 -0
- package/dist/ingest/simcity/textures/base.png +0 -0
- package/dist/ingest/simcity/textures/grid.png +0 -0
- package/dist/ingest/simcity/textures/specular.png +0 -0
- package/dist/ingest/simcity/three-r155.module.js +51466 -0
- package/dist/ingest/simcity/vgai.game.json +20 -0
- package/dist/ingest/tanks/UPSTREAM.md +69 -0
- package/dist/ingest/tanks/index.html +214 -0
- package/dist/ingest/tanks/models/pixelTank.fbx +0 -0
- package/dist/ingest/tanks/tanks-entry.js +92 -0
- package/dist/ingest/tanks/three-r170.module.js +54571 -0
- package/dist/ingest/tanks/vgai.game.json +20 -0
- package/dist/inputmaps/default.inputmap.json +41 -0
- package/dist/jsm/libs/draco/gltf/draco_decoder.js +33 -0
- package/dist/jsm/libs/draco/gltf/draco_decoder.wasm +0 -0
- package/dist/jsm/libs/draco/gltf/draco_wasm_wrapper.js +116 -0
- package/dist/scenes/untitled.vscn.json +29 -0
- package/dist/textures/waternormals.jpg +0 -0
- package/dist-server/packaged.mjs +18155 -0
- package/package.json +36 -0
- package/server/asset-library-routes.ts +833 -0
- package/server/canonical-path.ts +50 -0
- package/server/cloud-asset-catalog.ts +101 -0
- package/server/dev.ts +350 -0
- package/server/editor-server.ts +1537 -0
- package/server/editor-sse.ts +73 -0
- package/server/game-globals-shadow.ts +58 -0
- package/server/local-asset-catalog.ts +163 -0
- package/server/packaged.ts +571 -0
- package/server/prod.ts +75 -0
- package/server/project-optimize-deps-entries.ts +149 -0
- package/server/project-view.ts +65 -0
- package/server/server-utils.ts +430 -0
- package/server/session-registry.ts +93 -0
- package/src/EditorContext.tsx +87 -0
- package/src/achieved-tier.ts +126 -0
- package/src/action-registry.ts +268 -0
- package/src/adapter-resolver.ts +1858 -0
- package/src/asset-events.ts +100 -0
- package/src/authoring/active-adapter.ts +98 -0
- package/src/authoring/active-systems.ts +50 -0
- package/src/authoring/boundary-authoring-adapter.ts +178 -0
- package/src/authoring/composite-authoring-adapter.ts +891 -0
- package/src/authoring/design-time-layers.ts +776 -0
- package/src/authoring/edit-mode-authoring.ts +643 -0
- package/src/authoring/embed-only-adapter.ts +57 -0
- package/src/authoring/ephemeral-persistence.ts +26 -0
- package/src/authoring/eyedropper-session.ts +69 -0
- package/src/authoring/first-party-hierarchy-menu.ts +74 -0
- package/src/authoring/first-party-inspector/AddSectionMenu.tsx +118 -0
- package/src/authoring/first-party-inspector/EnvironmentSection.tsx +550 -0
- package/src/authoring/first-party-inspector/HeaderSection.tsx +329 -0
- package/src/authoring/first-party-inspector/is-first-party-selection.ts +44 -0
- package/src/authoring/first-party-inspector/register.tsx +108 -0
- package/src/authoring/ingest-authoring-adapter.ts +475 -0
- package/src/authoring/ingest-capture.ts +94 -0
- package/src/authoring/ingest-game-adapter.ts +291 -0
- package/src/authoring/ingest-iframe-adapter.ts +38 -0
- package/src/authoring/ingest-iframe-reachable-adapter.ts +401 -0
- package/src/authoring/ingest-overlay.ts +193 -0
- package/src/authoring/layered-pick.ts +87 -0
- package/src/authoring/mount-failure-report.ts +112 -0
- package/src/authoring/overlay-report.ts +52 -0
- package/src/authoring/project-scenes.ts +111 -0
- package/src/authoring/react-dom-authoring-adapter.ts +795 -0
- package/src/authoring/react-inspector-section.tsx +1041 -0
- package/src/authoring/react-world-authoring-adapter.ts +2400 -0
- package/src/authoring/root-activation.ts +61 -0
- package/src/authoring/scene-ui-layer.ts +485 -0
- package/src/authoring/story-overlay.ts +48 -0
- package/src/authoring/ui-authoring-adapter.ts +325 -0
- package/src/authoring/ui-hierarchy-menu.ts +40 -0
- package/src/authoring/ui-inspector-sections.tsx +156 -0
- package/src/authoring/undo-timeline.ts +145 -0
- package/src/authoring/vgai-scene-authoring-adapter.ts +746 -0
- package/src/authoring/viewport-pick-context.ts +31 -0
- package/src/authoring/viewport-raycast.ts +80 -0
- package/src/authoring/world-overlay.ts +76 -0
- package/src/authoring/world-pan-state.ts +115 -0
- package/src/authoring/world-session-state.ts +102 -0
- package/src/authoring/world2d-authoring-adapter.ts +313 -0
- package/src/browser-external-watch.ts +98 -0
- package/src/browser-play-entry.ts +112 -0
- package/src/browser-project-scripts.ts +112 -0
- package/src/browser-transpile.ts +246 -0
- package/src/browser-watch-reload.ts +100 -0
- package/src/command-listener.ts +326 -0
- package/src/components/AlignToolbar.tsx +189 -0
- package/src/components/AppRoot.tsx +73 -0
- package/src/components/AssetBrowser.tsx +502 -0
- package/src/components/BottomPanel.tsx +326 -0
- package/src/components/BuildPanel.tsx +455 -0
- package/src/components/CameraInfo.tsx +56 -0
- package/src/components/CommandPalette.tsx +265 -0
- package/src/components/ConsolePanel.tsx +272 -0
- package/src/components/DataPanel.tsx +1268 -0
- package/src/components/DefaultEditorLayout.tsx +509 -0
- package/src/components/FolderTree.tsx +179 -0
- package/src/components/GameHierarchy.tsx +1349 -0
- package/src/components/Inspector.tsx +671 -0
- package/src/components/InspectorToolSection.tsx +74 -0
- package/src/components/MountFailureBanner.tsx +110 -0
- package/src/components/NetworkSection.tsx +109 -0
- package/src/components/OnlineAssetBrowser.tsx +448 -0
- package/src/components/OverlayReportBanner.tsx +122 -0
- package/src/components/PlayBar.tsx +356 -0
- package/src/components/PrefabSaveDialog.tsx +201 -0
- package/src/components/ProjectHeader.tsx +174 -0
- package/src/components/ProjectScreen.tsx +1004 -0
- package/src/components/RightPanel.tsx +166 -0
- package/src/components/RootActivateDialog.tsx +105 -0
- package/src/components/SaveDialog.tsx +197 -0
- package/src/components/SaveStatus.tsx +69 -0
- package/src/components/StatsOverlay.tsx +35 -0
- package/src/components/ToolHost.tsx +80 -0
- package/src/components/Toolbar.tsx +307 -0
- package/src/components/ViewportOverlay.tsx +234 -0
- package/src/components/ViewportPanel.tsx +369 -0
- package/src/components/WorldContextMenu.tsx +257 -0
- package/src/components/WorldSelectionOverlay.tsx +2003 -0
- package/src/components/WorldTextEditor.tsx +86 -0
- package/src/components/asset-viewers/AssetViewer.tsx +38 -0
- package/src/components/asset-viewers/AudioViewer.tsx +149 -0
- package/src/components/asset-viewers/GenericJsonViewer.tsx +77 -0
- package/src/components/asset-viewers/ImageViewer.tsx +65 -0
- package/src/components/asset-viewers/InputMapViewer.tsx +206 -0
- package/src/components/asset-viewers/ModelViewer.tsx +180 -0
- package/src/components/asset-viewers/OnlineAssetDetail.tsx +236 -0
- package/src/components/data-csv.ts +301 -0
- package/src/components/entity-name-commit.ts +18 -0
- package/src/components/inspector-property-grouping.ts +65 -0
- package/src/components/inspector-widgets/AlignmentGrid.tsx +188 -0
- package/src/components/inspector-widgets/BorderEditor.tsx +305 -0
- package/src/components/inspector-widgets/ColorPicker.tsx +548 -0
- package/src/components/inspector-widgets/FilterEditor.tsx +108 -0
- package/src/components/inspector-widgets/FontPicker.tsx +196 -0
- package/src/components/inspector-widgets/GradientEditor.tsx +277 -0
- package/src/components/inspector-widgets/ScrubbableInput.tsx +152 -0
- package/src/components/inspector-widgets/ShadowEditor.tsx +332 -0
- package/src/components/inspector-widgets/color-utils.ts +202 -0
- package/src/components/inspector-widgets/gallery-main.tsx +167 -0
- package/src/components/inspector-widgets/index.ts +22 -0
- package/src/components/inspector-widgets/shared.tsx +135 -0
- package/src/components/inspectors/AnimationSection.tsx +143 -0
- package/src/components/inspectors/AudioSection.tsx +215 -0
- package/src/components/inspectors/BoneAttachmentSection.tsx +82 -0
- package/src/components/inspectors/CameraSection.tsx +105 -0
- package/src/components/inspectors/ComponentsSection.tsx +358 -0
- package/src/components/inspectors/JointsSection.tsx +255 -0
- package/src/components/inspectors/LightSection.tsx +116 -0
- package/src/components/inspectors/MaterialSection.tsx +1189 -0
- package/src/components/inspectors/MeshSection.tsx +99 -0
- package/src/components/inspectors/NavigationSection.tsx +58 -0
- package/src/components/inspectors/ParticleSection.tsx +681 -0
- package/src/components/inspectors/PhysicsSection.tsx +326 -0
- package/src/components/inspectors/PostProcessingSection.tsx +1290 -0
- package/src/components/inspectors/RenderingSection.tsx +109 -0
- package/src/components/inspectors/ShadowSection.tsx +84 -0
- package/src/components/inspectors/SplineSection.tsx +191 -0
- package/src/components/inspectors/TransformSection.tsx +191 -0
- package/src/components/inspectors/json-schema-fields.ts +281 -0
- package/src/components/inspectors/multi-edit-utils.ts +49 -0
- package/src/components/inspectors/zod-fields.ts +184 -0
- package/src/components/primitives/ColorInput.tsx +109 -0
- package/src/components/primitives/JsonInput.tsx +98 -0
- package/src/components/primitives/NumberInput.tsx +164 -0
- package/src/components/primitives/Panel.tsx +68 -0
- package/src/components/primitives/SectionHeader.tsx +45 -0
- package/src/components/primitives/Tooltip.tsx +82 -0
- package/src/components/primitives/Vec3Input.tsx +62 -0
- package/src/components/world-overlay-gestures.ts +1438 -0
- package/src/doctor/data-checks.ts +285 -0
- package/src/doctor/report.ts +386 -0
- package/src/editor-api.ts +700 -0
- package/src/editor-console.ts +194 -0
- package/src/editor-hotkeys.ts +441 -0
- package/src/editor-layers.ts +2 -0
- package/src/editor-mode.ts +28 -0
- package/src/editor-store.ts +2225 -0
- package/src/editor-viewport.ts +1924 -0
- package/src/entity-factory.ts +221 -0
- package/src/game-globals-prelude.ts +27 -0
- package/src/gated-globals.ts +131 -0
- package/src/generated/setup-by-example.generated.ts +53 -0
- package/src/gizmo-registry.ts +608 -0
- package/src/handle-system.ts +221 -0
- package/src/hierarchy-menu-registry.ts +70 -0
- package/src/hierarchy-rows.ts +73 -0
- package/src/hosted-example.ts +160 -0
- package/src/hotkeys.ts +142 -0
- package/src/ingest/discovery-react.ts +132 -0
- package/src/ingest/discovery.ts +205 -0
- package/src/ingest/discovery2d.ts +204 -0
- package/src/ingest/esm-entry-resolution.ts +102 -0
- package/src/ingest/games/bloom-composer/game.js +99 -0
- package/src/ingest/games/bloom-composer/vgai.game.json +21 -0
- package/src/ingest/games/embed-bundle/embed.html +10 -0
- package/src/ingest/games/embed-bundle/vgai.game.json +21 -0
- package/src/ingest/games/games-fps/assets/collision-world.glb +0 -0
- package/src/ingest/games/games-fps/game.js +479 -0
- package/src/ingest/games/games-fps/vgai.game.json +24 -0
- package/src/ingest/games/iframe-reachable/game-source.js +58 -0
- package/src/ingest/games/iframe-reachable/vgai.game.json +21 -0
- package/src/ingest/games/interactive-cubes/game.js +139 -0
- package/src/ingest/games/interactive-cubes/vgai.game.json +21 -0
- package/src/ingest/games/mismatched-three/fake-three.js +38 -0
- package/src/ingest/games/mismatched-three/game.js +10 -0
- package/src/ingest/games/mismatched-three/vgai.game.json +22 -0
- package/src/ingest/games/own-three-bundled/game.js +43 -0
- package/src/ingest/games/own-three-bundled/vgai.game.json +21 -0
- package/src/ingest/games/pointerlock-maze/game.js +288 -0
- package/src/ingest/games/pointerlock-maze/vgai.game.json +22 -0
- package/src/ingest/games-2d/_fixtures/first-party-scene.scn2d.json +124 -0
- package/src/ingest/games-2d/bubbo-bubbo/vgai.game.json +25 -0
- package/src/ingest/games-2d/bunnymark/game.ts +88 -0
- package/src/ingest/games-2d/bunnymark/vgai.game.json +21 -0
- package/src/ingest/games-2d/flappy/game.ts +148 -0
- package/src/ingest/games-2d/flappy/vgai.game.json +21 -0
- package/src/ingest/games-2d/flappy-pixi/vgai.game.json +25 -0
- package/src/ingest/games-2d/puzzling-potions/vgai.game.json +25 -0
- package/src/ingest/games-2d/tilemap-camera/game.ts +115 -0
- package/src/ingest/games-2d/tilemap-camera/vgai.game.json +21 -0
- package/src/ingest/games-react/react-rpg/entry.tsx +185 -0
- package/src/ingest/games-react/react-rpg/shims.d.ts +26 -0
- package/src/ingest/games-react/react-rpg/src/ui/game-state.tsx +129 -0
- package/src/ingest/games-react/react-rpg/vgai.game.json +21 -0
- package/src/ingest/host-namespace-registry.ts +196 -0
- package/src/ingest/types.ts +127 -0
- package/src/ingest-hierarchy-rows.ts +207 -0
- package/src/ingest-mode.ts +2092 -0
- package/src/ingest-siblings.ts +466 -0
- package/src/initial-scene.ts +194 -0
- package/src/inspector-section-registry.ts +117 -0
- package/src/interactive-edit-scope.ts +34 -0
- package/src/main.tsx +23 -0
- package/src/manifest-project.ts +43 -0
- package/src/model-thumbnail.ts +156 -0
- package/src/module-mode.ts +513 -0
- package/src/navmesh-handler.ts +94 -0
- package/src/packaged-runtime.ts +49 -0
- package/src/play-mode.ts +1148 -0
- package/src/playground/main.ts +206 -0
- package/src/project-manager.ts +173 -0
- package/src/scene-diff.ts +112 -0
- package/src/scene-serializer.ts +144 -0
- package/src/scene-sync.ts +587 -0
- package/src/scene-ui-mode/active-scene-ui.ts +58 -0
- package/src/scene-ui-mode/scene-ui-palette-panel.tsx +152 -0
- package/src/scene-ui-mode/scene-ui-timeline-tab.tsx +29 -0
- package/src/scene-ui-mode/ui-prefab-dialog-host.tsx +74 -0
- package/src/scene-ui-mode/ui-prefab-hierarchy-menu.ts +49 -0
- package/src/scene-ui-mode/ui-prefab-io.ts +76 -0
- package/src/script-loader.ts +143 -0
- package/src/storage/fsa-storage.ts +55 -0
- package/src/storage/handle-storage.ts +150 -0
- package/src/storage/handle-store.ts +116 -0
- package/src/storage/http-storage.ts +137 -0
- package/src/storage/index.ts +147 -0
- package/src/storage/mem-storage.ts +135 -0
- package/src/storage/opfs-storage.ts +25 -0
- package/src/storage/paths.ts +26 -0
- package/src/storage/seed.ts +106 -0
- package/src/storage/types.ts +110 -0
- package/src/tool-loader.ts +291 -0
- package/src/ui-editor/inspector.tsx +563 -0
- package/src/ui-editor/node-ops.ts +266 -0
- package/src/ui-editor/overlay.tsx +380 -0
- package/src/ui-editor/palette.tsx +114 -0
- package/src/ui-editor/react-store.ts +78 -0
- package/src/ui-editor/timeline-panel.tsx +443 -0
- package/src/ui-editor/ui-edit-store.ts +552 -0
- package/src/ui-editor/ui-prefab.ts +95 -0
- package/src/ui-source/inspect.ts +544 -0
- package/src/ui-source/oid-transform.ts +133 -0
- package/src/ui-source/source-write-backend.ts +203 -0
- package/src/ui-source/tailwind-map.ts +174 -0
- package/src/ui-source/writer.ts +1175 -0
- package/src/widgets/index.ts +73 -0
- package/template/.claude/skills/editor/SKILL.md +252 -0
- package/template/CLAUDE.md +512 -0
- package/template/LICENSE +30 -0
- package/template/emit-schemas.ts +42 -0
- package/template/index.html +17 -0
- package/template/package.json +53 -0
- package/template/project.json +9 -0
- package/template/public/audio/ambient-arena.wav +0 -0
- package/template/public/audio/ambient-music.wav +0 -0
- package/template/public/audio/ambient-nature.wav +0 -0
- package/template/public/audio/ambient-wind.wav +0 -0
- package/template/public/inputmaps/default.inputmap.json +41 -0
- package/template/public/jsm/libs/draco/gltf/draco_decoder.js +33 -0
- package/template/public/jsm/libs/draco/gltf/draco_decoder.wasm +0 -0
- package/template/public/jsm/libs/draco/gltf/draco_encoder.js +33 -0
- package/template/public/jsm/libs/draco/gltf/draco_wasm_wrapper.js +116 -0
- package/template/public/scenes/default.vscn.json +43 -0
- package/template/public/scenes/untitled.vscn.json +29 -0
- package/template/public/textures/waternormals.jpg +0 -0
- package/template/server/colyseus-setup.ts +85 -0
- package/template/server/main.ts +34 -0
- package/template/server/rooms/arena-room.ts +420 -0
- package/template/server/rooms/game-room.ts +162 -0
- package/template/server/rooms.ts +15 -0
- package/template/server/tsconfig.json +19 -0
- package/template/src/data/README.md +40 -0
- package/template/src/data/assets.ts +31 -0
- package/template/src/data/tuning.data.json +5 -0
- package/template/src/data/tuning.schema.json +21 -0
- package/template/src/data/tuning.schema.ts +34 -0
- package/template/src/data/tuning.ts +24 -0
- package/template/src/main.ts +157 -0
- package/template/src/scripts/components/data-spinner.ts +45 -0
- package/template/src/scripts/components/scene-camera.ts +40 -0
- package/template/src/scripts/main.ts +94 -0
- package/template/src/scripts/registry.ts +46 -0
- package/template/src/tools/README.md +14 -0
- package/template/src/tools/example.tool.tsx +91 -0
- package/template/src/tools/spin.tool.tsx +101 -0
- package/template/src/ui/Button.tsx +27 -0
- package/template/src/ui/DefaultHud.tsx +40 -0
- package/template/src/ui/KeyHint.tsx +25 -0
- package/template/src/ui/Panel.tsx +52 -0
- package/template/src/ui/RebindPanel.tsx +129 -0
- package/template/src/ui/Slider.tsx +28 -0
- package/template/src/ui/StatusDot.tsx +22 -0
- package/template/src/ui/Toggle.tsx +19 -0
- package/template/src/ui/game-state.tsx +37 -0
- package/template/src/ui/index.ts +7 -0
- package/template/src/ui/mount-default-hud.tsx +19 -0
- package/template/src/ui/mount-ui.ts +15 -0
- package/template/tsconfig.json +36 -0
- package/template/validate-asset-content.ts +78 -0
- package/template/validate-manifest.ts +55 -0
- package/template/validate-scenes.ts +211 -0
- package/template/vgai.game.json +21 -0
- package/template/vite.config.ts +128 -0
- package/vite-plugin-example-assets.ts +60 -0
- package/vite-plugin-game-globals.ts +46 -0
- package/vite-plugin-game-static.ts +71 -0
- package/vite-plugin-project-game-static.ts +84 -0
- package/vite-plugin-react-game-static.ts +98 -0
- package/vite-plugin-react-world-provider.ts +81 -0
- package/vite-plugin-react-world-runtime.ts +76 -0
- package/vite-plugin-ui-oid.ts +561 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"surface": "world2d",
|
|
4
|
+
"gravity": [0, 1400],
|
|
5
|
+
"background": "#10101a",
|
|
6
|
+
"entities": [
|
|
7
|
+
{
|
|
8
|
+
"name": "floor",
|
|
9
|
+
"transform2d": { "position": [400, 560] },
|
|
10
|
+
"sprite": { "tint": "#3a3a5a", "width": 760, "height": 40 },
|
|
11
|
+
"physics2d": {
|
|
12
|
+
"bodyType": "fixed",
|
|
13
|
+
"collider": { "shape": "cuboid", "halfExtents": [380, 20] }
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"name": "left-wall",
|
|
18
|
+
"transform2d": { "position": [30, 300] },
|
|
19
|
+
"sprite": { "tint": "#3a3a5a", "width": 40, "height": 560 },
|
|
20
|
+
"physics2d": {
|
|
21
|
+
"bodyType": "fixed",
|
|
22
|
+
"collider": { "shape": "cuboid", "halfExtents": [20, 280] }
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"name": "right-wall",
|
|
27
|
+
"transform2d": { "position": [770, 300] },
|
|
28
|
+
"sprite": { "tint": "#3a3a5a", "width": 40, "height": 560 },
|
|
29
|
+
"physics2d": {
|
|
30
|
+
"bodyType": "fixed",
|
|
31
|
+
"collider": { "shape": "cuboid", "halfExtents": [20, 280] }
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"name": "box-0",
|
|
36
|
+
"transform2d": { "position": [200, 80] },
|
|
37
|
+
"sprite": { "tint": "#ff6b6b", "width": 44, "height": 44 },
|
|
38
|
+
"physics2d": {
|
|
39
|
+
"bodyType": "dynamic",
|
|
40
|
+
"collider": { "shape": "cuboid", "halfExtents": [22, 22] },
|
|
41
|
+
"restitution": 0.4,
|
|
42
|
+
"friction": 0.6
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"name": "box-1",
|
|
47
|
+
"transform2d": { "position": [270, 130] },
|
|
48
|
+
"sprite": { "tint": "#4ecdc4", "width": 44, "height": 44 },
|
|
49
|
+
"physics2d": {
|
|
50
|
+
"bodyType": "dynamic",
|
|
51
|
+
"collider": { "shape": "cuboid", "halfExtents": [22, 22] },
|
|
52
|
+
"restitution": 0.4,
|
|
53
|
+
"friction": 0.6
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"name": "box-2",
|
|
58
|
+
"transform2d": { "position": [340, 180] },
|
|
59
|
+
"sprite": { "tint": "#ffd23f", "width": 44, "height": 44 },
|
|
60
|
+
"physics2d": {
|
|
61
|
+
"bodyType": "dynamic",
|
|
62
|
+
"collider": { "shape": "cuboid", "halfExtents": [22, 22] },
|
|
63
|
+
"restitution": 0.4,
|
|
64
|
+
"friction": 0.6
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"name": "box-3",
|
|
69
|
+
"transform2d": { "position": [410, 80] },
|
|
70
|
+
"sprite": { "tint": "#a06bff", "width": 44, "height": 44 },
|
|
71
|
+
"physics2d": {
|
|
72
|
+
"bodyType": "dynamic",
|
|
73
|
+
"collider": { "shape": "cuboid", "halfExtents": [22, 22] },
|
|
74
|
+
"restitution": 0.4,
|
|
75
|
+
"friction": 0.6
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"name": "box-4",
|
|
80
|
+
"transform2d": { "position": [480, 130] },
|
|
81
|
+
"sprite": { "tint": "#6bff95", "width": 44, "height": 44 },
|
|
82
|
+
"physics2d": {
|
|
83
|
+
"bodyType": "dynamic",
|
|
84
|
+
"collider": { "shape": "cuboid", "halfExtents": [22, 22] },
|
|
85
|
+
"restitution": 0.4,
|
|
86
|
+
"friction": 0.6
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"name": "box-5",
|
|
91
|
+
"transform2d": { "position": [550, 180] },
|
|
92
|
+
"sprite": { "tint": "#ff9f6b", "width": 44, "height": 44 },
|
|
93
|
+
"physics2d": {
|
|
94
|
+
"bodyType": "dynamic",
|
|
95
|
+
"collider": { "shape": "cuboid", "halfExtents": [22, 22] },
|
|
96
|
+
"restitution": 0.4,
|
|
97
|
+
"friction": 0.6
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"name": "player",
|
|
102
|
+
"transform2d": { "position": [120, 480] },
|
|
103
|
+
"sprite": { "tint": "#00d2ff", "width": 36, "height": 48 },
|
|
104
|
+
"physics2d": {
|
|
105
|
+
"bodyType": "dynamic",
|
|
106
|
+
"collider": { "shape": "cuboid", "halfExtents": [18, 24] },
|
|
107
|
+
"lockRotations": true,
|
|
108
|
+
"friction": 0.0
|
|
109
|
+
},
|
|
110
|
+
"components": { "PlayerController2D": { "speed": 260, "jump": 620 } }
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"name": "coin",
|
|
114
|
+
"transform2d": { "position": [650, 500] },
|
|
115
|
+
"sprite": { "tint": "#ffd23f", "width": 26, "height": 26 },
|
|
116
|
+
"physics2d": {
|
|
117
|
+
"bodyType": "fixed",
|
|
118
|
+
"sensor": true,
|
|
119
|
+
"collider": { "shape": "ball", "radius": 16 }
|
|
120
|
+
},
|
|
121
|
+
"components": { "Coin2D": {} }
|
|
122
|
+
}
|
|
123
|
+
]
|
|
124
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"manifestVersion": 1,
|
|
3
|
+
"name": "Bubbo Bubbo (real OSS game)",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"engine": {
|
|
6
|
+
"version": "0.1.0"
|
|
7
|
+
},
|
|
8
|
+
"worlds": [
|
|
9
|
+
{
|
|
10
|
+
"id": "bubbo-bubbo",
|
|
11
|
+
"kind": "pixijs",
|
|
12
|
+
"description": "REAL unmodified OSS PixiJS game — pixijs/open-games Bubbo Bubbo, vendored byte-for-byte under vendor/pixi-games/bubbo-bubbo (MIT) and mounted via the iframe-reachable-multi route (Track P). Requires the gitignored externalized bundle: run vendor/pixi-games/_host/build-bubbo.sh first.",
|
|
13
|
+
"adapter": {
|
|
14
|
+
"ingest": {
|
|
15
|
+
"strategy": "iframe-reachable",
|
|
16
|
+
"bundleUrl": "/pixi-game-static/bubbo-bubbo/bubbo-bubbo.mjs",
|
|
17
|
+
"baseHref": "/pixi-game-static/bubbo-bubbo/",
|
|
18
|
+
"assetBaseUrl": "/pixi-game-static/bubbo-bubbo/assets",
|
|
19
|
+
"extraDeps": ["@pixi/sound", "@pixi/ui", "gsap"],
|
|
20
|
+
"captureTimeoutMs": 30000
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
]
|
|
25
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bunnymark — the canonical PixiJS sprite-batching stress test, asset-light.
|
|
3
|
+
*
|
|
4
|
+
* UNMODIFIED-style PixiJS v8 program: owns its Application + ticker + canvas. The
|
|
5
|
+
* vgai world2d ingest trap captures its `stage` on the first rendered frame with
|
|
6
|
+
* ZERO edits to this file. Exercises: mass sprite rendering + automatic batching,
|
|
7
|
+
* ticker-driven animation.
|
|
8
|
+
*
|
|
9
|
+
* Moved from the retired world2d silo (`world2d-demo/games/bunnymark.ts`, T6.1
|
|
10
|
+
* slice 4, docs/MULTI-WORLD-DESIGN.md §1.H) to a per-folder ingest fixture
|
|
11
|
+
* (T3.3 discovery convention: this folder's `vgai.game.json` + this module,
|
|
12
|
+
* `entry: "game.ts"`). Runs TOP-LEVEL on import (not an exported `load()`) to
|
|
13
|
+
* match the in-tree three.js ingest fixtures' convention
|
|
14
|
+
* (`ingest/games/*\/game.js`) — `resolveIngest2DDescriptor`'s `load` thunk is a
|
|
15
|
+
* plain `() => import(modulePath)`, same as the three-side `resolveIngestDescriptor`.
|
|
16
|
+
*/
|
|
17
|
+
import { Application, Container, Graphics, Sprite } from 'pixi.js';
|
|
18
|
+
|
|
19
|
+
function container(): HTMLElement {
|
|
20
|
+
return (
|
|
21
|
+
(globalThis as { __world2dGameContainer?: HTMLElement }).__world2dGameContainer ?? document.body
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
void load();
|
|
26
|
+
|
|
27
|
+
async function load(): Promise<void> {
|
|
28
|
+
const app = new Application();
|
|
29
|
+
await app.init({ width: 800, height: 600, background: '#1a1a2e', antialias: false });
|
|
30
|
+
container().appendChild(app.canvas);
|
|
31
|
+
|
|
32
|
+
// Build a small bunny texture from a Graphics (no external asset needed).
|
|
33
|
+
const g = new Graphics()
|
|
34
|
+
.roundRect(0, 0, 26, 32, 6)
|
|
35
|
+
.fill('#ffd166')
|
|
36
|
+
.circle(8, 10, 3)
|
|
37
|
+
.fill('#222')
|
|
38
|
+
.circle(18, 10, 3)
|
|
39
|
+
.fill('#222');
|
|
40
|
+
const tex = app.renderer.generateTexture(g);
|
|
41
|
+
|
|
42
|
+
const bunnies: Array<{ s: Sprite; vx: number; vy: number }> = [];
|
|
43
|
+
const layer = new Container();
|
|
44
|
+
app.stage.addChild(layer);
|
|
45
|
+
|
|
46
|
+
const W = 800;
|
|
47
|
+
const H = 600;
|
|
48
|
+
const gravity = 0.5;
|
|
49
|
+
let seed = 12345;
|
|
50
|
+
const rand = () => {
|
|
51
|
+
seed = (seed * 1103515245 + 12345) & 0x7fffffff;
|
|
52
|
+
return seed / 0x7fffffff;
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
function addBunny(): void {
|
|
56
|
+
const s = new Sprite(tex);
|
|
57
|
+
s.anchor.set(0.5);
|
|
58
|
+
s.x = W / 2;
|
|
59
|
+
s.y = 0;
|
|
60
|
+
s.tint = (rand() * 0xffffff) | 0;
|
|
61
|
+
layer.addChild(s);
|
|
62
|
+
bunnies.push({ s, vx: (rand() - 0.5) * 12, vy: rand() * 6 });
|
|
63
|
+
}
|
|
64
|
+
for (let i = 0; i < 250; i++) addBunny();
|
|
65
|
+
|
|
66
|
+
// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: a self-contained game loop (this is an unmodified-style example game; the engine never edits it)
|
|
67
|
+
app.ticker.add(() => {
|
|
68
|
+
if (bunnies.length < 1500) for (let i = 0; i < 4; i++) addBunny();
|
|
69
|
+
for (const b of bunnies) {
|
|
70
|
+
b.s.x += b.vx;
|
|
71
|
+
b.s.y += b.vy;
|
|
72
|
+
b.vy += gravity;
|
|
73
|
+
if (b.s.x > W) {
|
|
74
|
+
b.s.x = W;
|
|
75
|
+
b.vx = -b.vx;
|
|
76
|
+
} else if (b.s.x < 0) {
|
|
77
|
+
b.s.x = 0;
|
|
78
|
+
b.vx = -b.vx;
|
|
79
|
+
}
|
|
80
|
+
if (b.s.y > H) {
|
|
81
|
+
b.s.y = H;
|
|
82
|
+
b.vy = -b.vy * 0.85;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
(globalThis as { __bunnymark?: unknown }).__bunnymark = { app, count: () => bunnies.length };
|
|
88
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"manifestVersion": 1,
|
|
3
|
+
"name": "Bunnymark",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"engine": {
|
|
6
|
+
"version": "0.1.0"
|
|
7
|
+
},
|
|
8
|
+
"worlds": [
|
|
9
|
+
{
|
|
10
|
+
"id": "bunnymark",
|
|
11
|
+
"kind": "pixijs",
|
|
12
|
+
"description": "Canonical PixiJS sprite-batching stress test — thousands of bouncing sprites.",
|
|
13
|
+
"adapter": {
|
|
14
|
+
"ingest": {
|
|
15
|
+
"strategy": "shared"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"entry": "game.ts"
|
|
19
|
+
}
|
|
20
|
+
]
|
|
21
|
+
}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flappy Bird — canonical PixiJS mini-game, asset-light.
|
|
3
|
+
*
|
|
4
|
+
* UNMODIFIED-style PixiJS v8 program: owns its Application + ticker + canvas, and
|
|
5
|
+
* its own gravity/physics + AABB collision + scrolling + score. The vgai world2d
|
|
6
|
+
* ingest trap captures its `stage` with ZERO edits. Exercises: animated sprite
|
|
7
|
+
* (wing flap), keyboard + pointer input, custom 2D physics, AABB collision,
|
|
8
|
+
* scrolling parallax, score HUD, lose state.
|
|
9
|
+
*
|
|
10
|
+
* Moved from the retired world2d silo (`world2d-demo/games/flappy.ts`, T6.1
|
|
11
|
+
* slice 4, docs/MULTI-WORLD-DESIGN.md §1.H) to a per-folder ingest fixture
|
|
12
|
+
* (T3.3 discovery convention). Runs top-level on import — see bunnymark's
|
|
13
|
+
* game.ts doc comment for why (matches the in-tree three.js ingest fixtures'
|
|
14
|
+
* convention).
|
|
15
|
+
*/
|
|
16
|
+
import { Application, Container, Graphics, Text } from 'pixi.js';
|
|
17
|
+
|
|
18
|
+
function container(): HTMLElement {
|
|
19
|
+
return (
|
|
20
|
+
(globalThis as { __world2dGameContainer?: HTMLElement }).__world2dGameContainer ?? document.body
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
void load();
|
|
25
|
+
|
|
26
|
+
// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: a self-contained game (unmodified-style example game; the engine never edits it)
|
|
27
|
+
async function load(): Promise<void> {
|
|
28
|
+
const app = new Application();
|
|
29
|
+
await app.init({ width: 480, height: 640, background: '#4ec0ca', antialias: true });
|
|
30
|
+
container().appendChild(app.canvas);
|
|
31
|
+
|
|
32
|
+
const W = 480;
|
|
33
|
+
const H = 640;
|
|
34
|
+
const world = new Container();
|
|
35
|
+
app.stage.addChild(world);
|
|
36
|
+
|
|
37
|
+
// Bird (a flapping body — a rounded rect + wing whose scale animates).
|
|
38
|
+
const bird = new Container();
|
|
39
|
+
const body = new Graphics()
|
|
40
|
+
.roundRect(-14, -12, 28, 24, 8)
|
|
41
|
+
.fill('#ffd23f')
|
|
42
|
+
.stroke({ width: 2, color: '#c98a00' });
|
|
43
|
+
const wing = new Graphics().ellipse(-2, 2, 9, 6).fill('#fff3b0');
|
|
44
|
+
bird.addChild(body, wing);
|
|
45
|
+
bird.x = W * 0.3;
|
|
46
|
+
bird.y = H * 0.5;
|
|
47
|
+
world.addChild(bird);
|
|
48
|
+
|
|
49
|
+
// Pipes.
|
|
50
|
+
const pipes: Array<{ top: Graphics; bot: Graphics; x: number; scored: boolean }> = [];
|
|
51
|
+
const GAP = 170;
|
|
52
|
+
const PIPE_W = 64;
|
|
53
|
+
let seed = 7;
|
|
54
|
+
const rand = () => {
|
|
55
|
+
seed = (seed * 1103515245 + 12345) & 0x7fffffff;
|
|
56
|
+
return seed / 0x7fffffff;
|
|
57
|
+
};
|
|
58
|
+
function spawnPipe(x: number): void {
|
|
59
|
+
const gapY = 120 + rand() * (H - 240 - GAP);
|
|
60
|
+
const top = new Graphics()
|
|
61
|
+
.rect(0, 0, PIPE_W, gapY)
|
|
62
|
+
.fill('#5dbb46')
|
|
63
|
+
.stroke({ width: 3, color: '#3f8a30' });
|
|
64
|
+
const bot = new Graphics()
|
|
65
|
+
.rect(0, 0, PIPE_W, H - gapY - GAP)
|
|
66
|
+
.fill('#5dbb46')
|
|
67
|
+
.stroke({ width: 3, color: '#3f8a30' });
|
|
68
|
+
top.x = x;
|
|
69
|
+
top.y = 0;
|
|
70
|
+
bot.x = x;
|
|
71
|
+
bot.y = gapY + GAP;
|
|
72
|
+
world.addChild(top, bot);
|
|
73
|
+
pipes.push({ top, bot, x, scored: false });
|
|
74
|
+
}
|
|
75
|
+
for (let i = 0; i < 4; i++) spawnPipe(W + i * 220);
|
|
76
|
+
|
|
77
|
+
const hud = new Text({
|
|
78
|
+
text: 'Score: 0',
|
|
79
|
+
style: { fontSize: 28, fill: '#fff', fontWeight: 'bold' },
|
|
80
|
+
});
|
|
81
|
+
hud.x = 16;
|
|
82
|
+
hud.y = 16;
|
|
83
|
+
app.stage.addChild(hud);
|
|
84
|
+
|
|
85
|
+
let vy = 0;
|
|
86
|
+
let score = 0;
|
|
87
|
+
let dead = false;
|
|
88
|
+
let t = 0;
|
|
89
|
+
const GRAV = 0.5;
|
|
90
|
+
const FLAP = -8.5;
|
|
91
|
+
|
|
92
|
+
function flap(): void {
|
|
93
|
+
if (dead) {
|
|
94
|
+
// reset
|
|
95
|
+
bird.y = H * 0.5;
|
|
96
|
+
vy = 0;
|
|
97
|
+
score = 0;
|
|
98
|
+
dead = false;
|
|
99
|
+
for (let i = 0; i < pipes.length; i++) pipes[i]!.x = W + i * 220;
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
vy = FLAP;
|
|
103
|
+
}
|
|
104
|
+
window.addEventListener('keydown', (e) => {
|
|
105
|
+
if (e.code === 'Space' || e.code === 'ArrowUp') flap();
|
|
106
|
+
});
|
|
107
|
+
app.canvas.addEventListener('pointerdown', flap);
|
|
108
|
+
|
|
109
|
+
// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: a self-contained game loop (unmodified-style example game; the engine never edits it)
|
|
110
|
+
app.ticker.add((ticker) => {
|
|
111
|
+
const dt = ticker.deltaTime;
|
|
112
|
+
t += dt;
|
|
113
|
+
wing.scale.y = 0.6 + Math.abs(Math.sin(t * 0.3)) * 0.8; // flap animation
|
|
114
|
+
if (dead) return;
|
|
115
|
+
|
|
116
|
+
vy += GRAV * dt;
|
|
117
|
+
bird.y += vy * dt;
|
|
118
|
+
bird.rotation = Math.max(-0.5, Math.min(1.2, vy * 0.05));
|
|
119
|
+
|
|
120
|
+
for (const p of pipes) {
|
|
121
|
+
p.x -= 2.2 * dt;
|
|
122
|
+
p.top.x = p.x;
|
|
123
|
+
p.bot.x = p.x;
|
|
124
|
+
if (p.x + PIPE_W < 0) {
|
|
125
|
+
p.x += pipes.length * 220;
|
|
126
|
+
p.scored = false;
|
|
127
|
+
}
|
|
128
|
+
if (!p.scored && p.x + PIPE_W < bird.x) {
|
|
129
|
+
p.scored = true;
|
|
130
|
+
score++;
|
|
131
|
+
hud.text = `Score: ${score}`;
|
|
132
|
+
}
|
|
133
|
+
// AABB collision: bird box vs pipe rects.
|
|
134
|
+
const bx = bird.x - 14;
|
|
135
|
+
const by = bird.y - 12;
|
|
136
|
+
const overlapX = bx + 28 > p.x && bx < p.x + PIPE_W;
|
|
137
|
+
if (overlapX) {
|
|
138
|
+
const topH = p.top.height;
|
|
139
|
+
const botY = p.bot.y;
|
|
140
|
+
if (by < topH || by + 24 > botY) dead = true;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (bird.y > H - 12 || bird.y < 0) dead = true;
|
|
144
|
+
if (dead) hud.text = `Score: ${score} — tap to retry`;
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
(globalThis as { __flappy?: unknown }).__flappy = { app, score: () => score };
|
|
148
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"manifestVersion": 1,
|
|
3
|
+
"name": "Flappy Bird",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"engine": {
|
|
6
|
+
"version": "0.1.0"
|
|
7
|
+
},
|
|
8
|
+
"worlds": [
|
|
9
|
+
{
|
|
10
|
+
"id": "flappy",
|
|
11
|
+
"kind": "pixijs",
|
|
12
|
+
"description": "Gravity/physics, keyboard + pointer input, AABB collision, scrolling, score HUD.",
|
|
13
|
+
"adapter": {
|
|
14
|
+
"ingest": {
|
|
15
|
+
"strategy": "shared"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"entry": "game.ts"
|
|
19
|
+
}
|
|
20
|
+
]
|
|
21
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"manifestVersion": 1,
|
|
3
|
+
"name": "Flappy Pixi (real OSS game, pixi v6)",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"engine": {
|
|
6
|
+
"version": "0.1.0"
|
|
7
|
+
},
|
|
8
|
+
"worlds": [
|
|
9
|
+
{
|
|
10
|
+
"id": "flappy-pixi",
|
|
11
|
+
"kind": "pixijs",
|
|
12
|
+
"description": "REAL unmodified OSS PixiJS game — aliexme's Flappy Pixi, vendored byte-for-byte under vendor/pixi-games/flappy-pixi (MIT). Pixi v6 on the v8 host via version-skew (D-P2): pixiModuleUrl's PRESENCE swaps the trapped instance to a served standalone pixi@6.5.10 build. Assets are inlined in the bundle. Requires the gitignored bundles: run vendor/pixi-games/_host/build-flappy-pixi.sh first.",
|
|
13
|
+
"adapter": {
|
|
14
|
+
"ingest": {
|
|
15
|
+
"strategy": "iframe-reachable",
|
|
16
|
+
"bundleUrl": "/pixi-game-static/flappy-pixi/flappy-pixi.mjs",
|
|
17
|
+
"baseHref": "/pixi-game-static/flappy-pixi/",
|
|
18
|
+
"pixiModuleUrl": "/pixi-game-static/pixi6/pixi6.mjs",
|
|
19
|
+
"bodyHtml": "<style>html,body{margin:0;height:100%}#game-root{width:100%;height:100%}</style><div id=\"game-root\"></div>",
|
|
20
|
+
"captureTimeoutMs": 30000
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
]
|
|
25
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"manifestVersion": 1,
|
|
3
|
+
"name": "Puzzling Potions (real OSS game)",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"engine": {
|
|
6
|
+
"version": "0.1.0"
|
|
7
|
+
},
|
|
8
|
+
"worlds": [
|
|
9
|
+
{
|
|
10
|
+
"id": "puzzling-potions",
|
|
11
|
+
"kind": "pixijs",
|
|
12
|
+
"description": "REAL unmodified OSS PixiJS game — pixijs/open-games Puzzling Potions (match-3 with Spine animations; spine-pixi-v8 pinned exactly 4.2.95 — see host-namespace-registry.ts), vendored byte-for-byte under vendor/pixi-games/puzzling-potions (MIT), iframe-reachable-multi route (Track P). Requires the gitignored externalized bundle: run vendor/pixi-games/_host/build-puzzling-potions.sh first.",
|
|
13
|
+
"adapter": {
|
|
14
|
+
"ingest": {
|
|
15
|
+
"strategy": "iframe-reachable",
|
|
16
|
+
"bundleUrl": "/pixi-game-static/puzzling-potions/puzzling-potions.mjs",
|
|
17
|
+
"baseHref": "/pixi-game-static/puzzling-potions/",
|
|
18
|
+
"assetBaseUrl": "/pixi-game-static/puzzling-potions/assets",
|
|
19
|
+
"extraDeps": ["@pixi/sound", "@pixi/ui", "gsap", "@esotericsoftware/spine-pixi-v8"],
|
|
20
|
+
"captureTimeoutMs": 30000
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
]
|
|
25
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tilemap + camera-follow — canonical PixiJS tilemap demo, asset-light.
|
|
3
|
+
*
|
|
4
|
+
* UNMODIFIED-style PixiJS v8 program using the REAL `@pixi/tilemap` CompositeTilemap
|
|
5
|
+
* to render a large tile grid, with a keyboard-driven player and a camera that
|
|
6
|
+
* follows by transforming the world Container (the spec's plain-Container 2D camera;
|
|
7
|
+
* pixi-viewport is the alternative). The vgai world2d ingest trap captures its stage
|
|
8
|
+
* with ZERO edits. Exercises: tilemap rendering (batched), spritesheet-style tileset,
|
|
9
|
+
* keyboard input, camera follow. Fills the tilemap + camera-follow feature-matrix cells.
|
|
10
|
+
*
|
|
11
|
+
* Moved from the retired world2d silo (`world2d-demo/games/tilemap-camera.ts`,
|
|
12
|
+
* T6.1 slice 4, docs/MULTI-WORLD-DESIGN.md §1.H) to a per-folder ingest fixture
|
|
13
|
+
* (T3.3 discovery convention). Runs top-level on import — see bunnymark's
|
|
14
|
+
* game.ts doc comment for why.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { CompositeTilemap } from '@pixi/tilemap';
|
|
18
|
+
import { Application, Container, Graphics, Texture } from 'pixi.js';
|
|
19
|
+
|
|
20
|
+
function gameContainer(): HTMLElement {
|
|
21
|
+
return (
|
|
22
|
+
(globalThis as { __world2dGameContainer?: HTMLElement }).__world2dGameContainer ?? document.body
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** Generate a TILE x TILE texture for a named tile kind (no external assets). */
|
|
27
|
+
function tileTexture(color: string, accent: string, size: number): Texture {
|
|
28
|
+
const canvas = document.createElement('canvas');
|
|
29
|
+
canvas.width = size;
|
|
30
|
+
canvas.height = size;
|
|
31
|
+
const g = canvas.getContext('2d')!;
|
|
32
|
+
g.fillStyle = color;
|
|
33
|
+
g.fillRect(0, 0, size, size);
|
|
34
|
+
g.fillStyle = accent;
|
|
35
|
+
g.fillRect(2, 2, size - 4, 3);
|
|
36
|
+
g.fillRect(2, size - 5, size - 4, 3);
|
|
37
|
+
return Texture.from(canvas);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
void load();
|
|
41
|
+
|
|
42
|
+
async function load(): Promise<void> {
|
|
43
|
+
const app = new Application();
|
|
44
|
+
await app.init({ width: 640, height: 480, background: '#0c1a12', antialias: false });
|
|
45
|
+
gameContainer().appendChild(app.canvas);
|
|
46
|
+
|
|
47
|
+
const TILE = 32;
|
|
48
|
+
const COLS = 60;
|
|
49
|
+
const ROWS = 40;
|
|
50
|
+
const world = new Container();
|
|
51
|
+
app.stage.addChild(world);
|
|
52
|
+
|
|
53
|
+
const grass = tileTexture('#3a7d44', '#2f6638', TILE);
|
|
54
|
+
const stone = tileTexture('#6b6b7b', '#54545f', TILE);
|
|
55
|
+
const water = tileTexture('#2f6db0', '#255a93', TILE);
|
|
56
|
+
|
|
57
|
+
// Build the tilemap (CompositeTilemap batches the whole grid into few draw calls).
|
|
58
|
+
const tilemap = new CompositeTilemap();
|
|
59
|
+
world.addChild(tilemap);
|
|
60
|
+
let seed = 99;
|
|
61
|
+
const rand = () => {
|
|
62
|
+
seed = (seed * 1103515245 + 12345) & 0x7fffffff;
|
|
63
|
+
return seed / 0x7fffffff;
|
|
64
|
+
};
|
|
65
|
+
for (let y = 0; y < ROWS; y++) {
|
|
66
|
+
for (let x = 0; x < COLS; x++) {
|
|
67
|
+
const r = rand();
|
|
68
|
+
const tex = r < 0.12 ? water : r < 0.24 ? stone : grass;
|
|
69
|
+
tilemap.tile(tex, x * TILE, y * TILE);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Player.
|
|
74
|
+
const player = new Container();
|
|
75
|
+
player.addChild(
|
|
76
|
+
new Graphics()
|
|
77
|
+
.roundRect(-12, -12, 24, 24, 5)
|
|
78
|
+
.fill('#ffd23f')
|
|
79
|
+
.stroke({ width: 2, color: '#c98a00' }),
|
|
80
|
+
);
|
|
81
|
+
player.x = (COLS * TILE) / 2;
|
|
82
|
+
player.y = (ROWS * TILE) / 2;
|
|
83
|
+
world.addChild(player);
|
|
84
|
+
|
|
85
|
+
const keys: Record<string, boolean> = {};
|
|
86
|
+
window.addEventListener('keydown', (e) => {
|
|
87
|
+
keys[e.code] = true;
|
|
88
|
+
});
|
|
89
|
+
window.addEventListener('keyup', (e) => {
|
|
90
|
+
keys[e.code] = false;
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
app.ticker.add((ticker) => {
|
|
94
|
+
const dt = ticker.deltaTime;
|
|
95
|
+
const sp = 5 * dt;
|
|
96
|
+
if (keys['ArrowLeft'] || keys['KeyA']) player.x -= sp;
|
|
97
|
+
if (keys['ArrowRight'] || keys['KeyD']) player.x += sp;
|
|
98
|
+
if (keys['ArrowUp'] || keys['KeyW']) player.y -= sp;
|
|
99
|
+
if (keys['ArrowDown'] || keys['KeyS']) player.y += sp;
|
|
100
|
+
player.x = Math.max(0, Math.min(COLS * TILE, player.x));
|
|
101
|
+
player.y = Math.max(0, Math.min(ROWS * TILE, player.y));
|
|
102
|
+
// Camera follow: pan the world Container so the player stays centered.
|
|
103
|
+
world.x = app.screen.width / 2 - player.x;
|
|
104
|
+
world.y = app.screen.height / 2 - player.y;
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
(globalThis as { __tilemapCamera?: unknown }).__tilemapCamera = {
|
|
108
|
+
app,
|
|
109
|
+
tiles: COLS * ROWS,
|
|
110
|
+
playerPos: () => ({ x: player.x, y: player.y }),
|
|
111
|
+
press: (code: string, down: boolean) => {
|
|
112
|
+
keys[code] = down;
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"manifestVersion": 1,
|
|
3
|
+
"name": "Tilemap + Camera",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"engine": {
|
|
6
|
+
"version": "0.1.0"
|
|
7
|
+
},
|
|
8
|
+
"worlds": [
|
|
9
|
+
{
|
|
10
|
+
"id": "tilemap-camera",
|
|
11
|
+
"kind": "pixijs",
|
|
12
|
+
"description": "Real @pixi/tilemap CompositeTilemap (60x40 grid) + keyboard player + camera follow.",
|
|
13
|
+
"adapter": {
|
|
14
|
+
"ingest": {
|
|
15
|
+
"strategy": "shared"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"entry": "game.ts"
|
|
19
|
+
}
|
|
20
|
+
]
|
|
21
|
+
}
|