commit e9f5f81f46d95bf7b4b8c506135705988de66d52 Author: klarkxy <278370456@qq.com> Date: Thu Aug 13 13:18:41 2026 +0800 Add two-stage charged-crystal demo and original art set. diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..112f2e1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +# Godot generated data +.godot/ + +# Workspace-local engine binaries and downloads +.tools/downloads/ +.tools/godot/ + +# Local build output +build/ +dist/ + +# Planner-local recipe save backups +data/backups/*.json + +# Editor and OS noise +.vscode/ +.idea/ +Thumbs.db +Desktop.ini diff --git a/.tools/.gdignore b/.tools/.gdignore new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/.tools/.gdignore @@ -0,0 +1 @@ + diff --git a/.tools/VERSION.md b/.tools/VERSION.md new file mode 100644 index 0000000..2753019 --- /dev/null +++ b/.tools/VERSION.md @@ -0,0 +1,8 @@ +# Workspace Toolchain + +- Engine: Godot 4.7.1 stable, Windows x86_64 standard build +- Official download page: https://godotengine.org/download/windows/ +- Downloaded: 2026-08-12 + +The engine is kept as a workspace-local portable tool and is intentionally ignored by Git. + diff --git a/README.md b/README.md new file mode 100644 index 0000000..7028881 --- /dev/null +++ b/README.md @@ -0,0 +1,47 @@ +# Mana Foundry / 魔力工坊 + +A performance-conscious 2.5D factory-building game demo made with Godot. + +## Current demo goal + +Build the raw-crystal belt into the refinery, connect both machines to a mana source, bind each machine's bridge arm to explicit pickup and drop belt cells, then carry refined crystals into the charger. The demo completes when the vault sustains charged-crystal intake. + +## Full-game direction + +The demo is the physical substrate for a magical-law factory game, not the final progression model. The planned campaign crosses contiguous but law-separated fantasy biomes, automates growth, decay, elemental state, and spatial folding, then culminates in building and activating a dimensional gate. After the first warp, the gate becomes a bounded-random matter exchange whose mixed outputs and entropy form the postgame economy. + +- Current design: `docs/tech-tree-v0.2.md` +- Experience requirements: `docs/requirements-magic-factorio.md` +- Implementation sequence: `tasks/tech-tree-plan-v0.2.md` + +## Controls + +- `1`: conveyor +- `2`: crystal source +- `3`: refinery +- `7`: charger +- `4`: collection vault +- `5`: mana pipe +- `6`: mana source +- `B`: configure a machine bridge arm (machine, pickup belt, drop belt) +- `R`: rotate the selected building +- Left mouse: place or inspect a building +- Right mouse: remove +- `WASD`: move camera +- Mouse wheel: zoom +- `N`: restart the demo site +- `F1`: toggle developer statistics + +## Running + +Open `project.godot` with Godot 4.7.1 stable, or run the workspace-local engine after Task 1 has completed. + +## Planner recipe workbench + +Double-click `tools/recipe-tree-editor/start-editor.cmd` to open the local planner tool. It provides searchable recipe, item, and machine catalogs; focused and full dependency graphs; live validation; undo/redo; JSON import/export; and recoverable direct saves to `data/recipe-book.json`. + +Usage and field semantics are documented in `tools/recipe-tree-editor/README.md`. + +Playable buildings, belt items, and inspect icons now come from the original art set in `assets/generated/`, catalogued by `data/art-catalog.json` against every recipe-book item and machine. The Kenney archive remains in `third_party/` for provenance only. + +Third-party asset details are recorded in `THIRD_PARTY.md`. diff --git a/THIRD_PARTY.md b/THIRD_PARTY.md new file mode 100644 index 0000000..f0f4f70 --- /dev/null +++ b/THIRD_PARTY.md @@ -0,0 +1,16 @@ +# Third-party assets + +## Kenney Factory Kit 3.0 + +- Author: Kenney +- Source: https://kenney.nl/assets/factory-kit +- Download: https://kenney.nl/media/pages/assets/factory-kit/edaac9d4f6-1777639602/kenney_factory-kit_3.0.zip +- Version: 3.0 +- Acquired: 2026-08-12 +- License: Creative Commons Zero 1.0 Universal (CC0) +- License text supplied by author: `third_party/kenney_factory_kit_3.0/LICENSE.txt` +- Imported game assets: 143 GLB models under `assets/third_party/kenney_factory_kit/` +- Playable demo no longer instances these models; runtime art is the original set in `assets/generated/`. The archive stays for license provenance. + +Kenney states that the content may be used for personal, educational, and commercial purposes. Attribution is appreciated but not required. We retain attribution in the project and eventual credits screen. + diff --git a/artifacts/demo-gameplay.png b/artifacts/demo-gameplay.png new file mode 100644 index 0000000..59e9308 Binary files /dev/null and b/artifacts/demo-gameplay.png differ diff --git a/artifacts/demo-gameplay.png.import b/artifacts/demo-gameplay.png.import new file mode 100644 index 0000000..bc01651 --- /dev/null +++ b/artifacts/demo-gameplay.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://hrtx48gdwu33" +path="res://.godot/imported/demo-gameplay.png-69d9111060987b75be5185414254e600.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://artifacts/demo-gameplay.png" +dest_files=["res://.godot/imported/demo-gameplay.png-69d9111060987b75be5185414254e600.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/STYLE.md b/assets/generated/STYLE.md new file mode 100644 index 0000000..c0496b1 --- /dev/null +++ b/assets/generated/STYLE.md @@ -0,0 +1,34 @@ +# Mana Foundry original art contract + +All generated icons, renders, and materials replace Kenney Factory Kit in the playable demo. The recipe book remains the ID authority; this folder is the art authority. + +## Shared look + +- Dark stone, aged brass, cyan ley-line light, violet high-tier charge. +- Each biome only tints the accent, never the treatment: old kingdom cyan, forest sap-green, death soul-violet, ember slag-orange, mirror star-silver, rift gold, post-rift magenta. +- No letters, numbers, UI chrome, watermark, or photographic people. +- Isolated subject, generous margin, no ground plane, no baked contact shadow. + +## Icons (`icons/items`) + +- Hand-painted fantasy factory inventory icon. +- Three-quarter object view, solid fill with a thin dark-stone rim, same visual weight. +- Flat charcoal field `#1A1612`. +- Must read at 32px: one silhouette, one accent glow. + +## Renders (`renders`) + +- Same orthographic south-east factory camera as the Godot scene (elevated, no perspective). +- Machines sit on a hidden grid cell; the building is the only subject. +- Logistics pieces match machine scale so a belt cell and a hopper share the same footprint language. + +## Materials (`materials`) + +- Seamless painted tiles, non-directional lighting, no landmark motifs. +- Used as albedo/emission sources, not as Kenney colormap swaps. + +## Known defects + +- Several materials inherit the factory-stone crack layout, so a 2×2 tile of `aged_brass` still shows a seam. +- A few late-game icons (`clay_construct`, `walker_construct`) read more sculpted than the painted crystal set, though they keep the charcoal field and padding. +- Demo belt items map `raw_crystal` → `raw_mana_crystal`, `refined_crystal` → `awakened_crystal`, `charged_crystal` → `charged_phase_medium`, because the recipe book has no separate charged-crystal row. diff --git a/assets/generated/icons/items/anomaly_relic.png b/assets/generated/icons/items/anomaly_relic.png new file mode 100644 index 0000000..b38e663 Binary files /dev/null and b/assets/generated/icons/items/anomaly_relic.png differ diff --git a/assets/generated/icons/items/anomaly_relic.png.import b/assets/generated/icons/items/anomaly_relic.png.import new file mode 100644 index 0000000..a806349 --- /dev/null +++ b/assets/generated/icons/items/anomaly_relic.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b4k2n5apw8ixy" +path="res://.godot/imported/anomaly_relic.png-b4d6ddd47b8a6bb74eef0c2a054cded9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/anomaly_relic.png" +dest_files=["res://.godot/imported/anomaly_relic.png-b4d6ddd47b8a6bb74eef0c2a054cded9.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/awakened_crystal.png b/assets/generated/icons/items/awakened_crystal.png new file mode 100644 index 0000000..0449620 Binary files /dev/null and b/assets/generated/icons/items/awakened_crystal.png differ diff --git a/assets/generated/icons/items/awakened_crystal.png.import b/assets/generated/icons/items/awakened_crystal.png.import new file mode 100644 index 0000000..6f9555d --- /dev/null +++ b/assets/generated/icons/items/awakened_crystal.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://do61ppwsyt626" +path="res://.godot/imported/awakened_crystal.png-f63274d8e50fcf4eab6abaf2f062ea7d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/awakened_crystal.png" +dest_files=["res://.godot/imported/awakened_crystal.png-f63274d8e50fcf4eab6abaf2f062ea7d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/blank_tablet.png b/assets/generated/icons/items/blank_tablet.png new file mode 100644 index 0000000..dd93c46 Binary files /dev/null and b/assets/generated/icons/items/blank_tablet.png differ diff --git a/assets/generated/icons/items/blank_tablet.png.import b/assets/generated/icons/items/blank_tablet.png.import new file mode 100644 index 0000000..0419b7a --- /dev/null +++ b/assets/generated/icons/items/blank_tablet.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c1luyf7fghdtn" +path="res://.godot/imported/blank_tablet.png-df746ab8be048bd9e20725a7bd9b8b79.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/blank_tablet.png" +dest_files=["res://.godot/imported/blank_tablet.png-df746ab8be048bd9e20725a7bd9b8b79.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/blight.png b/assets/generated/icons/items/blight.png new file mode 100644 index 0000000..a5543d1 Binary files /dev/null and b/assets/generated/icons/items/blight.png differ diff --git a/assets/generated/icons/items/blight.png.import b/assets/generated/icons/items/blight.png.import new file mode 100644 index 0000000..6630b3a --- /dev/null +++ b/assets/generated/icons/items/blight.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d1abqs768wi31" +path="res://.godot/imported/blight.png-0a9bf7a856c67cf29e507f3db5bb3d6c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/blight.png" +dest_files=["res://.godot/imported/blight.png-0a9bf7a856c67cf29e507f3db5bb3d6c.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/bone_dust.png b/assets/generated/icons/items/bone_dust.png new file mode 100644 index 0000000..810de80 Binary files /dev/null and b/assets/generated/icons/items/bone_dust.png differ diff --git a/assets/generated/icons/items/bone_dust.png.import b/assets/generated/icons/items/bone_dust.png.import new file mode 100644 index 0000000..c56712b --- /dev/null +++ b/assets/generated/icons/items/bone_dust.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bgoro24puuju4" +path="res://.godot/imported/bone_dust.png-c0e51467ae71fa3a363405173961638b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/bone_dust.png" +dest_files=["res://.godot/imported/bone_dust.png-c0e51467ae71fa3a363405173961638b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/boundary_stone.png b/assets/generated/icons/items/boundary_stone.png new file mode 100644 index 0000000..7cea41e Binary files /dev/null and b/assets/generated/icons/items/boundary_stone.png differ diff --git a/assets/generated/icons/items/boundary_stone.png.import b/assets/generated/icons/items/boundary_stone.png.import new file mode 100644 index 0000000..a652c12 --- /dev/null +++ b/assets/generated/icons/items/boundary_stone.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dur2hqk7tvl2m" +path="res://.godot/imported/boundary_stone.png-f8c3351889ff04c66ae8dbc1fb3f7eb1.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/boundary_stone.png" +dest_files=["res://.godot/imported/boundary_stone.png-f8c3351889ff04c66ae8dbc1fb3f7eb1.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/charged_phase_medium.png b/assets/generated/icons/items/charged_phase_medium.png new file mode 100644 index 0000000..20f6236 Binary files /dev/null and b/assets/generated/icons/items/charged_phase_medium.png differ diff --git a/assets/generated/icons/items/charged_phase_medium.png.import b/assets/generated/icons/items/charged_phase_medium.png.import new file mode 100644 index 0000000..2537d00 --- /dev/null +++ b/assets/generated/icons/items/charged_phase_medium.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d0alxnvgufwg0" +path="res://.godot/imported/charged_phase_medium.png-07feca2e9104032afc7baa69367a7bba.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/charged_phase_medium.png" +dest_files=["res://.godot/imported/charged_phase_medium.png-07feca2e9104032afc7baa69367a7bba.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/clay_construct.png b/assets/generated/icons/items/clay_construct.png new file mode 100644 index 0000000..1d3ab5b Binary files /dev/null and b/assets/generated/icons/items/clay_construct.png differ diff --git a/assets/generated/icons/items/clay_construct.png.import b/assets/generated/icons/items/clay_construct.png.import new file mode 100644 index 0000000..a792030 --- /dev/null +++ b/assets/generated/icons/items/clay_construct.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://co284f7dreyh1" +path="res://.godot/imported/clay_construct.png-5ceef19d1e57631ceaacffcc2f45d4fc.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/clay_construct.png" +dest_files=["res://.godot/imported/clay_construct.png-5ceef19d1e57631ceaacffcc2f45d4fc.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/clay_core.png b/assets/generated/icons/items/clay_core.png new file mode 100644 index 0000000..9456a49 Binary files /dev/null and b/assets/generated/icons/items/clay_core.png differ diff --git a/assets/generated/icons/items/clay_core.png.import b/assets/generated/icons/items/clay_core.png.import new file mode 100644 index 0000000..b3c91a6 --- /dev/null +++ b/assets/generated/icons/items/clay_core.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://7553xtv818x1" +path="res://.godot/imported/clay_core.png-f6d6b5eaacfd11d520e8041780618704.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/clay_core.png" +dest_files=["res://.godot/imported/clay_core.png-f6d6b5eaacfd11d520e8041780618704.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/cold_phase_medium.png b/assets/generated/icons/items/cold_phase_medium.png new file mode 100644 index 0000000..238327d Binary files /dev/null and b/assets/generated/icons/items/cold_phase_medium.png differ diff --git a/assets/generated/icons/items/cold_phase_medium.png.import b/assets/generated/icons/items/cold_phase_medium.png.import new file mode 100644 index 0000000..faa7d53 --- /dev/null +++ b/assets/generated/icons/items/cold_phase_medium.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ngts1x1p76o8" +path="res://.godot/imported/cold_phase_medium.png-5e96e83b2bf16efe180010d1706b067e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/cold_phase_medium.png" +dest_files=["res://.godot/imported/cold_phase_medium.png-5e96e83b2bf16efe180010d1706b067e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/dawn_rune.png b/assets/generated/icons/items/dawn_rune.png new file mode 100644 index 0000000..bf23490 Binary files /dev/null and b/assets/generated/icons/items/dawn_rune.png differ diff --git a/assets/generated/icons/items/dawn_rune.png.import b/assets/generated/icons/items/dawn_rune.png.import new file mode 100644 index 0000000..eb8dbfa --- /dev/null +++ b/assets/generated/icons/items/dawn_rune.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://u303sg2rj0p1" +path="res://.godot/imported/dawn_rune.png-d970e3f7de37a42af79aec522030d818.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/dawn_rune.png" +dest_files=["res://.godot/imported/dawn_rune.png-d970e3f7de37a42af79aec522030d818.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/death_anchor_core.png b/assets/generated/icons/items/death_anchor_core.png new file mode 100644 index 0000000..86a77a3 Binary files /dev/null and b/assets/generated/icons/items/death_anchor_core.png differ diff --git a/assets/generated/icons/items/death_anchor_core.png.import b/assets/generated/icons/items/death_anchor_core.png.import new file mode 100644 index 0000000..b20732a --- /dev/null +++ b/assets/generated/icons/items/death_anchor_core.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://7jts2i4vnugi" +path="res://.godot/imported/death_anchor_core.png-cad625bbefffade352bc680b31be1e49.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/death_anchor_core.png" +dest_files=["res://.godot/imported/death_anchor_core.png-cad625bbefffade352bc680b31be1e49.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/death_offering.png b/assets/generated/icons/items/death_offering.png new file mode 100644 index 0000000..128ce20 Binary files /dev/null and b/assets/generated/icons/items/death_offering.png differ diff --git a/assets/generated/icons/items/death_offering.png.import b/assets/generated/icons/items/death_offering.png.import new file mode 100644 index 0000000..92693d9 --- /dev/null +++ b/assets/generated/icons/items/death_offering.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://br2acisag0jo8" +path="res://.godot/imported/death_offering.png-a11707fcfecc09e780ff23365ce037ac.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/death_offering.png" +dest_files=["res://.godot/imported/death_offering.png-a11707fcfecc09e780ff23365ce037ac.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/death_proof.png b/assets/generated/icons/items/death_proof.png new file mode 100644 index 0000000..b727648 Binary files /dev/null and b/assets/generated/icons/items/death_proof.png differ diff --git a/assets/generated/icons/items/death_proof.png.import b/assets/generated/icons/items/death_proof.png.import new file mode 100644 index 0000000..7738ebf --- /dev/null +++ b/assets/generated/icons/items/death_proof.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b26pru76wljsq" +path="res://.godot/imported/death_proof.png-f2366d40d3d983bbb14e7ea0473b9fe8.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/death_proof.png" +dest_files=["res://.godot/imported/death_proof.png-f2366d40d3d983bbb14e7ea0473b9fe8.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/dimension_proof.png b/assets/generated/icons/items/dimension_proof.png new file mode 100644 index 0000000..e29b27a Binary files /dev/null and b/assets/generated/icons/items/dimension_proof.png differ diff --git a/assets/generated/icons/items/dimension_proof.png.import b/assets/generated/icons/items/dimension_proof.png.import new file mode 100644 index 0000000..890049a --- /dev/null +++ b/assets/generated/icons/items/dimension_proof.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://0lt8pumggv6i" +path="res://.godot/imported/dimension_proof.png-2d38d061f2becdd51a1a4e13efda699f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/dimension_proof.png" +dest_files=["res://.godot/imported/dimension_proof.png-2d38d061f2becdd51a1a4e13efda699f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/dragon_glass.png b/assets/generated/icons/items/dragon_glass.png new file mode 100644 index 0000000..15ee92c Binary files /dev/null and b/assets/generated/icons/items/dragon_glass.png differ diff --git a/assets/generated/icons/items/dragon_glass.png.import b/assets/generated/icons/items/dragon_glass.png.import new file mode 100644 index 0000000..7137af2 --- /dev/null +++ b/assets/generated/icons/items/dragon_glass.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://4v310gcqqivp" +path="res://.godot/imported/dragon_glass.png-5775b414701802044fec38b870655f7f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/dragon_glass.png" +dest_files=["res://.godot/imported/dragon_glass.png-5775b414701802044fec38b870655f7f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/dusk_rune.png b/assets/generated/icons/items/dusk_rune.png new file mode 100644 index 0000000..d9d0c97 Binary files /dev/null and b/assets/generated/icons/items/dusk_rune.png differ diff --git a/assets/generated/icons/items/dusk_rune.png.import b/assets/generated/icons/items/dusk_rune.png.import new file mode 100644 index 0000000..40b6c67 --- /dev/null +++ b/assets/generated/icons/items/dusk_rune.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://crncpjmgjhqcw" +path="res://.godot/imported/dusk_rune.png-68ad0b61278d951b94082584479b36bb.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/dusk_rune.png" +dest_files=["res://.godot/imported/dusk_rune.png-68ad0b61278d951b94082584479b36bb.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/elemental_proof.png b/assets/generated/icons/items/elemental_proof.png new file mode 100644 index 0000000..e39ab1c Binary files /dev/null and b/assets/generated/icons/items/elemental_proof.png differ diff --git a/assets/generated/icons/items/elemental_proof.png.import b/assets/generated/icons/items/elemental_proof.png.import new file mode 100644 index 0000000..b1a3e92 --- /dev/null +++ b/assets/generated/icons/items/elemental_proof.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://s4ojkmno6wtp" +path="res://.godot/imported/elemental_proof.png-2410fd338a107e2d210b106c410907f4.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/elemental_proof.png" +dest_files=["res://.godot/imported/elemental_proof.png-2410fd338a107e2d210b106c410907f4.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/ember_core.png b/assets/generated/icons/items/ember_core.png new file mode 100644 index 0000000..2c90606 Binary files /dev/null and b/assets/generated/icons/items/ember_core.png differ diff --git a/assets/generated/icons/items/ember_core.png.import b/assets/generated/icons/items/ember_core.png.import new file mode 100644 index 0000000..69873f4 --- /dev/null +++ b/assets/generated/icons/items/ember_core.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bouejs0162yhy" +path="res://.godot/imported/ember_core.png-d6253ce0bf9434d1f06f6313d275f85f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/ember_core.png" +dest_files=["res://.godot/imported/ember_core.png-d6253ce0bf9434d1f06f6313d275f85f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/ember_offering.png b/assets/generated/icons/items/ember_offering.png new file mode 100644 index 0000000..1e81f34 Binary files /dev/null and b/assets/generated/icons/items/ember_offering.png differ diff --git a/assets/generated/icons/items/ember_offering.png.import b/assets/generated/icons/items/ember_offering.png.import new file mode 100644 index 0000000..c24858b --- /dev/null +++ b/assets/generated/icons/items/ember_offering.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cc0ssmdo7gkc8" +path="res://.godot/imported/ember_offering.png-92b61826982525f2573bf68911c6f648.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/ember_offering.png" +dest_files=["res://.godot/imported/ember_offering.png-92b61826982525f2573bf68911c6f648.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/entropy_crystal.png b/assets/generated/icons/items/entropy_crystal.png new file mode 100644 index 0000000..051d75e Binary files /dev/null and b/assets/generated/icons/items/entropy_crystal.png differ diff --git a/assets/generated/icons/items/entropy_crystal.png.import b/assets/generated/icons/items/entropy_crystal.png.import new file mode 100644 index 0000000..90ec97e --- /dev/null +++ b/assets/generated/icons/items/entropy_crystal.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c5dxdoj30a15f" +path="res://.godot/imported/entropy_crystal.png-4926bcf61fbaf05a7b2e116f2ad70ded.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/entropy_crystal.png" +dest_files=["res://.godot/imported/entropy_crystal.png-4926bcf61fbaf05a7b2e116f2ad70ded.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/faded_memory.png b/assets/generated/icons/items/faded_memory.png new file mode 100644 index 0000000..c6c4f57 Binary files /dev/null and b/assets/generated/icons/items/faded_memory.png differ diff --git a/assets/generated/icons/items/faded_memory.png.import b/assets/generated/icons/items/faded_memory.png.import new file mode 100644 index 0000000..d867066 --- /dev/null +++ b/assets/generated/icons/items/faded_memory.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bv38nall7ttb4" +path="res://.godot/imported/faded_memory.png-729c00d71ab6c2d9520cf756078af72c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/faded_memory.png" +dest_files=["res://.godot/imported/faded_memory.png-729c00d71ab6c2d9520cf756078af72c.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/fairy_dew.png b/assets/generated/icons/items/fairy_dew.png new file mode 100644 index 0000000..f54e3ca Binary files /dev/null and b/assets/generated/icons/items/fairy_dew.png differ diff --git a/assets/generated/icons/items/fairy_dew.png.import b/assets/generated/icons/items/fairy_dew.png.import new file mode 100644 index 0000000..f20f2b0 --- /dev/null +++ b/assets/generated/icons/items/fairy_dew.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c2x2b7nsjnry8" +path="res://.godot/imported/fairy_dew.png-334c8e75985a81fcc7b15294344ac4b3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/fairy_dew.png" +dest_files=["res://.godot/imported/fairy_dew.png-334c8e75985a81fcc7b15294344ac4b3.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/first_warp_record.png b/assets/generated/icons/items/first_warp_record.png new file mode 100644 index 0000000..aedf514 Binary files /dev/null and b/assets/generated/icons/items/first_warp_record.png differ diff --git a/assets/generated/icons/items/first_warp_record.png.import b/assets/generated/icons/items/first_warp_record.png.import new file mode 100644 index 0000000..f81ff3e --- /dev/null +++ b/assets/generated/icons/items/first_warp_record.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c37x2uucx474t" +path="res://.godot/imported/first_warp_record.png-dbf7eec7648f3023c9d7418ac0cc3b4e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/first_warp_record.png" +dest_files=["res://.godot/imported/first_warp_record.png-dbf7eec7648f3023c9d7418ac0cc3b4e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/inscription_proof.png b/assets/generated/icons/items/inscription_proof.png new file mode 100644 index 0000000..db02ec6 Binary files /dev/null and b/assets/generated/icons/items/inscription_proof.png differ diff --git a/assets/generated/icons/items/inscription_proof.png.import b/assets/generated/icons/items/inscription_proof.png.import new file mode 100644 index 0000000..7f48621 --- /dev/null +++ b/assets/generated/icons/items/inscription_proof.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bd556mban1mdt" +path="res://.godot/imported/inscription_proof.png-b89713a9e811beb395f38d8f338e3b15.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/inscription_proof.png" +dest_files=["res://.godot/imported/inscription_proof.png-b89713a9e811beb395f38d8f338e3b15.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/ley_water.png b/assets/generated/icons/items/ley_water.png new file mode 100644 index 0000000..636805b Binary files /dev/null and b/assets/generated/icons/items/ley_water.png differ diff --git a/assets/generated/icons/items/ley_water.png.import b/assets/generated/icons/items/ley_water.png.import new file mode 100644 index 0000000..1a94c34 --- /dev/null +++ b/assets/generated/icons/items/ley_water.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ddc6tqcm3m2w5" +path="res://.godot/imported/ley_water.png-d0475db6c1da36ef0a3fc795f00cba8b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/ley_water.png" +dest_files=["res://.godot/imported/ley_water.png-d0475db6c1da36ef0a3fc795f00cba8b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/life_anchor_core.png b/assets/generated/icons/items/life_anchor_core.png new file mode 100644 index 0000000..b8aef3c Binary files /dev/null and b/assets/generated/icons/items/life_anchor_core.png differ diff --git a/assets/generated/icons/items/life_anchor_core.png.import b/assets/generated/icons/items/life_anchor_core.png.import new file mode 100644 index 0000000..9f138ca --- /dev/null +++ b/assets/generated/icons/items/life_anchor_core.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cya400gfet7s2" +path="res://.godot/imported/life_anchor_core.png-15a4c256887b1541a22d83974b405c65.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/life_anchor_core.png" +dest_files=["res://.godot/imported/life_anchor_core.png-15a4c256887b1541a22d83974b405c65.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/life_offering.png b/assets/generated/icons/items/life_offering.png new file mode 100644 index 0000000..7530725 Binary files /dev/null and b/assets/generated/icons/items/life_offering.png differ diff --git a/assets/generated/icons/items/life_offering.png.import b/assets/generated/icons/items/life_offering.png.import new file mode 100644 index 0000000..1a1ee8f --- /dev/null +++ b/assets/generated/icons/items/life_offering.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://brrnjysp2pbx2" +path="res://.godot/imported/life_offering.png-ccf31002429484aedaf54fd3b77e14a7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/life_offering.png" +dest_files=["res://.godot/imported/life_offering.png-ccf31002429484aedaf54fd3b77e14a7.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/life_proof.png b/assets/generated/icons/items/life_proof.png new file mode 100644 index 0000000..3d72809 Binary files /dev/null and b/assets/generated/icons/items/life_proof.png differ diff --git a/assets/generated/icons/items/life_proof.png.import b/assets/generated/icons/items/life_proof.png.import new file mode 100644 index 0000000..3ebb5a0 --- /dev/null +++ b/assets/generated/icons/items/life_proof.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b5434nmudxrfb" +path="res://.godot/imported/life_proof.png-10c057db4d931bef90ab3a33cd0ee0fc.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/life_proof.png" +dest_files=["res://.godot/imported/life_proof.png-10c057db4d931bef90ab3a33cd0ee0fc.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/living_wood.png b/assets/generated/icons/items/living_wood.png new file mode 100644 index 0000000..94f595d Binary files /dev/null and b/assets/generated/icons/items/living_wood.png differ diff --git a/assets/generated/icons/items/living_wood.png.import b/assets/generated/icons/items/living_wood.png.import new file mode 100644 index 0000000..b4c2c06 --- /dev/null +++ b/assets/generated/icons/items/living_wood.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d1c1mv22s4jo2" +path="res://.godot/imported/living_wood.png-d736819fca0062c2f804a738fba20aa6.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/living_wood.png" +dest_files=["res://.godot/imported/living_wood.png-d736819fca0062c2f804a738fba20aa6.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/mature_proof_seed.png b/assets/generated/icons/items/mature_proof_seed.png new file mode 100644 index 0000000..c036916 Binary files /dev/null and b/assets/generated/icons/items/mature_proof_seed.png differ diff --git a/assets/generated/icons/items/mature_proof_seed.png.import b/assets/generated/icons/items/mature_proof_seed.png.import new file mode 100644 index 0000000..4a39c1d --- /dev/null +++ b/assets/generated/icons/items/mature_proof_seed.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bfypag0octhn2" +path="res://.godot/imported/mature_proof_seed.png-a4d811b5ca9219852a15b6ab8cd090dd.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/mature_proof_seed.png" +dest_files=["res://.godot/imported/mature_proof_seed.png-a4d811b5ca9219852a15b6ab8cd090dd.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/memory_blank.png b/assets/generated/icons/items/memory_blank.png new file mode 100644 index 0000000..fb7923a Binary files /dev/null and b/assets/generated/icons/items/memory_blank.png differ diff --git a/assets/generated/icons/items/memory_blank.png.import b/assets/generated/icons/items/memory_blank.png.import new file mode 100644 index 0000000..c2057e9 --- /dev/null +++ b/assets/generated/icons/items/memory_blank.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b6rukt70yxgam" +path="res://.godot/imported/memory_blank.png-8b3ba29e5fef34369fd8ad02a12049ca.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/memory_blank.png" +dest_files=["res://.godot/imported/memory_blank.png-8b3ba29e5fef34369fd8ad02a12049ca.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/mirror_coordinate.png b/assets/generated/icons/items/mirror_coordinate.png new file mode 100644 index 0000000..0682344 Binary files /dev/null and b/assets/generated/icons/items/mirror_coordinate.png differ diff --git a/assets/generated/icons/items/mirror_coordinate.png.import b/assets/generated/icons/items/mirror_coordinate.png.import new file mode 100644 index 0000000..df74258 --- /dev/null +++ b/assets/generated/icons/items/mirror_coordinate.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://jfr30shf87rg" +path="res://.godot/imported/mirror_coordinate.png-37eab0f42ef4bbe809acbf01a9371bc8.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/mirror_coordinate.png" +dest_files=["res://.godot/imported/mirror_coordinate.png-37eab0f42ef4bbe809acbf01a9371bc8.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/mirror_echo.png b/assets/generated/icons/items/mirror_echo.png new file mode 100644 index 0000000..2dc4038 Binary files /dev/null and b/assets/generated/icons/items/mirror_echo.png differ diff --git a/assets/generated/icons/items/mirror_echo.png.import b/assets/generated/icons/items/mirror_echo.png.import new file mode 100644 index 0000000..5e431a5 --- /dev/null +++ b/assets/generated/icons/items/mirror_echo.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b2vwgyxvsrev8" +path="res://.godot/imported/mirror_echo.png-8626bc63ca2f35beda68e4cdf196fcf2.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/mirror_echo.png" +dest_files=["res://.godot/imported/mirror_echo.png-8626bc63ca2f35beda68e4cdf196fcf2.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/mirror_offering.png b/assets/generated/icons/items/mirror_offering.png new file mode 100644 index 0000000..c3e8a67 Binary files /dev/null and b/assets/generated/icons/items/mirror_offering.png differ diff --git a/assets/generated/icons/items/mirror_offering.png.import b/assets/generated/icons/items/mirror_offering.png.import new file mode 100644 index 0000000..4a3368f --- /dev/null +++ b/assets/generated/icons/items/mirror_offering.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bc50k5v20jgji" +path="res://.godot/imported/mirror_offering.png-3ed39c6ebdcc4009e2183223eb90c06f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/mirror_offering.png" +dest_files=["res://.godot/imported/mirror_offering.png-3ed39c6ebdcc4009e2183223eb90c06f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/molten_phase_medium.png b/assets/generated/icons/items/molten_phase_medium.png new file mode 100644 index 0000000..4e27724 Binary files /dev/null and b/assets/generated/icons/items/molten_phase_medium.png differ diff --git a/assets/generated/icons/items/molten_phase_medium.png.import b/assets/generated/icons/items/molten_phase_medium.png.import new file mode 100644 index 0000000..60ccc65 --- /dev/null +++ b/assets/generated/icons/items/molten_phase_medium.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bihlgh8mm4fnu" +path="res://.godot/imported/molten_phase_medium.png-d5cd262b24bab3b6f8de4151407a7985.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/molten_phase_medium.png" +dest_files=["res://.godot/imported/molten_phase_medium.png-d5cd262b24bab3b6f8de4151407a7985.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/name_strip_blank.png b/assets/generated/icons/items/name_strip_blank.png new file mode 100644 index 0000000..e664629 Binary files /dev/null and b/assets/generated/icons/items/name_strip_blank.png differ diff --git a/assets/generated/icons/items/name_strip_blank.png.import b/assets/generated/icons/items/name_strip_blank.png.import new file mode 100644 index 0000000..b5e23c9 --- /dev/null +++ b/assets/generated/icons/items/name_strip_blank.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c8idhtdg6ey5o" +path="res://.godot/imported/name_strip_blank.png-8ca6036a4d1584beb0d292000329da37.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/name_strip_blank.png" +dest_files=["res://.godot/imported/name_strip_blank.png-8ca6036a4d1584beb0d292000329da37.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/named_test_strip.png b/assets/generated/icons/items/named_test_strip.png new file mode 100644 index 0000000..70fd0f6 Binary files /dev/null and b/assets/generated/icons/items/named_test_strip.png differ diff --git a/assets/generated/icons/items/named_test_strip.png.import b/assets/generated/icons/items/named_test_strip.png.import new file mode 100644 index 0000000..90f9d17 --- /dev/null +++ b/assets/generated/icons/items/named_test_strip.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ce3ud0u8dahw8" +path="res://.godot/imported/named_test_strip.png-30a071c0222d0542d415858f400ab004.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/named_test_strip.png" +dest_files=["res://.godot/imported/named_test_strip.png-30a071c0222d0542d415858f400ab004.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/paradox_proof.png b/assets/generated/icons/items/paradox_proof.png new file mode 100644 index 0000000..1d5db9f Binary files /dev/null and b/assets/generated/icons/items/paradox_proof.png differ diff --git a/assets/generated/icons/items/paradox_proof.png.import b/assets/generated/icons/items/paradox_proof.png.import new file mode 100644 index 0000000..e5e825f --- /dev/null +++ b/assets/generated/icons/items/paradox_proof.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dvm5d648vybmv" +path="res://.godot/imported/paradox_proof.png-6839e5176051c841298f9fa78bdcbb3c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/paradox_proof.png" +dest_files=["res://.godot/imported/paradox_proof.png-6839e5176051c841298f9fa78bdcbb3c.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/paradox_residue.png b/assets/generated/icons/items/paradox_residue.png new file mode 100644 index 0000000..ff32443 Binary files /dev/null and b/assets/generated/icons/items/paradox_residue.png differ diff --git a/assets/generated/icons/items/paradox_residue.png.import b/assets/generated/icons/items/paradox_residue.png.import new file mode 100644 index 0000000..22bd397 --- /dev/null +++ b/assets/generated/icons/items/paradox_residue.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dedg3h30o6dnp" +path="res://.godot/imported/paradox_residue.png-d84a3bce1c76d1d348b20e25c6130846.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/paradox_residue.png" +dest_files=["res://.godot/imported/paradox_residue.png-d84a3bce1c76d1d348b20e25c6130846.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/phase_medium.png b/assets/generated/icons/items/phase_medium.png new file mode 100644 index 0000000..44031aa Binary files /dev/null and b/assets/generated/icons/items/phase_medium.png differ diff --git a/assets/generated/icons/items/phase_medium.png.import b/assets/generated/icons/items/phase_medium.png.import new file mode 100644 index 0000000..1787800 --- /dev/null +++ b/assets/generated/icons/items/phase_medium.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cna7sk6d6vn4y" +path="res://.godot/imported/phase_medium.png-fcbde5ccfd66139869cf204f26c108d2.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/phase_medium.png" +dest_files=["res://.godot/imported/phase_medium.png-fcbde5ccfd66139869cf204f26c108d2.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/proof_seed.png b/assets/generated/icons/items/proof_seed.png new file mode 100644 index 0000000..796d047 Binary files /dev/null and b/assets/generated/icons/items/proof_seed.png differ diff --git a/assets/generated/icons/items/proof_seed.png.import b/assets/generated/icons/items/proof_seed.png.import new file mode 100644 index 0000000..7099552 --- /dev/null +++ b/assets/generated/icons/items/proof_seed.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dxcrajj8sabn7" +path="res://.godot/imported/proof_seed.png-cbaca0388e057c0146c40989715b0b85.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/proof_seed.png" +dest_files=["res://.godot/imported/proof_seed.png-cbaca0388e057c0146c40989715b0b85.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/raw_mana_crystal.png b/assets/generated/icons/items/raw_mana_crystal.png new file mode 100644 index 0000000..a5cbad0 Binary files /dev/null and b/assets/generated/icons/items/raw_mana_crystal.png differ diff --git a/assets/generated/icons/items/raw_mana_crystal.png.import b/assets/generated/icons/items/raw_mana_crystal.png.import new file mode 100644 index 0000000..9a7cd23 --- /dev/null +++ b/assets/generated/icons/items/raw_mana_crystal.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://qsndq6nvhfnv" +path="res://.godot/imported/raw_mana_crystal.png-5504a3fe227749fdcb0d90d9091a2e23.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/raw_mana_crystal.png" +dest_files=["res://.godot/imported/raw_mana_crystal.png-5504a3fe227749fdcb0d90d9091a2e23.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/recovered_memory.png b/assets/generated/icons/items/recovered_memory.png new file mode 100644 index 0000000..9afcb3a Binary files /dev/null and b/assets/generated/icons/items/recovered_memory.png differ diff --git a/assets/generated/icons/items/recovered_memory.png.import b/assets/generated/icons/items/recovered_memory.png.import new file mode 100644 index 0000000..c4fcf91 --- /dev/null +++ b/assets/generated/icons/items/recovered_memory.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cshwgwkdrrv0j" +path="res://.godot/imported/recovered_memory.png-ce80d305ce665ff0998509c01df961fc.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/recovered_memory.png" +dest_files=["res://.godot/imported/recovered_memory.png-ce80d305ce665ff0998509c01df961fc.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/refractory_coating.png b/assets/generated/icons/items/refractory_coating.png new file mode 100644 index 0000000..2858d80 Binary files /dev/null and b/assets/generated/icons/items/refractory_coating.png differ diff --git a/assets/generated/icons/items/refractory_coating.png.import b/assets/generated/icons/items/refractory_coating.png.import new file mode 100644 index 0000000..0f88a26 --- /dev/null +++ b/assets/generated/icons/items/refractory_coating.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://duykjp7l0hv07" +path="res://.godot/imported/refractory_coating.png-a740e9349a26999eafd57b02d1f00661.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/refractory_coating.png" +dest_files=["res://.godot/imported/refractory_coating.png-a740e9349a26999eafd57b02d1f00661.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/returned_test_strip.png b/assets/generated/icons/items/returned_test_strip.png new file mode 100644 index 0000000..7ca63f3 Binary files /dev/null and b/assets/generated/icons/items/returned_test_strip.png differ diff --git a/assets/generated/icons/items/returned_test_strip.png.import b/assets/generated/icons/items/returned_test_strip.png.import new file mode 100644 index 0000000..960b95c --- /dev/null +++ b/assets/generated/icons/items/returned_test_strip.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://vodkhnqcj8pm" +path="res://.godot/imported/returned_test_strip.png-3cbb5b73f8a857be65e6e2a84b4dd62a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/returned_test_strip.png" +dest_files=["res://.godot/imported/returned_test_strip.png-3cbb5b73f8a857be65e6e2a84b4dd62a.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/root_fiber.png b/assets/generated/icons/items/root_fiber.png new file mode 100644 index 0000000..145c027 Binary files /dev/null and b/assets/generated/icons/items/root_fiber.png differ diff --git a/assets/generated/icons/items/root_fiber.png.import b/assets/generated/icons/items/root_fiber.png.import new file mode 100644 index 0000000..dc881e8 --- /dev/null +++ b/assets/generated/icons/items/root_fiber.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://btr1b2mpg13b3" +path="res://.godot/imported/root_fiber.png-c47eaa5c3e7880fe29c0ea9d0bc1c2d8.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/root_fiber.png" +dest_files=["res://.godot/imported/root_fiber.png-c47eaa5c3e7880fe29c0ea9d0bc1c2d8.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/rune_clay.png b/assets/generated/icons/items/rune_clay.png new file mode 100644 index 0000000..4ba2c5a Binary files /dev/null and b/assets/generated/icons/items/rune_clay.png differ diff --git a/assets/generated/icons/items/rune_clay.png.import b/assets/generated/icons/items/rune_clay.png.import new file mode 100644 index 0000000..8902d5f --- /dev/null +++ b/assets/generated/icons/items/rune_clay.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bnl7mqo37fcnm" +path="res://.godot/imported/rune_clay.png-e37991ff8b3e69ddd50258f47a03a2d9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/rune_clay.png" +dest_files=["res://.godot/imported/rune_clay.png-e37991ff8b3e69ddd50258f47a03a2d9.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/shadow_matter.png b/assets/generated/icons/items/shadow_matter.png new file mode 100644 index 0000000..33ae178 Binary files /dev/null and b/assets/generated/icons/items/shadow_matter.png differ diff --git a/assets/generated/icons/items/shadow_matter.png.import b/assets/generated/icons/items/shadow_matter.png.import new file mode 100644 index 0000000..1e532a8 --- /dev/null +++ b/assets/generated/icons/items/shadow_matter.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dgndyl1wnrqns" +path="res://.godot/imported/shadow_matter.png-f4e160dba1ba75915409aef3cbb97131.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/shadow_matter.png" +dest_files=["res://.godot/imported/shadow_matter.png-f4e160dba1ba75915409aef3cbb97131.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/slag.png b/assets/generated/icons/items/slag.png new file mode 100644 index 0000000..426ff47 Binary files /dev/null and b/assets/generated/icons/items/slag.png differ diff --git a/assets/generated/icons/items/slag.png.import b/assets/generated/icons/items/slag.png.import new file mode 100644 index 0000000..5deb50a --- /dev/null +++ b/assets/generated/icons/items/slag.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dw2wifiqk4uy3" +path="res://.godot/imported/slag.png-b6a9b7579b45c3ffed8e0d0e1f94f710.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/slag.png" +dest_files=["res://.godot/imported/slag.png-b6a9b7579b45c3ffed8e0d0e1f94f710.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/soul_ember.png b/assets/generated/icons/items/soul_ember.png new file mode 100644 index 0000000..5c5de36 Binary files /dev/null and b/assets/generated/icons/items/soul_ember.png differ diff --git a/assets/generated/icons/items/soul_ember.png.import b/assets/generated/icons/items/soul_ember.png.import new file mode 100644 index 0000000..d00b243 --- /dev/null +++ b/assets/generated/icons/items/soul_ember.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dbx31kp7y46py" +path="res://.godot/imported/soul_ember.png-0fac70f287a7cac77e9f56a49a2e0e19.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/soul_ember.png" +dest_files=["res://.godot/imported/soul_ember.png-0fac70f287a7cac77e9f56a49a2e0e19.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/space_anchor_core.png b/assets/generated/icons/items/space_anchor_core.png new file mode 100644 index 0000000..7af47fd Binary files /dev/null and b/assets/generated/icons/items/space_anchor_core.png differ diff --git a/assets/generated/icons/items/space_anchor_core.png.import b/assets/generated/icons/items/space_anchor_core.png.import new file mode 100644 index 0000000..5be3db4 --- /dev/null +++ b/assets/generated/icons/items/space_anchor_core.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dq6jdbxso1vum" +path="res://.godot/imported/space_anchor_core.png-77d650327a550794171e02f3d8c0db6f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/space_anchor_core.png" +dest_files=["res://.godot/imported/space_anchor_core.png-77d650327a550794171e02f3d8c0db6f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/star_iron_ingot.png b/assets/generated/icons/items/star_iron_ingot.png new file mode 100644 index 0000000..1a1f25d Binary files /dev/null and b/assets/generated/icons/items/star_iron_ingot.png differ diff --git a/assets/generated/icons/items/star_iron_ingot.png.import b/assets/generated/icons/items/star_iron_ingot.png.import new file mode 100644 index 0000000..a65d6f7 --- /dev/null +++ b/assets/generated/icons/items/star_iron_ingot.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cdvcg4hagm5ue" +path="res://.godot/imported/star_iron_ingot.png-f19b35c128655ab2c86cc37c73ef1e9d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/star_iron_ingot.png" +dest_files=["res://.godot/imported/star_iron_ingot.png-f19b35c128655ab2c86cc37c73ef1e9d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/star_iron_ore.png b/assets/generated/icons/items/star_iron_ore.png new file mode 100644 index 0000000..e702d30 Binary files /dev/null and b/assets/generated/icons/items/star_iron_ore.png differ diff --git a/assets/generated/icons/items/star_iron_ore.png.import b/assets/generated/icons/items/star_iron_ore.png.import new file mode 100644 index 0000000..2b1eff0 --- /dev/null +++ b/assets/generated/icons/items/star_iron_ore.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c236ngfo1w7po" +path="res://.godot/imported/star_iron_ore.png-66201ad1989338c2291f83fd101d06d3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/star_iron_ore.png" +dest_files=["res://.godot/imported/star_iron_ore.png-66201ad1989338c2291f83fd101d06d3.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/tide_rune.png b/assets/generated/icons/items/tide_rune.png new file mode 100644 index 0000000..fb92be7 Binary files /dev/null and b/assets/generated/icons/items/tide_rune.png differ diff --git a/assets/generated/icons/items/tide_rune.png.import b/assets/generated/icons/items/tide_rune.png.import new file mode 100644 index 0000000..5a4c654 --- /dev/null +++ b/assets/generated/icons/items/tide_rune.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bvxnii5kaxnu0" +path="res://.godot/imported/tide_rune.png-1c2a1fc13dbffe2ee330938d13494a36.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/tide_rune.png" +dest_files=["res://.godot/imported/tide_rune.png-1c2a1fc13dbffe2ee330938d13494a36.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/tribute_block.png b/assets/generated/icons/items/tribute_block.png new file mode 100644 index 0000000..da1e6d1 Binary files /dev/null and b/assets/generated/icons/items/tribute_block.png differ diff --git a/assets/generated/icons/items/tribute_block.png.import b/assets/generated/icons/items/tribute_block.png.import new file mode 100644 index 0000000..6c0b090 --- /dev/null +++ b/assets/generated/icons/items/tribute_block.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cagcb2u5vesgj" +path="res://.godot/imported/tribute_block.png-35dd6dacba347ff749fb97d0cb378979.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/tribute_block.png" +dest_files=["res://.godot/imported/tribute_block.png-35dd6dacba347ff749fb97d0cb378979.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/true_name_thread.png b/assets/generated/icons/items/true_name_thread.png new file mode 100644 index 0000000..e748326 Binary files /dev/null and b/assets/generated/icons/items/true_name_thread.png differ diff --git a/assets/generated/icons/items/true_name_thread.png.import b/assets/generated/icons/items/true_name_thread.png.import new file mode 100644 index 0000000..4a6cd15 --- /dev/null +++ b/assets/generated/icons/items/true_name_thread.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://blb3csxn1kbkd" +path="res://.godot/imported/true_name_thread.png-9809f5528196e20f9cea41b4ad8ebdf3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/true_name_thread.png" +dest_files=["res://.godot/imported/true_name_thread.png-9809f5528196e20f9cea41b4ad8ebdf3.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/twilight_reagent.png b/assets/generated/icons/items/twilight_reagent.png new file mode 100644 index 0000000..a9cc6e6 Binary files /dev/null and b/assets/generated/icons/items/twilight_reagent.png differ diff --git a/assets/generated/icons/items/twilight_reagent.png.import b/assets/generated/icons/items/twilight_reagent.png.import new file mode 100644 index 0000000..c324ac7 --- /dev/null +++ b/assets/generated/icons/items/twilight_reagent.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bb3tir4td11h1" +path="res://.godot/imported/twilight_reagent.png-1800c05aa889dcfb0f722cd4add8e21f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/twilight_reagent.png" +dest_files=["res://.godot/imported/twilight_reagent.png-1800c05aa889dcfb0f722cd4add8e21f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/walker_construct.png b/assets/generated/icons/items/walker_construct.png new file mode 100644 index 0000000..2f1b974 Binary files /dev/null and b/assets/generated/icons/items/walker_construct.png differ diff --git a/assets/generated/icons/items/walker_construct.png.import b/assets/generated/icons/items/walker_construct.png.import new file mode 100644 index 0000000..e28ec4b --- /dev/null +++ b/assets/generated/icons/items/walker_construct.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b6hsg8bsfyvhi" +path="res://.godot/imported/walker_construct.png-cf0955c4fb2b6303ce7278a348c95590.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/walker_construct.png" +dest_files=["res://.godot/imported/walker_construct.png-cf0955c4fb2b6303ce7278a348c95590.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/icons/items/wild_proof_seed.png b/assets/generated/icons/items/wild_proof_seed.png new file mode 100644 index 0000000..aff6758 Binary files /dev/null and b/assets/generated/icons/items/wild_proof_seed.png differ diff --git a/assets/generated/icons/items/wild_proof_seed.png.import b/assets/generated/icons/items/wild_proof_seed.png.import new file mode 100644 index 0000000..047c51c --- /dev/null +++ b/assets/generated/icons/items/wild_proof_seed.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d27kxad3qfkj7" +path="res://.godot/imported/wild_proof_seed.png-4869d3d9a08bf86b23c79a56741c62b7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/icons/items/wild_proof_seed.png" +dest_files=["res://.godot/imported/wild_proof_seed.png-4869d3d9a08bf86b23c79a56741c62b7.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/materials/aged_brass.png b/assets/generated/materials/aged_brass.png new file mode 100644 index 0000000..59af175 Binary files /dev/null and b/assets/generated/materials/aged_brass.png differ diff --git a/assets/generated/materials/aged_brass.png.import b/assets/generated/materials/aged_brass.png.import new file mode 100644 index 0000000..5210078 --- /dev/null +++ b/assets/generated/materials/aged_brass.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c2o6a8hk4o8h7" +path="res://.godot/imported/aged_brass.png-0e869e786d7b7e1905c11d302b4808fe.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/materials/aged_brass.png" +dest_files=["res://.godot/imported/aged_brass.png-0e869e786d7b7e1905c11d302b4808fe.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/materials/bone_ash.png b/assets/generated/materials/bone_ash.png new file mode 100644 index 0000000..0fbf2bd Binary files /dev/null and b/assets/generated/materials/bone_ash.png differ diff --git a/assets/generated/materials/bone_ash.png.import b/assets/generated/materials/bone_ash.png.import new file mode 100644 index 0000000..32ebd01 --- /dev/null +++ b/assets/generated/materials/bone_ash.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://chjur6kwlbnfu" +path="res://.godot/imported/bone_ash.png-2777c0b8878360dd554fd63e15ceb43f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/materials/bone_ash.png" +dest_files=["res://.godot/imported/bone_ash.png-2777c0b8878360dd554fd63e15ceb43f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/materials/ember_crust.png b/assets/generated/materials/ember_crust.png new file mode 100644 index 0000000..a4c7211 Binary files /dev/null and b/assets/generated/materials/ember_crust.png differ diff --git a/assets/generated/materials/ember_crust.png.import b/assets/generated/materials/ember_crust.png.import new file mode 100644 index 0000000..4066568 --- /dev/null +++ b/assets/generated/materials/ember_crust.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bvgxno0boyos6" +path="res://.godot/imported/ember_crust.png-f0aee4c60672bb84690de96c19d0e790.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/materials/ember_crust.png" +dest_files=["res://.godot/imported/ember_crust.png-f0aee4c60672bb84690de96c19d0e790.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/materials/factory_stone.png b/assets/generated/materials/factory_stone.png new file mode 100644 index 0000000..00075f7 Binary files /dev/null and b/assets/generated/materials/factory_stone.png differ diff --git a/assets/generated/materials/factory_stone.png.import b/assets/generated/materials/factory_stone.png.import new file mode 100644 index 0000000..96f8095 --- /dev/null +++ b/assets/generated/materials/factory_stone.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://blcfn3x3l1pfm" +path="res://.godot/imported/factory_stone.png-afd3397b84c2d2a329a156daa4d8f39a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/materials/factory_stone.png" +dest_files=["res://.godot/imported/factory_stone.png-afd3397b84c2d2a329a156daa4d8f39a.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/materials/living_bark.png b/assets/generated/materials/living_bark.png new file mode 100644 index 0000000..4d9ea11 Binary files /dev/null and b/assets/generated/materials/living_bark.png differ diff --git a/assets/generated/materials/living_bark.png.import b/assets/generated/materials/living_bark.png.import new file mode 100644 index 0000000..d06fabc --- /dev/null +++ b/assets/generated/materials/living_bark.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cc22q5784o7s3" +path="res://.godot/imported/living_bark.png-b7ced3848990279e6d12ad76c9cc3d81.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/materials/living_bark.png" +dest_files=["res://.godot/imported/living_bark.png-b7ced3848990279e6d12ad76c9cc3d81.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/materials/mana_glass.png b/assets/generated/materials/mana_glass.png new file mode 100644 index 0000000..7e8682c Binary files /dev/null and b/assets/generated/materials/mana_glass.png differ diff --git a/assets/generated/materials/mana_glass.png.import b/assets/generated/materials/mana_glass.png.import new file mode 100644 index 0000000..08b1981 --- /dev/null +++ b/assets/generated/materials/mana_glass.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://s05c0b6prjdf" +path="res://.godot/imported/mana_glass.png-db3e258d649cca764e5440b93d55be4c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/materials/mana_glass.png" +dest_files=["res://.godot/imported/mana_glass.png-db3e258d649cca764e5440b93d55be4c.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/materials/paradox_silk.png b/assets/generated/materials/paradox_silk.png new file mode 100644 index 0000000..76bd999 Binary files /dev/null and b/assets/generated/materials/paradox_silk.png differ diff --git a/assets/generated/materials/paradox_silk.png.import b/assets/generated/materials/paradox_silk.png.import new file mode 100644 index 0000000..4670fad --- /dev/null +++ b/assets/generated/materials/paradox_silk.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://t30wgxbplvgw" +path="res://.godot/imported/paradox_silk.png-881b7fc05e4982e18eb061bdbd46a530.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/materials/paradox_silk.png" +dest_files=["res://.godot/imported/paradox_silk.png-881b7fc05e4982e18eb061bdbd46a530.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/materials/rift_gold.png b/assets/generated/materials/rift_gold.png new file mode 100644 index 0000000..dbaa832 Binary files /dev/null and b/assets/generated/materials/rift_gold.png differ diff --git a/assets/generated/materials/rift_gold.png.import b/assets/generated/materials/rift_gold.png.import new file mode 100644 index 0000000..4f000cd --- /dev/null +++ b/assets/generated/materials/rift_gold.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b12cl6dwjpaq7" +path="res://.godot/imported/rift_gold.png-96bd079fa9ab850cc23faa523606504b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/materials/rift_gold.png" +dest_files=["res://.godot/imported/rift_gold.png-96bd079fa9ab850cc23faa523606504b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/materials/rune_slate.png b/assets/generated/materials/rune_slate.png new file mode 100644 index 0000000..ddada2e Binary files /dev/null and b/assets/generated/materials/rune_slate.png differ diff --git a/assets/generated/materials/rune_slate.png.import b/assets/generated/materials/rune_slate.png.import new file mode 100644 index 0000000..ec1403b --- /dev/null +++ b/assets/generated/materials/rune_slate.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d3oki4xvaeiom" +path="res://.godot/imported/rune_slate.png-46440d3ae1e44808eb1fb7230a16ae99.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/materials/rune_slate.png" +dest_files=["res://.godot/imported/rune_slate.png-46440d3ae1e44808eb1fb7230a16ae99.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/materials/star_mirror.png b/assets/generated/materials/star_mirror.png new file mode 100644 index 0000000..bc0265f Binary files /dev/null and b/assets/generated/materials/star_mirror.png differ diff --git a/assets/generated/materials/star_mirror.png.import b/assets/generated/materials/star_mirror.png.import new file mode 100644 index 0000000..342ef46 --- /dev/null +++ b/assets/generated/materials/star_mirror.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dqp3lh3jdfm4q" +path="res://.godot/imported/star_mirror.png-ff45cd170c347c2a501373b7af6af147.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/materials/star_mirror.png" +dest_files=["res://.godot/imported/star_mirror.png-ff45cd170c347c2a501373b7af6af147.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/anomaly_relic.png b/assets/generated/renders/items/anomaly_relic.png new file mode 100644 index 0000000..3c136aa Binary files /dev/null and b/assets/generated/renders/items/anomaly_relic.png differ diff --git a/assets/generated/renders/items/anomaly_relic.png.import b/assets/generated/renders/items/anomaly_relic.png.import new file mode 100644 index 0000000..63dfea8 --- /dev/null +++ b/assets/generated/renders/items/anomaly_relic.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://by0xhrm3o3j1n" +path="res://.godot/imported/anomaly_relic.png-77fcb27f8bfa0e162c44494b17d2414f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/anomaly_relic.png" +dest_files=["res://.godot/imported/anomaly_relic.png-77fcb27f8bfa0e162c44494b17d2414f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/awakened_crystal.png b/assets/generated/renders/items/awakened_crystal.png new file mode 100644 index 0000000..8bf6997 Binary files /dev/null and b/assets/generated/renders/items/awakened_crystal.png differ diff --git a/assets/generated/renders/items/awakened_crystal.png.import b/assets/generated/renders/items/awakened_crystal.png.import new file mode 100644 index 0000000..0aa4b32 --- /dev/null +++ b/assets/generated/renders/items/awakened_crystal.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://olmfcy8gtk1h" +path="res://.godot/imported/awakened_crystal.png-66e6a09d1e7baf25a5e0fd7d9ad16906.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/awakened_crystal.png" +dest_files=["res://.godot/imported/awakened_crystal.png-66e6a09d1e7baf25a5e0fd7d9ad16906.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/blank_tablet.png b/assets/generated/renders/items/blank_tablet.png new file mode 100644 index 0000000..6e0421f Binary files /dev/null and b/assets/generated/renders/items/blank_tablet.png differ diff --git a/assets/generated/renders/items/blank_tablet.png.import b/assets/generated/renders/items/blank_tablet.png.import new file mode 100644 index 0000000..24d3356 --- /dev/null +++ b/assets/generated/renders/items/blank_tablet.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dmiw681uyf16m" +path="res://.godot/imported/blank_tablet.png-8a6873fe662835dcbfb09f8dcd70579d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/blank_tablet.png" +dest_files=["res://.godot/imported/blank_tablet.png-8a6873fe662835dcbfb09f8dcd70579d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/blight.png b/assets/generated/renders/items/blight.png new file mode 100644 index 0000000..da81672 Binary files /dev/null and b/assets/generated/renders/items/blight.png differ diff --git a/assets/generated/renders/items/blight.png.import b/assets/generated/renders/items/blight.png.import new file mode 100644 index 0000000..29131da --- /dev/null +++ b/assets/generated/renders/items/blight.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://5l3y0a6md1jv" +path="res://.godot/imported/blight.png-cbba3aa1e086000436d5c6c906256061.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/blight.png" +dest_files=["res://.godot/imported/blight.png-cbba3aa1e086000436d5c6c906256061.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/bone_dust.png b/assets/generated/renders/items/bone_dust.png new file mode 100644 index 0000000..09fdbe3 Binary files /dev/null and b/assets/generated/renders/items/bone_dust.png differ diff --git a/assets/generated/renders/items/bone_dust.png.import b/assets/generated/renders/items/bone_dust.png.import new file mode 100644 index 0000000..143cd38 --- /dev/null +++ b/assets/generated/renders/items/bone_dust.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cdx3aed2lnl3b" +path="res://.godot/imported/bone_dust.png-71adb7fa4d54a8a92e7a03a4d46c0a33.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/bone_dust.png" +dest_files=["res://.godot/imported/bone_dust.png-71adb7fa4d54a8a92e7a03a4d46c0a33.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/boundary_stone.png b/assets/generated/renders/items/boundary_stone.png new file mode 100644 index 0000000..497b497 Binary files /dev/null and b/assets/generated/renders/items/boundary_stone.png differ diff --git a/assets/generated/renders/items/boundary_stone.png.import b/assets/generated/renders/items/boundary_stone.png.import new file mode 100644 index 0000000..6b3beb0 --- /dev/null +++ b/assets/generated/renders/items/boundary_stone.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cghwoym81sb22" +path="res://.godot/imported/boundary_stone.png-8a8bd4968035c39954a4888570fa5403.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/boundary_stone.png" +dest_files=["res://.godot/imported/boundary_stone.png-8a8bd4968035c39954a4888570fa5403.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/charged_phase_medium.png b/assets/generated/renders/items/charged_phase_medium.png new file mode 100644 index 0000000..34cdc64 Binary files /dev/null and b/assets/generated/renders/items/charged_phase_medium.png differ diff --git a/assets/generated/renders/items/charged_phase_medium.png.import b/assets/generated/renders/items/charged_phase_medium.png.import new file mode 100644 index 0000000..3711c50 --- /dev/null +++ b/assets/generated/renders/items/charged_phase_medium.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bgovcaxx7n4lg" +path="res://.godot/imported/charged_phase_medium.png-b87003e10d18eb764c49b6d39946bc47.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/charged_phase_medium.png" +dest_files=["res://.godot/imported/charged_phase_medium.png-b87003e10d18eb764c49b6d39946bc47.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/clay_construct.png b/assets/generated/renders/items/clay_construct.png new file mode 100644 index 0000000..160e644 Binary files /dev/null and b/assets/generated/renders/items/clay_construct.png differ diff --git a/assets/generated/renders/items/clay_construct.png.import b/assets/generated/renders/items/clay_construct.png.import new file mode 100644 index 0000000..7137c93 --- /dev/null +++ b/assets/generated/renders/items/clay_construct.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cotu3yblme621" +path="res://.godot/imported/clay_construct.png-03470ed0bbe10c216aa6a460cbfce841.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/clay_construct.png" +dest_files=["res://.godot/imported/clay_construct.png-03470ed0bbe10c216aa6a460cbfce841.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/clay_core.png b/assets/generated/renders/items/clay_core.png new file mode 100644 index 0000000..27aa15a Binary files /dev/null and b/assets/generated/renders/items/clay_core.png differ diff --git a/assets/generated/renders/items/clay_core.png.import b/assets/generated/renders/items/clay_core.png.import new file mode 100644 index 0000000..29f8807 --- /dev/null +++ b/assets/generated/renders/items/clay_core.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://do0biygw0q80x" +path="res://.godot/imported/clay_core.png-46c4c8ee38bb3aa3738c44172d04d6e2.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/clay_core.png" +dest_files=["res://.godot/imported/clay_core.png-46c4c8ee38bb3aa3738c44172d04d6e2.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/cold_phase_medium.png b/assets/generated/renders/items/cold_phase_medium.png new file mode 100644 index 0000000..fa3b8f2 Binary files /dev/null and b/assets/generated/renders/items/cold_phase_medium.png differ diff --git a/assets/generated/renders/items/cold_phase_medium.png.import b/assets/generated/renders/items/cold_phase_medium.png.import new file mode 100644 index 0000000..2d96b90 --- /dev/null +++ b/assets/generated/renders/items/cold_phase_medium.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d2q0ks1lebovk" +path="res://.godot/imported/cold_phase_medium.png-7bfc861853e20f3efed1aea64fc28172.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/cold_phase_medium.png" +dest_files=["res://.godot/imported/cold_phase_medium.png-7bfc861853e20f3efed1aea64fc28172.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/dawn_rune.png b/assets/generated/renders/items/dawn_rune.png new file mode 100644 index 0000000..8b180f7 Binary files /dev/null and b/assets/generated/renders/items/dawn_rune.png differ diff --git a/assets/generated/renders/items/dawn_rune.png.import b/assets/generated/renders/items/dawn_rune.png.import new file mode 100644 index 0000000..36dd928 --- /dev/null +++ b/assets/generated/renders/items/dawn_rune.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://t5dfcaktclma" +path="res://.godot/imported/dawn_rune.png-bdd4048218698205df83ce1e72434471.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/dawn_rune.png" +dest_files=["res://.godot/imported/dawn_rune.png-bdd4048218698205df83ce1e72434471.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/death_anchor_core.png b/assets/generated/renders/items/death_anchor_core.png new file mode 100644 index 0000000..cbaa07e Binary files /dev/null and b/assets/generated/renders/items/death_anchor_core.png differ diff --git a/assets/generated/renders/items/death_anchor_core.png.import b/assets/generated/renders/items/death_anchor_core.png.import new file mode 100644 index 0000000..3d960f4 --- /dev/null +++ b/assets/generated/renders/items/death_anchor_core.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dy83vpxi7kemj" +path="res://.godot/imported/death_anchor_core.png-d7849b7152b9355cfca5da6178a6fc87.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/death_anchor_core.png" +dest_files=["res://.godot/imported/death_anchor_core.png-d7849b7152b9355cfca5da6178a6fc87.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/death_offering.png b/assets/generated/renders/items/death_offering.png new file mode 100644 index 0000000..4ff8ef9 Binary files /dev/null and b/assets/generated/renders/items/death_offering.png differ diff --git a/assets/generated/renders/items/death_offering.png.import b/assets/generated/renders/items/death_offering.png.import new file mode 100644 index 0000000..584e929 --- /dev/null +++ b/assets/generated/renders/items/death_offering.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b20wiql4piy0k" +path="res://.godot/imported/death_offering.png-2d80f57a9a3d11b1e0af4bba30177eef.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/death_offering.png" +dest_files=["res://.godot/imported/death_offering.png-2d80f57a9a3d11b1e0af4bba30177eef.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/death_proof.png b/assets/generated/renders/items/death_proof.png new file mode 100644 index 0000000..635f758 Binary files /dev/null and b/assets/generated/renders/items/death_proof.png differ diff --git a/assets/generated/renders/items/death_proof.png.import b/assets/generated/renders/items/death_proof.png.import new file mode 100644 index 0000000..bb3359a --- /dev/null +++ b/assets/generated/renders/items/death_proof.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bvncqre30p8ht" +path="res://.godot/imported/death_proof.png-1e678f5bdac9825a68ed857608dc483b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/death_proof.png" +dest_files=["res://.godot/imported/death_proof.png-1e678f5bdac9825a68ed857608dc483b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/dimension_proof.png b/assets/generated/renders/items/dimension_proof.png new file mode 100644 index 0000000..ce42add Binary files /dev/null and b/assets/generated/renders/items/dimension_proof.png differ diff --git a/assets/generated/renders/items/dimension_proof.png.import b/assets/generated/renders/items/dimension_proof.png.import new file mode 100644 index 0000000..0473305 --- /dev/null +++ b/assets/generated/renders/items/dimension_proof.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bovdoivmx8hvl" +path="res://.godot/imported/dimension_proof.png-49d577f0af4671b10312447d982a59a2.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/dimension_proof.png" +dest_files=["res://.godot/imported/dimension_proof.png-49d577f0af4671b10312447d982a59a2.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/dragon_glass.png b/assets/generated/renders/items/dragon_glass.png new file mode 100644 index 0000000..bc66e73 Binary files /dev/null and b/assets/generated/renders/items/dragon_glass.png differ diff --git a/assets/generated/renders/items/dragon_glass.png.import b/assets/generated/renders/items/dragon_glass.png.import new file mode 100644 index 0000000..a3a416f --- /dev/null +++ b/assets/generated/renders/items/dragon_glass.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dben3mfeie6a1" +path="res://.godot/imported/dragon_glass.png-1faf6a75f078f64e282642d7deeeb3f1.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/dragon_glass.png" +dest_files=["res://.godot/imported/dragon_glass.png-1faf6a75f078f64e282642d7deeeb3f1.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/dusk_rune.png b/assets/generated/renders/items/dusk_rune.png new file mode 100644 index 0000000..e93d12f Binary files /dev/null and b/assets/generated/renders/items/dusk_rune.png differ diff --git a/assets/generated/renders/items/dusk_rune.png.import b/assets/generated/renders/items/dusk_rune.png.import new file mode 100644 index 0000000..853b04b --- /dev/null +++ b/assets/generated/renders/items/dusk_rune.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://coiqjc6xa26s6" +path="res://.godot/imported/dusk_rune.png-17b8a4e2ce938320ca6b2547b1011ef1.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/dusk_rune.png" +dest_files=["res://.godot/imported/dusk_rune.png-17b8a4e2ce938320ca6b2547b1011ef1.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/elemental_proof.png b/assets/generated/renders/items/elemental_proof.png new file mode 100644 index 0000000..5563d95 Binary files /dev/null and b/assets/generated/renders/items/elemental_proof.png differ diff --git a/assets/generated/renders/items/elemental_proof.png.import b/assets/generated/renders/items/elemental_proof.png.import new file mode 100644 index 0000000..6651420 --- /dev/null +++ b/assets/generated/renders/items/elemental_proof.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://2q1qm0pn7jrp" +path="res://.godot/imported/elemental_proof.png-a4980e23e1b0defc144d92799605cba7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/elemental_proof.png" +dest_files=["res://.godot/imported/elemental_proof.png-a4980e23e1b0defc144d92799605cba7.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/ember_core.png b/assets/generated/renders/items/ember_core.png new file mode 100644 index 0000000..0e95f9d Binary files /dev/null and b/assets/generated/renders/items/ember_core.png differ diff --git a/assets/generated/renders/items/ember_core.png.import b/assets/generated/renders/items/ember_core.png.import new file mode 100644 index 0000000..ad56d85 --- /dev/null +++ b/assets/generated/renders/items/ember_core.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://s35i4ej5vep1" +path="res://.godot/imported/ember_core.png-9d555605fad2c4cf40f7ece56086c49d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/ember_core.png" +dest_files=["res://.godot/imported/ember_core.png-9d555605fad2c4cf40f7ece56086c49d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/ember_offering.png b/assets/generated/renders/items/ember_offering.png new file mode 100644 index 0000000..e941472 Binary files /dev/null and b/assets/generated/renders/items/ember_offering.png differ diff --git a/assets/generated/renders/items/ember_offering.png.import b/assets/generated/renders/items/ember_offering.png.import new file mode 100644 index 0000000..f9ed87d --- /dev/null +++ b/assets/generated/renders/items/ember_offering.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://xbe5pu7lpjc" +path="res://.godot/imported/ember_offering.png-58c273c982400c0e2f62ea013122ab8c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/ember_offering.png" +dest_files=["res://.godot/imported/ember_offering.png-58c273c982400c0e2f62ea013122ab8c.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/entropy_crystal.png b/assets/generated/renders/items/entropy_crystal.png new file mode 100644 index 0000000..9c06da7 Binary files /dev/null and b/assets/generated/renders/items/entropy_crystal.png differ diff --git a/assets/generated/renders/items/entropy_crystal.png.import b/assets/generated/renders/items/entropy_crystal.png.import new file mode 100644 index 0000000..7e596c1 --- /dev/null +++ b/assets/generated/renders/items/entropy_crystal.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c3y5r4s4aoxxf" +path="res://.godot/imported/entropy_crystal.png-6372ef8c8e78fcc9c06f91f084044ee6.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/entropy_crystal.png" +dest_files=["res://.godot/imported/entropy_crystal.png-6372ef8c8e78fcc9c06f91f084044ee6.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/faded_memory.png b/assets/generated/renders/items/faded_memory.png new file mode 100644 index 0000000..ce23ea5 Binary files /dev/null and b/assets/generated/renders/items/faded_memory.png differ diff --git a/assets/generated/renders/items/faded_memory.png.import b/assets/generated/renders/items/faded_memory.png.import new file mode 100644 index 0000000..ab9bc1a --- /dev/null +++ b/assets/generated/renders/items/faded_memory.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://df13khv3brvwx" +path="res://.godot/imported/faded_memory.png-bafcaa333c8175db39a2a377d4dad18a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/faded_memory.png" +dest_files=["res://.godot/imported/faded_memory.png-bafcaa333c8175db39a2a377d4dad18a.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/fairy_dew.png b/assets/generated/renders/items/fairy_dew.png new file mode 100644 index 0000000..fd3e007 Binary files /dev/null and b/assets/generated/renders/items/fairy_dew.png differ diff --git a/assets/generated/renders/items/fairy_dew.png.import b/assets/generated/renders/items/fairy_dew.png.import new file mode 100644 index 0000000..8a64d75 --- /dev/null +++ b/assets/generated/renders/items/fairy_dew.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://8onmnpto0lno" +path="res://.godot/imported/fairy_dew.png-c46622c0612289ab20d44631559d6dbc.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/fairy_dew.png" +dest_files=["res://.godot/imported/fairy_dew.png-c46622c0612289ab20d44631559d6dbc.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/first_warp_record.png b/assets/generated/renders/items/first_warp_record.png new file mode 100644 index 0000000..7c256a7 Binary files /dev/null and b/assets/generated/renders/items/first_warp_record.png differ diff --git a/assets/generated/renders/items/first_warp_record.png.import b/assets/generated/renders/items/first_warp_record.png.import new file mode 100644 index 0000000..a79135b --- /dev/null +++ b/assets/generated/renders/items/first_warp_record.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://xo3j1ywotkhu" +path="res://.godot/imported/first_warp_record.png-1496bc2f83733d1c604785db0bcd8986.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/first_warp_record.png" +dest_files=["res://.godot/imported/first_warp_record.png-1496bc2f83733d1c604785db0bcd8986.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/inscription_proof.png b/assets/generated/renders/items/inscription_proof.png new file mode 100644 index 0000000..46c1d98 Binary files /dev/null and b/assets/generated/renders/items/inscription_proof.png differ diff --git a/assets/generated/renders/items/inscription_proof.png.import b/assets/generated/renders/items/inscription_proof.png.import new file mode 100644 index 0000000..aed8d88 --- /dev/null +++ b/assets/generated/renders/items/inscription_proof.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c50x6b5dqllu1" +path="res://.godot/imported/inscription_proof.png-2222fceb3814c8b24a231a3141401e6a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/inscription_proof.png" +dest_files=["res://.godot/imported/inscription_proof.png-2222fceb3814c8b24a231a3141401e6a.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/ley_water.png b/assets/generated/renders/items/ley_water.png new file mode 100644 index 0000000..7bb63e8 Binary files /dev/null and b/assets/generated/renders/items/ley_water.png differ diff --git a/assets/generated/renders/items/ley_water.png.import b/assets/generated/renders/items/ley_water.png.import new file mode 100644 index 0000000..9f16a29 --- /dev/null +++ b/assets/generated/renders/items/ley_water.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bv3tys5bh7qa7" +path="res://.godot/imported/ley_water.png-56d9df4ce6ec00232857a64acc1c7ad0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/ley_water.png" +dest_files=["res://.godot/imported/ley_water.png-56d9df4ce6ec00232857a64acc1c7ad0.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/life_anchor_core.png b/assets/generated/renders/items/life_anchor_core.png new file mode 100644 index 0000000..7afa197 Binary files /dev/null and b/assets/generated/renders/items/life_anchor_core.png differ diff --git a/assets/generated/renders/items/life_anchor_core.png.import b/assets/generated/renders/items/life_anchor_core.png.import new file mode 100644 index 0000000..35cd8a8 --- /dev/null +++ b/assets/generated/renders/items/life_anchor_core.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cskprm3ax2s1h" +path="res://.godot/imported/life_anchor_core.png-404da859d472c16d11aad1bc116e3ee3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/life_anchor_core.png" +dest_files=["res://.godot/imported/life_anchor_core.png-404da859d472c16d11aad1bc116e3ee3.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/life_offering.png b/assets/generated/renders/items/life_offering.png new file mode 100644 index 0000000..1f1d02b Binary files /dev/null and b/assets/generated/renders/items/life_offering.png differ diff --git a/assets/generated/renders/items/life_offering.png.import b/assets/generated/renders/items/life_offering.png.import new file mode 100644 index 0000000..eb51670 --- /dev/null +++ b/assets/generated/renders/items/life_offering.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://drkmtpn7j52d7" +path="res://.godot/imported/life_offering.png-076ac357c2b4943e5d3c9fe45eba095a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/life_offering.png" +dest_files=["res://.godot/imported/life_offering.png-076ac357c2b4943e5d3c9fe45eba095a.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/life_proof.png b/assets/generated/renders/items/life_proof.png new file mode 100644 index 0000000..052117c Binary files /dev/null and b/assets/generated/renders/items/life_proof.png differ diff --git a/assets/generated/renders/items/life_proof.png.import b/assets/generated/renders/items/life_proof.png.import new file mode 100644 index 0000000..768de57 --- /dev/null +++ b/assets/generated/renders/items/life_proof.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c4chl3orest4o" +path="res://.godot/imported/life_proof.png-e364ddec4e5554afefd6d565d8cf9e31.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/life_proof.png" +dest_files=["res://.godot/imported/life_proof.png-e364ddec4e5554afefd6d565d8cf9e31.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/living_wood.png b/assets/generated/renders/items/living_wood.png new file mode 100644 index 0000000..1bef493 Binary files /dev/null and b/assets/generated/renders/items/living_wood.png differ diff --git a/assets/generated/renders/items/living_wood.png.import b/assets/generated/renders/items/living_wood.png.import new file mode 100644 index 0000000..6e5a99a --- /dev/null +++ b/assets/generated/renders/items/living_wood.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cnom86cel56ny" +path="res://.godot/imported/living_wood.png-85368848fb50e8bfac100c75673b9dfe.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/living_wood.png" +dest_files=["res://.godot/imported/living_wood.png-85368848fb50e8bfac100c75673b9dfe.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/mature_proof_seed.png b/assets/generated/renders/items/mature_proof_seed.png new file mode 100644 index 0000000..c461662 Binary files /dev/null and b/assets/generated/renders/items/mature_proof_seed.png differ diff --git a/assets/generated/renders/items/mature_proof_seed.png.import b/assets/generated/renders/items/mature_proof_seed.png.import new file mode 100644 index 0000000..2d81f2a --- /dev/null +++ b/assets/generated/renders/items/mature_proof_seed.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bf8rj8btjwlpu" +path="res://.godot/imported/mature_proof_seed.png-53d48fad65c667239b4a311960419f5f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/mature_proof_seed.png" +dest_files=["res://.godot/imported/mature_proof_seed.png-53d48fad65c667239b4a311960419f5f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/memory_blank.png b/assets/generated/renders/items/memory_blank.png new file mode 100644 index 0000000..7935f61 Binary files /dev/null and b/assets/generated/renders/items/memory_blank.png differ diff --git a/assets/generated/renders/items/memory_blank.png.import b/assets/generated/renders/items/memory_blank.png.import new file mode 100644 index 0000000..d304fa4 --- /dev/null +++ b/assets/generated/renders/items/memory_blank.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c3qp2xfbmvphk" +path="res://.godot/imported/memory_blank.png-84abf1173df5200692479470653eee4e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/memory_blank.png" +dest_files=["res://.godot/imported/memory_blank.png-84abf1173df5200692479470653eee4e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/mirror_coordinate.png b/assets/generated/renders/items/mirror_coordinate.png new file mode 100644 index 0000000..d1c9add Binary files /dev/null and b/assets/generated/renders/items/mirror_coordinate.png differ diff --git a/assets/generated/renders/items/mirror_coordinate.png.import b/assets/generated/renders/items/mirror_coordinate.png.import new file mode 100644 index 0000000..f1a53a3 --- /dev/null +++ b/assets/generated/renders/items/mirror_coordinate.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://capplyy7hj0vd" +path="res://.godot/imported/mirror_coordinate.png-734e696b1f69a49d5df79854bb53ce69.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/mirror_coordinate.png" +dest_files=["res://.godot/imported/mirror_coordinate.png-734e696b1f69a49d5df79854bb53ce69.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/mirror_echo.png b/assets/generated/renders/items/mirror_echo.png new file mode 100644 index 0000000..30182f0 Binary files /dev/null and b/assets/generated/renders/items/mirror_echo.png differ diff --git a/assets/generated/renders/items/mirror_echo.png.import b/assets/generated/renders/items/mirror_echo.png.import new file mode 100644 index 0000000..73c56bd --- /dev/null +++ b/assets/generated/renders/items/mirror_echo.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bjr82ix5ho4xd" +path="res://.godot/imported/mirror_echo.png-84eabc63e5359736c3d69eeba5ebea0c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/mirror_echo.png" +dest_files=["res://.godot/imported/mirror_echo.png-84eabc63e5359736c3d69eeba5ebea0c.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/mirror_offering.png b/assets/generated/renders/items/mirror_offering.png new file mode 100644 index 0000000..b2abfdb Binary files /dev/null and b/assets/generated/renders/items/mirror_offering.png differ diff --git a/assets/generated/renders/items/mirror_offering.png.import b/assets/generated/renders/items/mirror_offering.png.import new file mode 100644 index 0000000..911422f --- /dev/null +++ b/assets/generated/renders/items/mirror_offering.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://db6khrhlc1mgt" +path="res://.godot/imported/mirror_offering.png-e40f2a233034b53c089906e4634c0cda.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/mirror_offering.png" +dest_files=["res://.godot/imported/mirror_offering.png-e40f2a233034b53c089906e4634c0cda.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/molten_phase_medium.png b/assets/generated/renders/items/molten_phase_medium.png new file mode 100644 index 0000000..0b885b5 Binary files /dev/null and b/assets/generated/renders/items/molten_phase_medium.png differ diff --git a/assets/generated/renders/items/molten_phase_medium.png.import b/assets/generated/renders/items/molten_phase_medium.png.import new file mode 100644 index 0000000..1a0450e --- /dev/null +++ b/assets/generated/renders/items/molten_phase_medium.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cqaw5y6jw38f4" +path="res://.godot/imported/molten_phase_medium.png-1bc96e83c93a1a8c02cadbbd15338e50.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/molten_phase_medium.png" +dest_files=["res://.godot/imported/molten_phase_medium.png-1bc96e83c93a1a8c02cadbbd15338e50.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/name_strip_blank.png b/assets/generated/renders/items/name_strip_blank.png new file mode 100644 index 0000000..8506557 Binary files /dev/null and b/assets/generated/renders/items/name_strip_blank.png differ diff --git a/assets/generated/renders/items/name_strip_blank.png.import b/assets/generated/renders/items/name_strip_blank.png.import new file mode 100644 index 0000000..f1b1794 --- /dev/null +++ b/assets/generated/renders/items/name_strip_blank.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://51vln4rax56e" +path="res://.godot/imported/name_strip_blank.png-23df3064e80b33ea50be2d1cda807dc4.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/name_strip_blank.png" +dest_files=["res://.godot/imported/name_strip_blank.png-23df3064e80b33ea50be2d1cda807dc4.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/named_test_strip.png b/assets/generated/renders/items/named_test_strip.png new file mode 100644 index 0000000..981ad6c Binary files /dev/null and b/assets/generated/renders/items/named_test_strip.png differ diff --git a/assets/generated/renders/items/named_test_strip.png.import b/assets/generated/renders/items/named_test_strip.png.import new file mode 100644 index 0000000..1e8f428 --- /dev/null +++ b/assets/generated/renders/items/named_test_strip.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d111enw77bdn0" +path="res://.godot/imported/named_test_strip.png-e5bdcfaa9ff5f55b3eba1894c0dca006.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/named_test_strip.png" +dest_files=["res://.godot/imported/named_test_strip.png-e5bdcfaa9ff5f55b3eba1894c0dca006.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/paradox_proof.png b/assets/generated/renders/items/paradox_proof.png new file mode 100644 index 0000000..f53f5f8 Binary files /dev/null and b/assets/generated/renders/items/paradox_proof.png differ diff --git a/assets/generated/renders/items/paradox_proof.png.import b/assets/generated/renders/items/paradox_proof.png.import new file mode 100644 index 0000000..b23c22b --- /dev/null +++ b/assets/generated/renders/items/paradox_proof.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b4irlxvahlyqr" +path="res://.godot/imported/paradox_proof.png-7e3acc80e96a67614afe92b06b97b8f9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/paradox_proof.png" +dest_files=["res://.godot/imported/paradox_proof.png-7e3acc80e96a67614afe92b06b97b8f9.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/paradox_residue.png b/assets/generated/renders/items/paradox_residue.png new file mode 100644 index 0000000..5e22dbf Binary files /dev/null and b/assets/generated/renders/items/paradox_residue.png differ diff --git a/assets/generated/renders/items/paradox_residue.png.import b/assets/generated/renders/items/paradox_residue.png.import new file mode 100644 index 0000000..d61a14b --- /dev/null +++ b/assets/generated/renders/items/paradox_residue.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ckuhnhwodeapu" +path="res://.godot/imported/paradox_residue.png-7a237f1d11495a0fa9dd9bc245677f56.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/paradox_residue.png" +dest_files=["res://.godot/imported/paradox_residue.png-7a237f1d11495a0fa9dd9bc245677f56.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/phase_medium.png b/assets/generated/renders/items/phase_medium.png new file mode 100644 index 0000000..3305f54 Binary files /dev/null and b/assets/generated/renders/items/phase_medium.png differ diff --git a/assets/generated/renders/items/phase_medium.png.import b/assets/generated/renders/items/phase_medium.png.import new file mode 100644 index 0000000..234206b --- /dev/null +++ b/assets/generated/renders/items/phase_medium.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c0wcc4cdmfmla" +path="res://.godot/imported/phase_medium.png-c37966969d5edff8196a05960996d1ba.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/phase_medium.png" +dest_files=["res://.godot/imported/phase_medium.png-c37966969d5edff8196a05960996d1ba.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/proof_seed.png b/assets/generated/renders/items/proof_seed.png new file mode 100644 index 0000000..fba4c45 Binary files /dev/null and b/assets/generated/renders/items/proof_seed.png differ diff --git a/assets/generated/renders/items/proof_seed.png.import b/assets/generated/renders/items/proof_seed.png.import new file mode 100644 index 0000000..ae84fd2 --- /dev/null +++ b/assets/generated/renders/items/proof_seed.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c68bxxsvw11lc" +path="res://.godot/imported/proof_seed.png-b094b8fe729991a3908919ef5b1e52a9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/proof_seed.png" +dest_files=["res://.godot/imported/proof_seed.png-b094b8fe729991a3908919ef5b1e52a9.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/raw_mana_crystal.png b/assets/generated/renders/items/raw_mana_crystal.png new file mode 100644 index 0000000..d515d70 Binary files /dev/null and b/assets/generated/renders/items/raw_mana_crystal.png differ diff --git a/assets/generated/renders/items/raw_mana_crystal.png.import b/assets/generated/renders/items/raw_mana_crystal.png.import new file mode 100644 index 0000000..b55ee22 --- /dev/null +++ b/assets/generated/renders/items/raw_mana_crystal.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bsrafemns3o78" +path="res://.godot/imported/raw_mana_crystal.png-9745d2af05104411b74fd408c94f382c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/raw_mana_crystal.png" +dest_files=["res://.godot/imported/raw_mana_crystal.png-9745d2af05104411b74fd408c94f382c.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/recovered_memory.png b/assets/generated/renders/items/recovered_memory.png new file mode 100644 index 0000000..143b1d9 Binary files /dev/null and b/assets/generated/renders/items/recovered_memory.png differ diff --git a/assets/generated/renders/items/recovered_memory.png.import b/assets/generated/renders/items/recovered_memory.png.import new file mode 100644 index 0000000..a070301 --- /dev/null +++ b/assets/generated/renders/items/recovered_memory.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://byy04e0l720ye" +path="res://.godot/imported/recovered_memory.png-b2633e421d137e790870c10289bf0060.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/recovered_memory.png" +dest_files=["res://.godot/imported/recovered_memory.png-b2633e421d137e790870c10289bf0060.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/refractory_coating.png b/assets/generated/renders/items/refractory_coating.png new file mode 100644 index 0000000..8c25feb Binary files /dev/null and b/assets/generated/renders/items/refractory_coating.png differ diff --git a/assets/generated/renders/items/refractory_coating.png.import b/assets/generated/renders/items/refractory_coating.png.import new file mode 100644 index 0000000..ff2a57e --- /dev/null +++ b/assets/generated/renders/items/refractory_coating.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dlytlpk4pld4o" +path="res://.godot/imported/refractory_coating.png-2c21f9963344518c0f984bb13a326053.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/refractory_coating.png" +dest_files=["res://.godot/imported/refractory_coating.png-2c21f9963344518c0f984bb13a326053.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/returned_test_strip.png b/assets/generated/renders/items/returned_test_strip.png new file mode 100644 index 0000000..889692d Binary files /dev/null and b/assets/generated/renders/items/returned_test_strip.png differ diff --git a/assets/generated/renders/items/returned_test_strip.png.import b/assets/generated/renders/items/returned_test_strip.png.import new file mode 100644 index 0000000..67aaba7 --- /dev/null +++ b/assets/generated/renders/items/returned_test_strip.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b0hiyq33vc633" +path="res://.godot/imported/returned_test_strip.png-ec4cb873dd5615528a130426a4b46c4f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/returned_test_strip.png" +dest_files=["res://.godot/imported/returned_test_strip.png-ec4cb873dd5615528a130426a4b46c4f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/root_fiber.png b/assets/generated/renders/items/root_fiber.png new file mode 100644 index 0000000..626fd12 Binary files /dev/null and b/assets/generated/renders/items/root_fiber.png differ diff --git a/assets/generated/renders/items/root_fiber.png.import b/assets/generated/renders/items/root_fiber.png.import new file mode 100644 index 0000000..8c432b1 --- /dev/null +++ b/assets/generated/renders/items/root_fiber.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://boxnmhv156n7i" +path="res://.godot/imported/root_fiber.png-17771761eaf5f9a3332a32bfb7f9d7a3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/root_fiber.png" +dest_files=["res://.godot/imported/root_fiber.png-17771761eaf5f9a3332a32bfb7f9d7a3.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/rune_clay.png b/assets/generated/renders/items/rune_clay.png new file mode 100644 index 0000000..b4566b5 Binary files /dev/null and b/assets/generated/renders/items/rune_clay.png differ diff --git a/assets/generated/renders/items/rune_clay.png.import b/assets/generated/renders/items/rune_clay.png.import new file mode 100644 index 0000000..d830d66 --- /dev/null +++ b/assets/generated/renders/items/rune_clay.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://e5t3mp3cdaa0" +path="res://.godot/imported/rune_clay.png-b25195aaa24558f8cb1aaa182333c03f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/rune_clay.png" +dest_files=["res://.godot/imported/rune_clay.png-b25195aaa24558f8cb1aaa182333c03f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/shadow_matter.png b/assets/generated/renders/items/shadow_matter.png new file mode 100644 index 0000000..7bc79a8 Binary files /dev/null and b/assets/generated/renders/items/shadow_matter.png differ diff --git a/assets/generated/renders/items/shadow_matter.png.import b/assets/generated/renders/items/shadow_matter.png.import new file mode 100644 index 0000000..7fd8ef3 --- /dev/null +++ b/assets/generated/renders/items/shadow_matter.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b0rogm2xveroq" +path="res://.godot/imported/shadow_matter.png-1f5c30067d7cc6c0de354e505e0b72da.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/shadow_matter.png" +dest_files=["res://.godot/imported/shadow_matter.png-1f5c30067d7cc6c0de354e505e0b72da.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/slag.png b/assets/generated/renders/items/slag.png new file mode 100644 index 0000000..befe78f Binary files /dev/null and b/assets/generated/renders/items/slag.png differ diff --git a/assets/generated/renders/items/slag.png.import b/assets/generated/renders/items/slag.png.import new file mode 100644 index 0000000..651c9cf --- /dev/null +++ b/assets/generated/renders/items/slag.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dyi0e3xy55ya" +path="res://.godot/imported/slag.png-c28c6f654ba6fc1c30118e413c0733cc.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/slag.png" +dest_files=["res://.godot/imported/slag.png-c28c6f654ba6fc1c30118e413c0733cc.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/soul_ember.png b/assets/generated/renders/items/soul_ember.png new file mode 100644 index 0000000..4b64676 Binary files /dev/null and b/assets/generated/renders/items/soul_ember.png differ diff --git a/assets/generated/renders/items/soul_ember.png.import b/assets/generated/renders/items/soul_ember.png.import new file mode 100644 index 0000000..c522ff4 --- /dev/null +++ b/assets/generated/renders/items/soul_ember.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b3wynd7k218u" +path="res://.godot/imported/soul_ember.png-d30abc6000d822aa10da7be20e80c200.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/soul_ember.png" +dest_files=["res://.godot/imported/soul_ember.png-d30abc6000d822aa10da7be20e80c200.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/space_anchor_core.png b/assets/generated/renders/items/space_anchor_core.png new file mode 100644 index 0000000..d020659 Binary files /dev/null and b/assets/generated/renders/items/space_anchor_core.png differ diff --git a/assets/generated/renders/items/space_anchor_core.png.import b/assets/generated/renders/items/space_anchor_core.png.import new file mode 100644 index 0000000..23312f9 --- /dev/null +++ b/assets/generated/renders/items/space_anchor_core.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bqab4d3v34myx" +path="res://.godot/imported/space_anchor_core.png-808c98a6ae50d26a1862cc286d1f32fc.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/space_anchor_core.png" +dest_files=["res://.godot/imported/space_anchor_core.png-808c98a6ae50d26a1862cc286d1f32fc.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/star_iron_ingot.png b/assets/generated/renders/items/star_iron_ingot.png new file mode 100644 index 0000000..ec60bfb Binary files /dev/null and b/assets/generated/renders/items/star_iron_ingot.png differ diff --git a/assets/generated/renders/items/star_iron_ingot.png.import b/assets/generated/renders/items/star_iron_ingot.png.import new file mode 100644 index 0000000..727948f --- /dev/null +++ b/assets/generated/renders/items/star_iron_ingot.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dbpe4alwso8f" +path="res://.godot/imported/star_iron_ingot.png-452c15c28785ce46cc3af30d8ceb557d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/star_iron_ingot.png" +dest_files=["res://.godot/imported/star_iron_ingot.png-452c15c28785ce46cc3af30d8ceb557d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/star_iron_ore.png b/assets/generated/renders/items/star_iron_ore.png new file mode 100644 index 0000000..e6e310a Binary files /dev/null and b/assets/generated/renders/items/star_iron_ore.png differ diff --git a/assets/generated/renders/items/star_iron_ore.png.import b/assets/generated/renders/items/star_iron_ore.png.import new file mode 100644 index 0000000..aba92ba --- /dev/null +++ b/assets/generated/renders/items/star_iron_ore.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ddko42qv4wy21" +path="res://.godot/imported/star_iron_ore.png-2a8c7390239360027a938eef4e7715e6.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/star_iron_ore.png" +dest_files=["res://.godot/imported/star_iron_ore.png-2a8c7390239360027a938eef4e7715e6.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/tide_rune.png b/assets/generated/renders/items/tide_rune.png new file mode 100644 index 0000000..5c0736c Binary files /dev/null and b/assets/generated/renders/items/tide_rune.png differ diff --git a/assets/generated/renders/items/tide_rune.png.import b/assets/generated/renders/items/tide_rune.png.import new file mode 100644 index 0000000..efe4146 --- /dev/null +++ b/assets/generated/renders/items/tide_rune.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bgevxphr16cs3" +path="res://.godot/imported/tide_rune.png-8717a32e2e154bc4022d8d01d3345380.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/tide_rune.png" +dest_files=["res://.godot/imported/tide_rune.png-8717a32e2e154bc4022d8d01d3345380.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/tribute_block.png b/assets/generated/renders/items/tribute_block.png new file mode 100644 index 0000000..46a644c Binary files /dev/null and b/assets/generated/renders/items/tribute_block.png differ diff --git a/assets/generated/renders/items/tribute_block.png.import b/assets/generated/renders/items/tribute_block.png.import new file mode 100644 index 0000000..21ab91b --- /dev/null +++ b/assets/generated/renders/items/tribute_block.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cvpk2x3n347vl" +path="res://.godot/imported/tribute_block.png-c2fd7c40d82906afedc8f105250422e7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/tribute_block.png" +dest_files=["res://.godot/imported/tribute_block.png-c2fd7c40d82906afedc8f105250422e7.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/true_name_thread.png b/assets/generated/renders/items/true_name_thread.png new file mode 100644 index 0000000..32055db Binary files /dev/null and b/assets/generated/renders/items/true_name_thread.png differ diff --git a/assets/generated/renders/items/true_name_thread.png.import b/assets/generated/renders/items/true_name_thread.png.import new file mode 100644 index 0000000..88f0832 --- /dev/null +++ b/assets/generated/renders/items/true_name_thread.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bir5apeygrxxm" +path="res://.godot/imported/true_name_thread.png-e7f8564a85efedf152bdcc94fbec85cb.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/true_name_thread.png" +dest_files=["res://.godot/imported/true_name_thread.png-e7f8564a85efedf152bdcc94fbec85cb.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/twilight_reagent.png b/assets/generated/renders/items/twilight_reagent.png new file mode 100644 index 0000000..7889157 Binary files /dev/null and b/assets/generated/renders/items/twilight_reagent.png differ diff --git a/assets/generated/renders/items/twilight_reagent.png.import b/assets/generated/renders/items/twilight_reagent.png.import new file mode 100644 index 0000000..c36391e --- /dev/null +++ b/assets/generated/renders/items/twilight_reagent.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cio35dmcnwel8" +path="res://.godot/imported/twilight_reagent.png-f4dce1148bae0a5c5aa32e64aed771fc.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/twilight_reagent.png" +dest_files=["res://.godot/imported/twilight_reagent.png-f4dce1148bae0a5c5aa32e64aed771fc.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/walker_construct.png b/assets/generated/renders/items/walker_construct.png new file mode 100644 index 0000000..ec406d8 Binary files /dev/null and b/assets/generated/renders/items/walker_construct.png differ diff --git a/assets/generated/renders/items/walker_construct.png.import b/assets/generated/renders/items/walker_construct.png.import new file mode 100644 index 0000000..f04925c --- /dev/null +++ b/assets/generated/renders/items/walker_construct.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d0io4pn1drtaj" +path="res://.godot/imported/walker_construct.png-22be6a0e5817678063773de7f39be917.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/walker_construct.png" +dest_files=["res://.godot/imported/walker_construct.png-22be6a0e5817678063773de7f39be917.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/items/wild_proof_seed.png b/assets/generated/renders/items/wild_proof_seed.png new file mode 100644 index 0000000..b659e25 Binary files /dev/null and b/assets/generated/renders/items/wild_proof_seed.png differ diff --git a/assets/generated/renders/items/wild_proof_seed.png.import b/assets/generated/renders/items/wild_proof_seed.png.import new file mode 100644 index 0000000..d5b9ad9 --- /dev/null +++ b/assets/generated/renders/items/wild_proof_seed.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cs0ehl3ky8n8t" +path="res://.godot/imported/wild_proof_seed.png-1a92d10dccf6b178b0ec5a6b007047c5.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/items/wild_proof_seed.png" +dest_files=["res://.godot/imported/wild_proof_seed.png-1a92d10dccf6b178b0ec5a6b007047c5.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/logistics/belt.png b/assets/generated/renders/logistics/belt.png new file mode 100644 index 0000000..714dc3a Binary files /dev/null and b/assets/generated/renders/logistics/belt.png differ diff --git a/assets/generated/renders/logistics/belt.png.import b/assets/generated/renders/logistics/belt.png.import new file mode 100644 index 0000000..4f43d71 --- /dev/null +++ b/assets/generated/renders/logistics/belt.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://5p8cen8ftdk" +path="res://.godot/imported/belt.png-934d666b9b1d12651076862ca38f4fa3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/logistics/belt.png" +dest_files=["res://.godot/imported/belt.png-934d666b9b1d12651076862ca38f4fa3.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/logistics/bridge_arm.png b/assets/generated/renders/logistics/bridge_arm.png new file mode 100644 index 0000000..bef0a64 Binary files /dev/null and b/assets/generated/renders/logistics/bridge_arm.png differ diff --git a/assets/generated/renders/logistics/bridge_arm.png.import b/assets/generated/renders/logistics/bridge_arm.png.import new file mode 100644 index 0000000..82f3c30 --- /dev/null +++ b/assets/generated/renders/logistics/bridge_arm.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cduhrwmk35ftk" +path="res://.godot/imported/bridge_arm.png-618397e473e2d651baccc0d08d9f9721.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/logistics/bridge_arm.png" +dest_files=["res://.godot/imported/bridge_arm.png-618397e473e2d651baccc0d08d9f9721.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/logistics/collection_vault.png b/assets/generated/renders/logistics/collection_vault.png new file mode 100644 index 0000000..9060719 Binary files /dev/null and b/assets/generated/renders/logistics/collection_vault.png differ diff --git a/assets/generated/renders/logistics/collection_vault.png.import b/assets/generated/renders/logistics/collection_vault.png.import new file mode 100644 index 0000000..80148e6 --- /dev/null +++ b/assets/generated/renders/logistics/collection_vault.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ctxns6r057icg" +path="res://.godot/imported/collection_vault.png-dfa528e2b64544803c5f870b072a55a1.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/logistics/collection_vault.png" +dest_files=["res://.godot/imported/collection_vault.png-dfa528e2b64544803c5f870b072a55a1.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/logistics/crystal_hopper.png b/assets/generated/renders/logistics/crystal_hopper.png new file mode 100644 index 0000000..16cb946 Binary files /dev/null and b/assets/generated/renders/logistics/crystal_hopper.png differ diff --git a/assets/generated/renders/logistics/crystal_hopper.png.import b/assets/generated/renders/logistics/crystal_hopper.png.import new file mode 100644 index 0000000..b5136f9 --- /dev/null +++ b/assets/generated/renders/logistics/crystal_hopper.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cyyxkhp5w7us2" +path="res://.godot/imported/crystal_hopper.png-e8ced5e7a6e3e07fb76f2dcb2a689b76.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/logistics/crystal_hopper.png" +dest_files=["res://.godot/imported/crystal_hopper.png-e8ced5e7a6e3e07fb76f2dcb2a689b76.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/logistics/mana_pipe.png b/assets/generated/renders/logistics/mana_pipe.png new file mode 100644 index 0000000..d23e85a Binary files /dev/null and b/assets/generated/renders/logistics/mana_pipe.png differ diff --git a/assets/generated/renders/logistics/mana_pipe.png.import b/assets/generated/renders/logistics/mana_pipe.png.import new file mode 100644 index 0000000..6e5f79e --- /dev/null +++ b/assets/generated/renders/logistics/mana_pipe.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bc1vexq8qc4rc" +path="res://.godot/imported/mana_pipe.png-d4bc2b2aae685294d74a4fb0df24704c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/logistics/mana_pipe.png" +dest_files=["res://.godot/imported/mana_pipe.png-d4bc2b2aae685294d74a4fb0df24704c.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/logistics/mana_source.png b/assets/generated/renders/logistics/mana_source.png new file mode 100644 index 0000000..e647a24 Binary files /dev/null and b/assets/generated/renders/logistics/mana_source.png differ diff --git a/assets/generated/renders/logistics/mana_source.png.import b/assets/generated/renders/logistics/mana_source.png.import new file mode 100644 index 0000000..c3073a1 --- /dev/null +++ b/assets/generated/renders/logistics/mana_source.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cvuqnype227cv" +path="res://.godot/imported/mana_source.png-fbb0536928d4de722f934a13f55f3f1c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/logistics/mana_source.png" +dest_files=["res://.godot/imported/mana_source.png-fbb0536928d4de722f934a13f55f3f1c.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/machines/charge_altar.png b/assets/generated/renders/machines/charge_altar.png new file mode 100644 index 0000000..a9f0a15 Binary files /dev/null and b/assets/generated/renders/machines/charge_altar.png differ diff --git a/assets/generated/renders/machines/charge_altar.png.import b/assets/generated/renders/machines/charge_altar.png.import new file mode 100644 index 0000000..b55b103 --- /dev/null +++ b/assets/generated/renders/machines/charge_altar.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bwqa08ux1704w" +path="res://.godot/imported/charge_altar.png-76fd1eaa922feeabcc26e0b6bed683a7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/machines/charge_altar.png" +dest_files=["res://.godot/imported/charge_altar.png-76fd1eaa922feeabcc26e0b6bed683a7.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/machines/clay_assembly.png b/assets/generated/renders/machines/clay_assembly.png new file mode 100644 index 0000000..898d77c Binary files /dev/null and b/assets/generated/renders/machines/clay_assembly.png differ diff --git a/assets/generated/renders/machines/clay_assembly.png.import b/assets/generated/renders/machines/clay_assembly.png.import new file mode 100644 index 0000000..b645955 --- /dev/null +++ b/assets/generated/renders/machines/clay_assembly.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dmval5p2ikysj" +path="res://.godot/imported/clay_assembly.png-ef4ebc426e2f04b13dc7085289fbecb4.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/machines/clay_assembly.png" +dest_files=["res://.godot/imported/clay_assembly.png-ef4ebc426e2f04b13dc7085289fbecb4.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/machines/crystal_refinery.png b/assets/generated/renders/machines/crystal_refinery.png new file mode 100644 index 0000000..aff41df Binary files /dev/null and b/assets/generated/renders/machines/crystal_refinery.png differ diff --git a/assets/generated/renders/machines/crystal_refinery.png.import b/assets/generated/renders/machines/crystal_refinery.png.import new file mode 100644 index 0000000..5878bca --- /dev/null +++ b/assets/generated/renders/machines/crystal_refinery.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b55evq61kc4hl" +path="res://.godot/imported/crystal_refinery.png-76c434f78c7e623fa629647d163e5cfd.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/machines/crystal_refinery.png" +dest_files=["res://.godot/imported/crystal_refinery.png-76c434f78c7e623fa629647d163e5cfd.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/machines/decay_chamber.png b/assets/generated/renders/machines/decay_chamber.png new file mode 100644 index 0000000..fb8f6dc Binary files /dev/null and b/assets/generated/renders/machines/decay_chamber.png differ diff --git a/assets/generated/renders/machines/decay_chamber.png.import b/assets/generated/renders/machines/decay_chamber.png.import new file mode 100644 index 0000000..22fab68 --- /dev/null +++ b/assets/generated/renders/machines/decay_chamber.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cv4c0i46sco1" +path="res://.godot/imported/decay_chamber.png-e3740752cddba6a4bd682295be48ab3b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/machines/decay_chamber.png" +dest_files=["res://.godot/imported/decay_chamber.png-e3740752cddba6a4bd682295be48ab3b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/machines/dimensional_gate.png b/assets/generated/renders/machines/dimensional_gate.png new file mode 100644 index 0000000..860d8a2 Binary files /dev/null and b/assets/generated/renders/machines/dimensional_gate.png differ diff --git a/assets/generated/renders/machines/dimensional_gate.png.import b/assets/generated/renders/machines/dimensional_gate.png.import new file mode 100644 index 0000000..239880f --- /dev/null +++ b/assets/generated/renders/machines/dimensional_gate.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://byy8s4uskjxx3" +path="res://.godot/imported/dimensional_gate.png-38f821191bf6ccf9a290f1df1db6af5e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/machines/dimensional_gate.png" +dest_files=["res://.godot/imported/dimensional_gate.png-38f821191bf6ccf9a290f1df1db6af5e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/machines/dragon_kiln.png b/assets/generated/renders/machines/dragon_kiln.png new file mode 100644 index 0000000..d77bc33 Binary files /dev/null and b/assets/generated/renders/machines/dragon_kiln.png differ diff --git a/assets/generated/renders/machines/dragon_kiln.png.import b/assets/generated/renders/machines/dragon_kiln.png.import new file mode 100644 index 0000000..ba6bc57 --- /dev/null +++ b/assets/generated/renders/machines/dragon_kiln.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://x67bewdfxcst" +path="res://.godot/imported/dragon_kiln.png-0226314923d50bab23bcdd3867e297bb.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/machines/dragon_kiln.png" +dest_files=["res://.godot/imported/dragon_kiln.png-0226314923d50bab23bcdd3867e297bb.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/machines/echo_separator.png b/assets/generated/renders/machines/echo_separator.png new file mode 100644 index 0000000..60d94bc Binary files /dev/null and b/assets/generated/renders/machines/echo_separator.png differ diff --git a/assets/generated/renders/machines/echo_separator.png.import b/assets/generated/renders/machines/echo_separator.png.import new file mode 100644 index 0000000..fcf7c01 --- /dev/null +++ b/assets/generated/renders/machines/echo_separator.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://buguw2er3tmd7" +path="res://.godot/imported/echo_separator.png-a7a462532275d2cc0b0d460533b29947.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/machines/echo_separator.png" +dest_files=["res://.godot/imported/echo_separator.png-a7a462532275d2cc0b0d460533b29947.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/machines/frost_gate.png b/assets/generated/renders/machines/frost_gate.png new file mode 100644 index 0000000..e0414b3 Binary files /dev/null and b/assets/generated/renders/machines/frost_gate.png differ diff --git a/assets/generated/renders/machines/frost_gate.png.import b/assets/generated/renders/machines/frost_gate.png.import new file mode 100644 index 0000000..8091e51 --- /dev/null +++ b/assets/generated/renders/machines/frost_gate.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c4wuqt4l4logk" +path="res://.godot/imported/frost_gate.png-071d085ec5af58b07bc4612b906c1568.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/machines/frost_gate.png" +dest_files=["res://.godot/imported/frost_gate.png-071d085ec5af58b07bc4612b906c1568.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/machines/grand_ritual.png b/assets/generated/renders/machines/grand_ritual.png new file mode 100644 index 0000000..f63ec5e Binary files /dev/null and b/assets/generated/renders/machines/grand_ritual.png differ diff --git a/assets/generated/renders/machines/grand_ritual.png.import b/assets/generated/renders/machines/grand_ritual.png.import new file mode 100644 index 0000000..9b92998 --- /dev/null +++ b/assets/generated/renders/machines/grand_ritual.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ca2iboky20yeh" +path="res://.godot/imported/grand_ritual.png-71a47d8afca997909aebdf1e4953256f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/machines/grand_ritual.png" +dest_files=["res://.godot/imported/grand_ritual.png-71a47d8afca997909aebdf1e4953256f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/machines/harvest_circle.png b/assets/generated/renders/machines/harvest_circle.png new file mode 100644 index 0000000..2c0cdf5 Binary files /dev/null and b/assets/generated/renders/machines/harvest_circle.png differ diff --git a/assets/generated/renders/machines/harvest_circle.png.import b/assets/generated/renders/machines/harvest_circle.png.import new file mode 100644 index 0000000..d318add --- /dev/null +++ b/assets/generated/renders/machines/harvest_circle.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c8xjav0l5fp8m" +path="res://.godot/imported/harvest_circle.png-f464aba7e25aab939b4d9364d336779c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/machines/harvest_circle.png" +dest_files=["res://.godot/imported/harvest_circle.png-f464aba7e25aab939b4d9364d336779c.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/machines/identity_forge.png b/assets/generated/renders/machines/identity_forge.png new file mode 100644 index 0000000..aee36fc Binary files /dev/null and b/assets/generated/renders/machines/identity_forge.png differ diff --git a/assets/generated/renders/machines/identity_forge.png.import b/assets/generated/renders/machines/identity_forge.png.import new file mode 100644 index 0000000..ca58f8d --- /dev/null +++ b/assets/generated/renders/machines/identity_forge.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c3hxio6xk30kb" +path="res://.godot/imported/identity_forge.png-c572670959e3f504c390d2d736211be5.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/machines/identity_forge.png" +dest_files=["res://.godot/imported/identity_forge.png-c572670959e3f504c390d2d736211be5.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/machines/inscription_array.png b/assets/generated/renders/machines/inscription_array.png new file mode 100644 index 0000000..e3f5b9e Binary files /dev/null and b/assets/generated/renders/machines/inscription_array.png differ diff --git a/assets/generated/renders/machines/inscription_array.png.import b/assets/generated/renders/machines/inscription_array.png.import new file mode 100644 index 0000000..5343a02 --- /dev/null +++ b/assets/generated/renders/machines/inscription_array.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bqh72vr82o3t8" +path="res://.godot/imported/inscription_array.png-69b8eb780361d83306f9f28b9f04da5b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/machines/inscription_array.png" +dest_files=["res://.godot/imported/inscription_array.png-69b8eb780361d83306f9f28b9f04da5b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/machines/mirror_endpoint.png b/assets/generated/renders/machines/mirror_endpoint.png new file mode 100644 index 0000000..c934a37 Binary files /dev/null and b/assets/generated/renders/machines/mirror_endpoint.png differ diff --git a/assets/generated/renders/machines/mirror_endpoint.png.import b/assets/generated/renders/machines/mirror_endpoint.png.import new file mode 100644 index 0000000..c9e230b --- /dev/null +++ b/assets/generated/renders/machines/mirror_endpoint.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bikepmln6x6p" +path="res://.godot/imported/mirror_endpoint.png-45facc42135968db3fecfbf9c5fa4a89.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/machines/mirror_endpoint.png" +dest_files=["res://.godot/imported/mirror_endpoint.png-45facc42135968db3fecfbf9c5fa4a89.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/machines/offering_altar.png b/assets/generated/renders/machines/offering_altar.png new file mode 100644 index 0000000..16795ca Binary files /dev/null and b/assets/generated/renders/machines/offering_altar.png differ diff --git a/assets/generated/renders/machines/offering_altar.png.import b/assets/generated/renders/machines/offering_altar.png.import new file mode 100644 index 0000000..1f97cb0 --- /dev/null +++ b/assets/generated/renders/machines/offering_altar.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://m6wfi737womj" +path="res://.godot/imported/offering_altar.png-40ff98967221d0f8b8fc95de1b5d0a30.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/machines/offering_altar.png" +dest_files=["res://.godot/imported/offering_altar.png-40ff98967221d0f8b8fc95de1b5d0a30.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/machines/paradox_condenser.png b/assets/generated/renders/machines/paradox_condenser.png new file mode 100644 index 0000000..1262260 Binary files /dev/null and b/assets/generated/renders/machines/paradox_condenser.png differ diff --git a/assets/generated/renders/machines/paradox_condenser.png.import b/assets/generated/renders/machines/paradox_condenser.png.import new file mode 100644 index 0000000..7c3213f --- /dev/null +++ b/assets/generated/renders/machines/paradox_condenser.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://wqtfy0b7bf06" +path="res://.godot/imported/paradox_condenser.png-f082acb6f4ff997ceed2970657966e85.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/machines/paradox_condenser.png" +dest_files=["res://.godot/imported/paradox_condenser.png-f082acb6f4ff997ceed2970657966e85.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/machines/ring_mason.png b/assets/generated/renders/machines/ring_mason.png new file mode 100644 index 0000000..c129223 Binary files /dev/null and b/assets/generated/renders/machines/ring_mason.png differ diff --git a/assets/generated/renders/machines/ring_mason.png.import b/assets/generated/renders/machines/ring_mason.png.import new file mode 100644 index 0000000..49a36a9 --- /dev/null +++ b/assets/generated/renders/machines/ring_mason.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bdwrsdirhwmtd" +path="res://.godot/imported/ring_mason.png-634dc9aea003307e012695e35dfb6791.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/machines/ring_mason.png" +dest_files=["res://.godot/imported/ring_mason.png-634dc9aea003307e012695e35dfb6791.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/machines/root_loom.png b/assets/generated/renders/machines/root_loom.png new file mode 100644 index 0000000..4434220 Binary files /dev/null and b/assets/generated/renders/machines/root_loom.png differ diff --git a/assets/generated/renders/machines/root_loom.png.import b/assets/generated/renders/machines/root_loom.png.import new file mode 100644 index 0000000..67aaa19 --- /dev/null +++ b/assets/generated/renders/machines/root_loom.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cadime4aa0uea" +path="res://.godot/imported/root_loom.png-e93465091d1a5ec29dface579eac2ae5.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/machines/root_loom.png" +dest_files=["res://.godot/imported/root_loom.png-e93465091d1a5ec29dface579eac2ae5.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/machines/rough_furnace.png b/assets/generated/renders/machines/rough_furnace.png new file mode 100644 index 0000000..5c18ebe Binary files /dev/null and b/assets/generated/renders/machines/rough_furnace.png differ diff --git a/assets/generated/renders/machines/rough_furnace.png.import b/assets/generated/renders/machines/rough_furnace.png.import new file mode 100644 index 0000000..bf55769 --- /dev/null +++ b/assets/generated/renders/machines/rough_furnace.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bnjj8cstaf6pn" +path="res://.godot/imported/rough_furnace.png-41a0cb99aed2d33c5afc08d278c616b7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/machines/rough_furnace.png" +dest_files=["res://.godot/imported/rough_furnace.png-41a0cb99aed2d33c5afc08d278c616b7.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/machines/rune_press.png b/assets/generated/renders/machines/rune_press.png new file mode 100644 index 0000000..3e6a9bb Binary files /dev/null and b/assets/generated/renders/machines/rune_press.png differ diff --git a/assets/generated/renders/machines/rune_press.png.import b/assets/generated/renders/machines/rune_press.png.import new file mode 100644 index 0000000..d1b6193 --- /dev/null +++ b/assets/generated/renders/machines/rune_press.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dvy3yjeb12gev" +path="res://.godot/imported/rune_press.png-9dfe9b78944ad61f3141de27a2f24fdf.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/machines/rune_press.png" +dest_files=["res://.godot/imported/rune_press.png-9dfe9b78944ad61f3141de27a2f24fdf.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/machines/seed_bed.png b/assets/generated/renders/machines/seed_bed.png new file mode 100644 index 0000000..2e3dd2b Binary files /dev/null and b/assets/generated/renders/machines/seed_bed.png differ diff --git a/assets/generated/renders/machines/seed_bed.png.import b/assets/generated/renders/machines/seed_bed.png.import new file mode 100644 index 0000000..dc5d118 --- /dev/null +++ b/assets/generated/renders/machines/seed_bed.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://mnyhbo4ns5ma" +path="res://.godot/imported/seed_bed.png-340d85c6b9f0c7bda0b2ab640f97868f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/machines/seed_bed.png" +dest_files=["res://.godot/imported/seed_bed.png-340d85c6b9f0c7bda0b2ab640f97868f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/machines/soul_lamp.png b/assets/generated/renders/machines/soul_lamp.png new file mode 100644 index 0000000..877cbcd Binary files /dev/null and b/assets/generated/renders/machines/soul_lamp.png differ diff --git a/assets/generated/renders/machines/soul_lamp.png.import b/assets/generated/renders/machines/soul_lamp.png.import new file mode 100644 index 0000000..1c15aa6 --- /dev/null +++ b/assets/generated/renders/machines/soul_lamp.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://chjkldrfiw5bx" +path="res://.godot/imported/soul_lamp.png-7420201b7cc7e7db79fc14ae6b1ba8d8.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/machines/soul_lamp.png" +dest_files=["res://.godot/imported/soul_lamp.png-7420201b7cc7e7db79fc14ae6b1ba8d8.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/machines/thermal_phase_furnace.png b/assets/generated/renders/machines/thermal_phase_furnace.png new file mode 100644 index 0000000..a8678f5 Binary files /dev/null and b/assets/generated/renders/machines/thermal_phase_furnace.png differ diff --git a/assets/generated/renders/machines/thermal_phase_furnace.png.import b/assets/generated/renders/machines/thermal_phase_furnace.png.import new file mode 100644 index 0000000..5b2e9dc --- /dev/null +++ b/assets/generated/renders/machines/thermal_phase_furnace.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://djr3g6sueq3kf" +path="res://.godot/imported/thermal_phase_furnace.png-ea39a630d8079f68919b06315bea0cea.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/machines/thermal_phase_furnace.png" +dest_files=["res://.godot/imported/thermal_phase_furnace.png-ea39a630d8079f68919b06315bea0cea.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/machines/tribute_press.png b/assets/generated/renders/machines/tribute_press.png new file mode 100644 index 0000000..dec4a92 Binary files /dev/null and b/assets/generated/renders/machines/tribute_press.png differ diff --git a/assets/generated/renders/machines/tribute_press.png.import b/assets/generated/renders/machines/tribute_press.png.import new file mode 100644 index 0000000..68397fc --- /dev/null +++ b/assets/generated/renders/machines/tribute_press.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bjfi32q0rxrc" +path="res://.godot/imported/tribute_press.png-00b9fda537fc900de4c852328aabf9b0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/machines/tribute_press.png" +dest_files=["res://.godot/imported/tribute_press.png-00b9fda537fc900de4c852328aabf9b0.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/machines/true_name_loom.png b/assets/generated/renders/machines/true_name_loom.png new file mode 100644 index 0000000..84a8d52 Binary files /dev/null and b/assets/generated/renders/machines/true_name_loom.png differ diff --git a/assets/generated/renders/machines/true_name_loom.png.import b/assets/generated/renders/machines/true_name_loom.png.import new file mode 100644 index 0000000..42284f2 --- /dev/null +++ b/assets/generated/renders/machines/true_name_loom.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://h7r7morg4k18" +path="res://.godot/imported/true_name_loom.png-7d1e8a575e61f5feb8ab9da6fc1262d9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/machines/true_name_loom.png" +dest_files=["res://.godot/imported/true_name_loom.png-7d1e8a575e61f5feb8ab9da6fc1262d9.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/generated/renders/machines/twilight_crucible.png b/assets/generated/renders/machines/twilight_crucible.png new file mode 100644 index 0000000..2c1c4a0 Binary files /dev/null and b/assets/generated/renders/machines/twilight_crucible.png differ diff --git a/assets/generated/renders/machines/twilight_crucible.png.import b/assets/generated/renders/machines/twilight_crucible.png.import new file mode 100644 index 0000000..746338c --- /dev/null +++ b/assets/generated/renders/machines/twilight_crucible.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cjhpbiwja838b" +path="res://.godot/imported/twilight_crucible.png-7399d794684850aceb2da33a2d48bc16.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/generated/renders/machines/twilight_crucible.png" +dest_files=["res://.godot/imported/twilight_crucible.png-7399d794684850aceb2da33a2d48bc16.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/third_party/kenney_factory_kit/LICENSE.txt b/assets/third_party/kenney_factory_kit/LICENSE.txt new file mode 100644 index 0000000..d643ee5 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/LICENSE.txt @@ -0,0 +1,28 @@ + + + Factory Kit (3.0) + + Created/distributed by Kenney (www.kenney.nl) + Creation date: 01-05-2026 14:45 + + ------------------------------ + + License: (Creative Commons Zero, CC0) + http://creativecommons.org/publicdomain/zero/1.0/ + + You can use this content for personal, educational, and commercial purposes. + + Support by crediting 'Kenney' or 'www.kenney.nl' (this is not a requirement) + + ------------------------------ + + • Website : www.kenney.nl + • Donate : www.kenney.nl/donate + + • Patreon : patreon.com/kenney + + Follow on social media for updates: + + • Twitter: twitter.com/KenneyNL + • BlueSky: kenney.bsky.social + • Instagram: instagram.com/kenney_nl \ No newline at end of file diff --git a/assets/third_party/kenney_factory_kit/Textures/colormap.png b/assets/third_party/kenney_factory_kit/Textures/colormap.png new file mode 100644 index 0000000..fddb472 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/Textures/colormap.png differ diff --git a/assets/third_party/kenney_factory_kit/Textures/colormap.png.import b/assets/third_party/kenney_factory_kit/Textures/colormap.png.import new file mode 100644 index 0000000..b6739f3 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/Textures/colormap.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bhmgern1ypi8s" +path="res://.godot/imported/colormap.png-5aafbed6b30cf70922c8d805b4ffd099.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/Textures/colormap.png" +dest_files=["res://.godot/imported/colormap.png-5aafbed6b30cf70922c8d805b4ffd099.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/third_party/kenney_factory_kit/arrow-basic-rounded.glb b/assets/third_party/kenney_factory_kit/arrow-basic-rounded.glb new file mode 100644 index 0000000..ef8317c Binary files /dev/null and b/assets/third_party/kenney_factory_kit/arrow-basic-rounded.glb differ diff --git a/assets/third_party/kenney_factory_kit/arrow-basic-rounded.glb.import b/assets/third_party/kenney_factory_kit/arrow-basic-rounded.glb.import new file mode 100644 index 0000000..bdcd739 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/arrow-basic-rounded.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cuvcgsq57tvdv" +path="res://.godot/imported/arrow-basic-rounded.glb-44ae33a6c09b00e3e1e968fdfa64281c.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/arrow-basic-rounded.glb" +dest_files=["res://.godot/imported/arrow-basic-rounded.glb-44ae33a6c09b00e3e1e968fdfa64281c.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/arrow-basic.glb b/assets/third_party/kenney_factory_kit/arrow-basic.glb new file mode 100644 index 0000000..9ba8f51 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/arrow-basic.glb differ diff --git a/assets/third_party/kenney_factory_kit/arrow-basic.glb.import b/assets/third_party/kenney_factory_kit/arrow-basic.glb.import new file mode 100644 index 0000000..1aa6b83 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/arrow-basic.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://d2a4csny76hso" +path="res://.godot/imported/arrow-basic.glb-c3b40614250b717929ae4f3ba198ac6f.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/arrow-basic.glb" +dest_files=["res://.godot/imported/arrow-basic.glb-c3b40614250b717929ae4f3ba198ac6f.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/arrow-rounded.glb b/assets/third_party/kenney_factory_kit/arrow-rounded.glb new file mode 100644 index 0000000..1e69e9e Binary files /dev/null and b/assets/third_party/kenney_factory_kit/arrow-rounded.glb differ diff --git a/assets/third_party/kenney_factory_kit/arrow-rounded.glb.import b/assets/third_party/kenney_factory_kit/arrow-rounded.glb.import new file mode 100644 index 0000000..c11dea0 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/arrow-rounded.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cm36e3h72f7ac" +path="res://.godot/imported/arrow-rounded.glb-dab3ead83a4ab3160b4608ca9966f2a7.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/arrow-rounded.glb" +dest_files=["res://.godot/imported/arrow-rounded.glb-dab3ead83a4ab3160b4608ca9966f2a7.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/arrow.glb b/assets/third_party/kenney_factory_kit/arrow.glb new file mode 100644 index 0000000..a5d79e9 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/arrow.glb differ diff --git a/assets/third_party/kenney_factory_kit/arrow.glb.import b/assets/third_party/kenney_factory_kit/arrow.glb.import new file mode 100644 index 0000000..c5c3e98 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/arrow.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://beht1c2s1v4mw" +path="res://.godot/imported/arrow.glb-c75d40c2b0dc131d9596681b2e0b1f4a.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/arrow.glb" +dest_files=["res://.godot/imported/arrow.glb-c75d40c2b0dc131d9596681b2e0b1f4a.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/box-large.glb b/assets/third_party/kenney_factory_kit/box-large.glb new file mode 100644 index 0000000..45f7f3d Binary files /dev/null and b/assets/third_party/kenney_factory_kit/box-large.glb differ diff --git a/assets/third_party/kenney_factory_kit/box-large.glb.import b/assets/third_party/kenney_factory_kit/box-large.glb.import new file mode 100644 index 0000000..6283816 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/box-large.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dhp20nng3jk10" +path="res://.godot/imported/box-large.glb-3689b308da63da4b1def18d5a0d906aa.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/box-large.glb" +dest_files=["res://.godot/imported/box-large.glb-3689b308da63da4b1def18d5a0d906aa.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/box-long.glb b/assets/third_party/kenney_factory_kit/box-long.glb new file mode 100644 index 0000000..ac66fd5 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/box-long.glb differ diff --git a/assets/third_party/kenney_factory_kit/box-long.glb.import b/assets/third_party/kenney_factory_kit/box-long.glb.import new file mode 100644 index 0000000..2682648 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/box-long.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://byfok77a7jdvx" +path="res://.godot/imported/box-long.glb-25920afbe40b582b83347ccddab35e9b.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/box-long.glb" +dest_files=["res://.godot/imported/box-long.glb-25920afbe40b582b83347ccddab35e9b.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/box-small.glb b/assets/third_party/kenney_factory_kit/box-small.glb new file mode 100644 index 0000000..f598f97 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/box-small.glb differ diff --git a/assets/third_party/kenney_factory_kit/box-small.glb.import b/assets/third_party/kenney_factory_kit/box-small.glb.import new file mode 100644 index 0000000..9b1af6e --- /dev/null +++ b/assets/third_party/kenney_factory_kit/box-small.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://d1hdvx34l033t" +path="res://.godot/imported/box-small.glb-c9f272ce592c170cab439901e187afb9.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/box-small.glb" +dest_files=["res://.godot/imported/box-small.glb-c9f272ce592c170cab439901e187afb9.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/box-wide.glb b/assets/third_party/kenney_factory_kit/box-wide.glb new file mode 100644 index 0000000..5d2f5a2 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/box-wide.glb differ diff --git a/assets/third_party/kenney_factory_kit/box-wide.glb.import b/assets/third_party/kenney_factory_kit/box-wide.glb.import new file mode 100644 index 0000000..3d73271 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/box-wide.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://csi8o1vbs07yj" +path="res://.godot/imported/box-wide.glb-b03c032fe5fe36f48139949a2d7f41ca.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/box-wide.glb" +dest_files=["res://.godot/imported/box-wide.glb-b03c032fe5fe36f48139949a2d7f41ca.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/button-floor-round-small.glb b/assets/third_party/kenney_factory_kit/button-floor-round-small.glb new file mode 100644 index 0000000..db643e0 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/button-floor-round-small.glb differ diff --git a/assets/third_party/kenney_factory_kit/button-floor-round-small.glb.import b/assets/third_party/kenney_factory_kit/button-floor-round-small.glb.import new file mode 100644 index 0000000..e81932d --- /dev/null +++ b/assets/third_party/kenney_factory_kit/button-floor-round-small.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bs1r8xusqnwjd" +path="res://.godot/imported/button-floor-round-small.glb-1e35baf7b5be4dc8264173ed7b5173f9.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/button-floor-round-small.glb" +dest_files=["res://.godot/imported/button-floor-round-small.glb-1e35baf7b5be4dc8264173ed7b5173f9.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/button-floor-round.glb b/assets/third_party/kenney_factory_kit/button-floor-round.glb new file mode 100644 index 0000000..8ad84d4 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/button-floor-round.glb differ diff --git a/assets/third_party/kenney_factory_kit/button-floor-round.glb.import b/assets/third_party/kenney_factory_kit/button-floor-round.glb.import new file mode 100644 index 0000000..ffa46fb --- /dev/null +++ b/assets/third_party/kenney_factory_kit/button-floor-round.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cdtphlsgefeq6" +path="res://.godot/imported/button-floor-round.glb-f992351eac053de8087af6bb511580a7.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/button-floor-round.glb" +dest_files=["res://.godot/imported/button-floor-round.glb-f992351eac053de8087af6bb511580a7.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/button-floor-square-small.glb b/assets/third_party/kenney_factory_kit/button-floor-square-small.glb new file mode 100644 index 0000000..9e15803 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/button-floor-square-small.glb differ diff --git a/assets/third_party/kenney_factory_kit/button-floor-square-small.glb.import b/assets/third_party/kenney_factory_kit/button-floor-square-small.glb.import new file mode 100644 index 0000000..7a3868a --- /dev/null +++ b/assets/third_party/kenney_factory_kit/button-floor-square-small.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://ctquqeyhcc3um" +path="res://.godot/imported/button-floor-square-small.glb-c5409d192a257c852cfac850dce8ee74.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/button-floor-square-small.glb" +dest_files=["res://.godot/imported/button-floor-square-small.glb-c5409d192a257c852cfac850dce8ee74.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/button-floor-square.glb b/assets/third_party/kenney_factory_kit/button-floor-square.glb new file mode 100644 index 0000000..892ecbe Binary files /dev/null and b/assets/third_party/kenney_factory_kit/button-floor-square.glb differ diff --git a/assets/third_party/kenney_factory_kit/button-floor-square.glb.import b/assets/third_party/kenney_factory_kit/button-floor-square.glb.import new file mode 100644 index 0000000..d07cfa0 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/button-floor-square.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cxxrvyhiux0o4" +path="res://.godot/imported/button-floor-square.glb-7507b33e4377d84b994d6641bc7a4f19.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/button-floor-square.glb" +dest_files=["res://.godot/imported/button-floor-square.glb-7507b33e4377d84b994d6641bc7a4f19.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/catwalk-corner.glb b/assets/third_party/kenney_factory_kit/catwalk-corner.glb new file mode 100644 index 0000000..398ce5f Binary files /dev/null and b/assets/third_party/kenney_factory_kit/catwalk-corner.glb differ diff --git a/assets/third_party/kenney_factory_kit/catwalk-corner.glb.import b/assets/third_party/kenney_factory_kit/catwalk-corner.glb.import new file mode 100644 index 0000000..3a9d40b --- /dev/null +++ b/assets/third_party/kenney_factory_kit/catwalk-corner.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cx7fhlllhu1rq" +path="res://.godot/imported/catwalk-corner.glb-e3a7bce03e5e94d0e94426be35a6a380.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/catwalk-corner.glb" +dest_files=["res://.godot/imported/catwalk-corner.glb-e3a7bce03e5e94d0e94426be35a6a380.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/catwalk-cross.glb b/assets/third_party/kenney_factory_kit/catwalk-cross.glb new file mode 100644 index 0000000..4bdae07 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/catwalk-cross.glb differ diff --git a/assets/third_party/kenney_factory_kit/catwalk-cross.glb.import b/assets/third_party/kenney_factory_kit/catwalk-cross.glb.import new file mode 100644 index 0000000..58c9bd5 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/catwalk-cross.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://7e86meiv5jpr" +path="res://.godot/imported/catwalk-cross.glb-376debf97c4ecc8bd02ec5695831eb17.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/catwalk-cross.glb" +dest_files=["res://.godot/imported/catwalk-cross.glb-376debf97c4ecc8bd02ec5695831eb17.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/catwalk-junction.glb b/assets/third_party/kenney_factory_kit/catwalk-junction.glb new file mode 100644 index 0000000..b55239f Binary files /dev/null and b/assets/third_party/kenney_factory_kit/catwalk-junction.glb differ diff --git a/assets/third_party/kenney_factory_kit/catwalk-junction.glb.import b/assets/third_party/kenney_factory_kit/catwalk-junction.glb.import new file mode 100644 index 0000000..3431c08 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/catwalk-junction.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://ruj0w3kfvbu6" +path="res://.godot/imported/catwalk-junction.glb-ed2d767a3cfd244fc896eced3af8414e.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/catwalk-junction.glb" +dest_files=["res://.godot/imported/catwalk-junction.glb-ed2d767a3cfd244fc896eced3af8414e.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/catwalk-stairs-loop.glb b/assets/third_party/kenney_factory_kit/catwalk-stairs-loop.glb new file mode 100644 index 0000000..a4f6f81 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/catwalk-stairs-loop.glb differ diff --git a/assets/third_party/kenney_factory_kit/catwalk-stairs-loop.glb.import b/assets/third_party/kenney_factory_kit/catwalk-stairs-loop.glb.import new file mode 100644 index 0000000..7bb83b2 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/catwalk-stairs-loop.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cp00vltlj8yp2" +path="res://.godot/imported/catwalk-stairs-loop.glb-266d9cd1ff8d2d14be32b33d1c4cce3e.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/catwalk-stairs-loop.glb" +dest_files=["res://.godot/imported/catwalk-stairs-loop.glb-266d9cd1ff8d2d14be32b33d1c4cce3e.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/catwalk-stairs.glb b/assets/third_party/kenney_factory_kit/catwalk-stairs.glb new file mode 100644 index 0000000..f0e5f21 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/catwalk-stairs.glb differ diff --git a/assets/third_party/kenney_factory_kit/catwalk-stairs.glb.import b/assets/third_party/kenney_factory_kit/catwalk-stairs.glb.import new file mode 100644 index 0000000..c438ccf --- /dev/null +++ b/assets/third_party/kenney_factory_kit/catwalk-stairs.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://ch51bb776m8ot" +path="res://.godot/imported/catwalk-stairs.glb-1d294c22e6030b646af60c2e3411d92a.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/catwalk-stairs.glb" +dest_files=["res://.godot/imported/catwalk-stairs.glb-1d294c22e6030b646af60c2e3411d92a.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/catwalk-straight.glb b/assets/third_party/kenney_factory_kit/catwalk-straight.glb new file mode 100644 index 0000000..76c69a2 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/catwalk-straight.glb differ diff --git a/assets/third_party/kenney_factory_kit/catwalk-straight.glb.import b/assets/third_party/kenney_factory_kit/catwalk-straight.glb.import new file mode 100644 index 0000000..a5a218e --- /dev/null +++ b/assets/third_party/kenney_factory_kit/catwalk-straight.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cw8pfsjnlok33" +path="res://.godot/imported/catwalk-straight.glb-4b6802f3e93c5e0040d46624245aeb69.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/catwalk-straight.glb" +dest_files=["res://.godot/imported/catwalk-straight.glb-4b6802f3e93c5e0040d46624245aeb69.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/cog-a.glb b/assets/third_party/kenney_factory_kit/cog-a.glb new file mode 100644 index 0000000..9618442 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/cog-a.glb differ diff --git a/assets/third_party/kenney_factory_kit/cog-a.glb.import b/assets/third_party/kenney_factory_kit/cog-a.glb.import new file mode 100644 index 0000000..3af3625 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/cog-a.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://g3quo6s1ywdy" +path="res://.godot/imported/cog-a.glb-14d65ca3ceeee18d3626a0736f622e5f.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/cog-a.glb" +dest_files=["res://.godot/imported/cog-a.glb-14d65ca3ceeee18d3626a0736f622e5f.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/cog-b.glb b/assets/third_party/kenney_factory_kit/cog-b.glb new file mode 100644 index 0000000..ae2412d Binary files /dev/null and b/assets/third_party/kenney_factory_kit/cog-b.glb differ diff --git a/assets/third_party/kenney_factory_kit/cog-b.glb.import b/assets/third_party/kenney_factory_kit/cog-b.glb.import new file mode 100644 index 0000000..7e2d8ae --- /dev/null +++ b/assets/third_party/kenney_factory_kit/cog-b.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cjxsw314yi6b3" +path="res://.godot/imported/cog-b.glb-72103c80b9ea27ed3bfbe645f7f32c8b.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/cog-b.glb" +dest_files=["res://.godot/imported/cog-b.glb-72103c80b9ea27ed3bfbe645f7f32c8b.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/cog-c.glb b/assets/third_party/kenney_factory_kit/cog-c.glb new file mode 100644 index 0000000..ad368d6 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/cog-c.glb differ diff --git a/assets/third_party/kenney_factory_kit/cog-c.glb.import b/assets/third_party/kenney_factory_kit/cog-c.glb.import new file mode 100644 index 0000000..cce45f1 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/cog-c.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bcqlsyhfn7665" +path="res://.godot/imported/cog-c.glb-a5984570160b44b5b07dad1afd066ab4.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/cog-c.glb" +dest_files=["res://.godot/imported/cog-c.glb-a5984570160b44b5b07dad1afd066ab4.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/cog-d.glb b/assets/third_party/kenney_factory_kit/cog-d.glb new file mode 100644 index 0000000..634fa7e Binary files /dev/null and b/assets/third_party/kenney_factory_kit/cog-d.glb differ diff --git a/assets/third_party/kenney_factory_kit/cog-d.glb.import b/assets/third_party/kenney_factory_kit/cog-d.glb.import new file mode 100644 index 0000000..616a4ca --- /dev/null +++ b/assets/third_party/kenney_factory_kit/cog-d.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dxnk3408l70g8" +path="res://.godot/imported/cog-d.glb-a3ff5761f44e3e3091aa757579b8c8fc.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/cog-d.glb" +dest_files=["res://.godot/imported/cog-d.glb-a3ff5761f44e3e3091aa757579b8c8fc.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/cog-e.glb b/assets/third_party/kenney_factory_kit/cog-e.glb new file mode 100644 index 0000000..8f15666 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/cog-e.glb differ diff --git a/assets/third_party/kenney_factory_kit/cog-e.glb.import b/assets/third_party/kenney_factory_kit/cog-e.glb.import new file mode 100644 index 0000000..7c7456a --- /dev/null +++ b/assets/third_party/kenney_factory_kit/cog-e.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cho60mm2niphj" +path="res://.godot/imported/cog-e.glb-5c95a4dd519d7cfb26172b8510eede33.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/cog-e.glb" +dest_files=["res://.godot/imported/cog-e.glb-5c95a4dd519d7cfb26172b8510eede33.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/cone.glb b/assets/third_party/kenney_factory_kit/cone.glb new file mode 100644 index 0000000..65609e6 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/cone.glb differ diff --git a/assets/third_party/kenney_factory_kit/cone.glb.import b/assets/third_party/kenney_factory_kit/cone.glb.import new file mode 100644 index 0000000..d03ed7d --- /dev/null +++ b/assets/third_party/kenney_factory_kit/cone.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://ca6mkhlf0hdgn" +path="res://.godot/imported/cone.glb-ac6d4aee1538e1214169da7b6221ef67.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/cone.glb" +dest_files=["res://.godot/imported/cone.glb-ac6d4aee1538e1214169da7b6221ef67.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/conveyor-bars-fence-slope.glb b/assets/third_party/kenney_factory_kit/conveyor-bars-fence-slope.glb new file mode 100644 index 0000000..e0b753c Binary files /dev/null and b/assets/third_party/kenney_factory_kit/conveyor-bars-fence-slope.glb differ diff --git a/assets/third_party/kenney_factory_kit/conveyor-bars-fence-slope.glb.import b/assets/third_party/kenney_factory_kit/conveyor-bars-fence-slope.glb.import new file mode 100644 index 0000000..29de9c0 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/conveyor-bars-fence-slope.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dd67ew8bytwhn" +path="res://.godot/imported/conveyor-bars-fence-slope.glb-2503d942e50fd175d4a1e5c38fcfc6cb.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/conveyor-bars-fence-slope.glb" +dest_files=["res://.godot/imported/conveyor-bars-fence-slope.glb-2503d942e50fd175d4a1e5c38fcfc6cb.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/conveyor-bars-fence.glb b/assets/third_party/kenney_factory_kit/conveyor-bars-fence.glb new file mode 100644 index 0000000..1e1f01b Binary files /dev/null and b/assets/third_party/kenney_factory_kit/conveyor-bars-fence.glb differ diff --git a/assets/third_party/kenney_factory_kit/conveyor-bars-fence.glb.import b/assets/third_party/kenney_factory_kit/conveyor-bars-fence.glb.import new file mode 100644 index 0000000..fd4ac3d --- /dev/null +++ b/assets/third_party/kenney_factory_kit/conveyor-bars-fence.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://61ftiikq83v1" +path="res://.godot/imported/conveyor-bars-fence.glb-a2954cec52e0ff0e2524bfb1d6e7500d.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/conveyor-bars-fence.glb" +dest_files=["res://.godot/imported/conveyor-bars-fence.glb-a2954cec52e0ff0e2524bfb1d6e7500d.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/conveyor-bars-high-slope.glb b/assets/third_party/kenney_factory_kit/conveyor-bars-high-slope.glb new file mode 100644 index 0000000..c39879e Binary files /dev/null and b/assets/third_party/kenney_factory_kit/conveyor-bars-high-slope.glb differ diff --git a/assets/third_party/kenney_factory_kit/conveyor-bars-high-slope.glb.import b/assets/third_party/kenney_factory_kit/conveyor-bars-high-slope.glb.import new file mode 100644 index 0000000..01c50eb --- /dev/null +++ b/assets/third_party/kenney_factory_kit/conveyor-bars-high-slope.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cykfd72v1rbfa" +path="res://.godot/imported/conveyor-bars-high-slope.glb-d5fa718cd618fcb13bb8c7c2874baf87.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/conveyor-bars-high-slope.glb" +dest_files=["res://.godot/imported/conveyor-bars-high-slope.glb-d5fa718cd618fcb13bb8c7c2874baf87.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/conveyor-bars-high.glb b/assets/third_party/kenney_factory_kit/conveyor-bars-high.glb new file mode 100644 index 0000000..68d03d4 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/conveyor-bars-high.glb differ diff --git a/assets/third_party/kenney_factory_kit/conveyor-bars-high.glb.import b/assets/third_party/kenney_factory_kit/conveyor-bars-high.glb.import new file mode 100644 index 0000000..04634b5 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/conveyor-bars-high.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://baofqllahmfif" +path="res://.godot/imported/conveyor-bars-high.glb-64c0bdf5422ddd2b66e505b8c5371b47.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/conveyor-bars-high.glb" +dest_files=["res://.godot/imported/conveyor-bars-high.glb-64c0bdf5422ddd2b66e505b8c5371b47.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/conveyor-bars-sides.glb b/assets/third_party/kenney_factory_kit/conveyor-bars-sides.glb new file mode 100644 index 0000000..60c8ba5 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/conveyor-bars-sides.glb differ diff --git a/assets/third_party/kenney_factory_kit/conveyor-bars-sides.glb.import b/assets/third_party/kenney_factory_kit/conveyor-bars-sides.glb.import new file mode 100644 index 0000000..88b4bfd --- /dev/null +++ b/assets/third_party/kenney_factory_kit/conveyor-bars-sides.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://rg5gmtdrto8x" +path="res://.godot/imported/conveyor-bars-sides.glb-462dfdbbca54ed40f7a0d34ab49fe3f2.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/conveyor-bars-sides.glb" +dest_files=["res://.godot/imported/conveyor-bars-sides.glb-462dfdbbca54ed40f7a0d34ab49fe3f2.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/conveyor-bars-stripe-fence-slope.glb b/assets/third_party/kenney_factory_kit/conveyor-bars-stripe-fence-slope.glb new file mode 100644 index 0000000..ccc3e97 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/conveyor-bars-stripe-fence-slope.glb differ diff --git a/assets/third_party/kenney_factory_kit/conveyor-bars-stripe-fence-slope.glb.import b/assets/third_party/kenney_factory_kit/conveyor-bars-stripe-fence-slope.glb.import new file mode 100644 index 0000000..33aa7d6 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/conveyor-bars-stripe-fence-slope.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://jhcjmhyx4xfp" +path="res://.godot/imported/conveyor-bars-stripe-fence-slope.glb-486e9231a86cc4295aaf6e6e2c132d9b.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/conveyor-bars-stripe-fence-slope.glb" +dest_files=["res://.godot/imported/conveyor-bars-stripe-fence-slope.glb-486e9231a86cc4295aaf6e6e2c132d9b.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/conveyor-bars-stripe-fence.glb b/assets/third_party/kenney_factory_kit/conveyor-bars-stripe-fence.glb new file mode 100644 index 0000000..cbff1a9 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/conveyor-bars-stripe-fence.glb differ diff --git a/assets/third_party/kenney_factory_kit/conveyor-bars-stripe-fence.glb.import b/assets/third_party/kenney_factory_kit/conveyor-bars-stripe-fence.glb.import new file mode 100644 index 0000000..e9cf22b --- /dev/null +++ b/assets/third_party/kenney_factory_kit/conveyor-bars-stripe-fence.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dpgn26ondpksm" +path="res://.godot/imported/conveyor-bars-stripe-fence.glb-aa077658ce51c64702dbd33502a374db.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/conveyor-bars-stripe-fence.glb" +dest_files=["res://.godot/imported/conveyor-bars-stripe-fence.glb-aa077658ce51c64702dbd33502a374db.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/conveyor-bars-stripe-high-slope.glb b/assets/third_party/kenney_factory_kit/conveyor-bars-stripe-high-slope.glb new file mode 100644 index 0000000..eb4a0a1 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/conveyor-bars-stripe-high-slope.glb differ diff --git a/assets/third_party/kenney_factory_kit/conveyor-bars-stripe-high-slope.glb.import b/assets/third_party/kenney_factory_kit/conveyor-bars-stripe-high-slope.glb.import new file mode 100644 index 0000000..98b5f79 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/conveyor-bars-stripe-high-slope.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://b12quf7arf6lw" +path="res://.godot/imported/conveyor-bars-stripe-high-slope.glb-f00d7d13e5faea71f643b122264c8efa.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/conveyor-bars-stripe-high-slope.glb" +dest_files=["res://.godot/imported/conveyor-bars-stripe-high-slope.glb-f00d7d13e5faea71f643b122264c8efa.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/conveyor-bars-stripe-high.glb b/assets/third_party/kenney_factory_kit/conveyor-bars-stripe-high.glb new file mode 100644 index 0000000..6bed8bd Binary files /dev/null and b/assets/third_party/kenney_factory_kit/conveyor-bars-stripe-high.glb differ diff --git a/assets/third_party/kenney_factory_kit/conveyor-bars-stripe-high.glb.import b/assets/third_party/kenney_factory_kit/conveyor-bars-stripe-high.glb.import new file mode 100644 index 0000000..a20a193 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/conveyor-bars-stripe-high.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dwag032yd4pl4" +path="res://.godot/imported/conveyor-bars-stripe-high.glb-471e3c116faa088b2e536352bbc38abd.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/conveyor-bars-stripe-high.glb" +dest_files=["res://.godot/imported/conveyor-bars-stripe-high.glb-471e3c116faa088b2e536352bbc38abd.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/conveyor-bars-stripe-side.glb b/assets/third_party/kenney_factory_kit/conveyor-bars-stripe-side.glb new file mode 100644 index 0000000..7b8f284 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/conveyor-bars-stripe-side.glb differ diff --git a/assets/third_party/kenney_factory_kit/conveyor-bars-stripe-side.glb.import b/assets/third_party/kenney_factory_kit/conveyor-bars-stripe-side.glb.import new file mode 100644 index 0000000..53e5a7c --- /dev/null +++ b/assets/third_party/kenney_factory_kit/conveyor-bars-stripe-side.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bte8qah1pp2t0" +path="res://.godot/imported/conveyor-bars-stripe-side.glb-4079629c6b808e551bb87047280b159c.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/conveyor-bars-stripe-side.glb" +dest_files=["res://.godot/imported/conveyor-bars-stripe-side.glb-4079629c6b808e551bb87047280b159c.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/conveyor-bars-stripe.glb b/assets/third_party/kenney_factory_kit/conveyor-bars-stripe.glb new file mode 100644 index 0000000..51aece8 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/conveyor-bars-stripe.glb differ diff --git a/assets/third_party/kenney_factory_kit/conveyor-bars-stripe.glb.import b/assets/third_party/kenney_factory_kit/conveyor-bars-stripe.glb.import new file mode 100644 index 0000000..b92991f --- /dev/null +++ b/assets/third_party/kenney_factory_kit/conveyor-bars-stripe.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://pw2s0j8nt48s" +path="res://.godot/imported/conveyor-bars-stripe.glb-01e999f1d001ccfbed6d01329fdf7645.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/conveyor-bars-stripe.glb" +dest_files=["res://.godot/imported/conveyor-bars-stripe.glb-01e999f1d001ccfbed6d01329fdf7645.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/conveyor-bars.glb b/assets/third_party/kenney_factory_kit/conveyor-bars.glb new file mode 100644 index 0000000..79c9c8b Binary files /dev/null and b/assets/third_party/kenney_factory_kit/conveyor-bars.glb differ diff --git a/assets/third_party/kenney_factory_kit/conveyor-bars.glb.import b/assets/third_party/kenney_factory_kit/conveyor-bars.glb.import new file mode 100644 index 0000000..2eefa95 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/conveyor-bars.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c7rwv75ift74l" +path="res://.godot/imported/conveyor-bars.glb-dcb391ff537f567eac7d3ff1f719fad3.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/conveyor-bars.glb" +dest_files=["res://.godot/imported/conveyor-bars.glb-dcb391ff537f567eac7d3ff1f719fad3.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/conveyor-corner.glb b/assets/third_party/kenney_factory_kit/conveyor-corner.glb new file mode 100644 index 0000000..b323656 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/conveyor-corner.glb differ diff --git a/assets/third_party/kenney_factory_kit/conveyor-corner.glb.import b/assets/third_party/kenney_factory_kit/conveyor-corner.glb.import new file mode 100644 index 0000000..c8790f9 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/conveyor-corner.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c7t7btbxbtesn" +path="res://.godot/imported/conveyor-corner.glb-02c7a35e74d2dc8e8b36abebfccfd502.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/conveyor-corner.glb" +dest_files=["res://.godot/imported/conveyor-corner.glb-02c7a35e74d2dc8e8b36abebfccfd502.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/conveyor-cross.glb b/assets/third_party/kenney_factory_kit/conveyor-cross.glb new file mode 100644 index 0000000..a4ce65d Binary files /dev/null and b/assets/third_party/kenney_factory_kit/conveyor-cross.glb differ diff --git a/assets/third_party/kenney_factory_kit/conveyor-cross.glb.import b/assets/third_party/kenney_factory_kit/conveyor-cross.glb.import new file mode 100644 index 0000000..1a62945 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/conveyor-cross.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dq0d456eb3m2v" +path="res://.godot/imported/conveyor-cross.glb-8323d6a3fbab01efb3e7ba36c5af212b.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/conveyor-cross.glb" +dest_files=["res://.godot/imported/conveyor-cross.glb-8323d6a3fbab01efb3e7ba36c5af212b.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/conveyor-junction-t.glb b/assets/third_party/kenney_factory_kit/conveyor-junction-t.glb new file mode 100644 index 0000000..d723225 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/conveyor-junction-t.glb differ diff --git a/assets/third_party/kenney_factory_kit/conveyor-junction-t.glb.import b/assets/third_party/kenney_factory_kit/conveyor-junction-t.glb.import new file mode 100644 index 0000000..b557111 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/conveyor-junction-t.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bwe733apdbpwx" +path="res://.godot/imported/conveyor-junction-t.glb-5c1ce7e39a4ac8d0cf9bee2935536725.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/conveyor-junction-t.glb" +dest_files=["res://.godot/imported/conveyor-junction-t.glb-5c1ce7e39a4ac8d0cf9bee2935536725.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/conveyor-long-part-end.glb b/assets/third_party/kenney_factory_kit/conveyor-long-part-end.glb new file mode 100644 index 0000000..2d97061 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/conveyor-long-part-end.glb differ diff --git a/assets/third_party/kenney_factory_kit/conveyor-long-part-end.glb.import b/assets/third_party/kenney_factory_kit/conveyor-long-part-end.glb.import new file mode 100644 index 0000000..0e34996 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/conveyor-long-part-end.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cc8ev8h11d8hc" +path="res://.godot/imported/conveyor-long-part-end.glb-6b1e6f835417608cc35875dc14d572b6.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/conveyor-long-part-end.glb" +dest_files=["res://.godot/imported/conveyor-long-part-end.glb-6b1e6f835417608cc35875dc14d572b6.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/conveyor-long-part-middle.glb b/assets/third_party/kenney_factory_kit/conveyor-long-part-middle.glb new file mode 100644 index 0000000..13a0eb7 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/conveyor-long-part-middle.glb differ diff --git a/assets/third_party/kenney_factory_kit/conveyor-long-part-middle.glb.import b/assets/third_party/kenney_factory_kit/conveyor-long-part-middle.glb.import new file mode 100644 index 0000000..20a7399 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/conveyor-long-part-middle.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dr0n23jpku0jy" +path="res://.godot/imported/conveyor-long-part-middle.glb-d93eb200ee0d52acca15ce0f18bfa954.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/conveyor-long-part-middle.glb" +dest_files=["res://.godot/imported/conveyor-long-part-middle.glb-d93eb200ee0d52acca15ce0f18bfa954.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/conveyor-long-sides-part-end.glb b/assets/third_party/kenney_factory_kit/conveyor-long-sides-part-end.glb new file mode 100644 index 0000000..6f3ad43 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/conveyor-long-sides-part-end.glb differ diff --git a/assets/third_party/kenney_factory_kit/conveyor-long-sides-part-end.glb.import b/assets/third_party/kenney_factory_kit/conveyor-long-sides-part-end.glb.import new file mode 100644 index 0000000..149a6cb --- /dev/null +++ b/assets/third_party/kenney_factory_kit/conveyor-long-sides-part-end.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://v2ies5fk5lp1" +path="res://.godot/imported/conveyor-long-sides-part-end.glb-4e38e365e86e60c0895b72fa892c10dc.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/conveyor-long-sides-part-end.glb" +dest_files=["res://.godot/imported/conveyor-long-sides-part-end.glb-4e38e365e86e60c0895b72fa892c10dc.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/conveyor-long-sides-part-middle.glb b/assets/third_party/kenney_factory_kit/conveyor-long-sides-part-middle.glb new file mode 100644 index 0000000..36a30dc Binary files /dev/null and b/assets/third_party/kenney_factory_kit/conveyor-long-sides-part-middle.glb differ diff --git a/assets/third_party/kenney_factory_kit/conveyor-long-sides-part-middle.glb.import b/assets/third_party/kenney_factory_kit/conveyor-long-sides-part-middle.glb.import new file mode 100644 index 0000000..680716a --- /dev/null +++ b/assets/third_party/kenney_factory_kit/conveyor-long-sides-part-middle.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cgegl1awhrg0r" +path="res://.godot/imported/conveyor-long-sides-part-middle.glb-e8d2009f8b95ed57d97ea101abeebfaf.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/conveyor-long-sides-part-middle.glb" +dest_files=["res://.godot/imported/conveyor-long-sides-part-middle.glb-e8d2009f8b95ed57d97ea101abeebfaf.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/conveyor-long-sides.glb b/assets/third_party/kenney_factory_kit/conveyor-long-sides.glb new file mode 100644 index 0000000..0fc2637 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/conveyor-long-sides.glb differ diff --git a/assets/third_party/kenney_factory_kit/conveyor-long-sides.glb.import b/assets/third_party/kenney_factory_kit/conveyor-long-sides.glb.import new file mode 100644 index 0000000..005deaa --- /dev/null +++ b/assets/third_party/kenney_factory_kit/conveyor-long-sides.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c37aej2581ljw" +path="res://.godot/imported/conveyor-long-sides.glb-8db42072be4bed2cf52c465780071514.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/conveyor-long-sides.glb" +dest_files=["res://.godot/imported/conveyor-long-sides.glb-8db42072be4bed2cf52c465780071514.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/conveyor-long-stripe-sides-part-end.glb b/assets/third_party/kenney_factory_kit/conveyor-long-stripe-sides-part-end.glb new file mode 100644 index 0000000..d42a6e0 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/conveyor-long-stripe-sides-part-end.glb differ diff --git a/assets/third_party/kenney_factory_kit/conveyor-long-stripe-sides-part-end.glb.import b/assets/third_party/kenney_factory_kit/conveyor-long-stripe-sides-part-end.glb.import new file mode 100644 index 0000000..c4ea40d --- /dev/null +++ b/assets/third_party/kenney_factory_kit/conveyor-long-stripe-sides-part-end.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bycoifphrd8su" +path="res://.godot/imported/conveyor-long-stripe-sides-part-end.glb-30807655ce6b244595c70ec65449ba90.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/conveyor-long-stripe-sides-part-end.glb" +dest_files=["res://.godot/imported/conveyor-long-stripe-sides-part-end.glb-30807655ce6b244595c70ec65449ba90.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/conveyor-long-stripe-sides-part-middle.glb b/assets/third_party/kenney_factory_kit/conveyor-long-stripe-sides-part-middle.glb new file mode 100644 index 0000000..1eea640 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/conveyor-long-stripe-sides-part-middle.glb differ diff --git a/assets/third_party/kenney_factory_kit/conveyor-long-stripe-sides-part-middle.glb.import b/assets/third_party/kenney_factory_kit/conveyor-long-stripe-sides-part-middle.glb.import new file mode 100644 index 0000000..90682dd --- /dev/null +++ b/assets/third_party/kenney_factory_kit/conveyor-long-stripe-sides-part-middle.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dvumylvdahjpv" +path="res://.godot/imported/conveyor-long-stripe-sides-part-middle.glb-aeb411083eece9807252c9132afa38ae.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/conveyor-long-stripe-sides-part-middle.glb" +dest_files=["res://.godot/imported/conveyor-long-stripe-sides-part-middle.glb-aeb411083eece9807252c9132afa38ae.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/conveyor-long-stripe-sides.glb b/assets/third_party/kenney_factory_kit/conveyor-long-stripe-sides.glb new file mode 100644 index 0000000..b84930a Binary files /dev/null and b/assets/third_party/kenney_factory_kit/conveyor-long-stripe-sides.glb differ diff --git a/assets/third_party/kenney_factory_kit/conveyor-long-stripe-sides.glb.import b/assets/third_party/kenney_factory_kit/conveyor-long-stripe-sides.glb.import new file mode 100644 index 0000000..07a2f98 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/conveyor-long-stripe-sides.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://y3mjyhyn54xj" +path="res://.godot/imported/conveyor-long-stripe-sides.glb-95e5ce2e7d67d82af0ea2b5d8f2b88d1.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/conveyor-long-stripe-sides.glb" +dest_files=["res://.godot/imported/conveyor-long-stripe-sides.glb-95e5ce2e7d67d82af0ea2b5d8f2b88d1.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/conveyor-long-stripe.glb b/assets/third_party/kenney_factory_kit/conveyor-long-stripe.glb new file mode 100644 index 0000000..efb61a1 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/conveyor-long-stripe.glb differ diff --git a/assets/third_party/kenney_factory_kit/conveyor-long-stripe.glb.import b/assets/third_party/kenney_factory_kit/conveyor-long-stripe.glb.import new file mode 100644 index 0000000..006b273 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/conveyor-long-stripe.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dfjmtuu6f60dy" +path="res://.godot/imported/conveyor-long-stripe.glb-3d199409e1f233f20c5436287dc9b9ad.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/conveyor-long-stripe.glb" +dest_files=["res://.godot/imported/conveyor-long-stripe.glb-3d199409e1f233f20c5436287dc9b9ad.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/conveyor-long.glb b/assets/third_party/kenney_factory_kit/conveyor-long.glb new file mode 100644 index 0000000..6a30423 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/conveyor-long.glb differ diff --git a/assets/third_party/kenney_factory_kit/conveyor-long.glb.import b/assets/third_party/kenney_factory_kit/conveyor-long.glb.import new file mode 100644 index 0000000..cdd8f5a --- /dev/null +++ b/assets/third_party/kenney_factory_kit/conveyor-long.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bkf1x024j67s7" +path="res://.godot/imported/conveyor-long.glb-66f012f2cee13b64e285e762260efea5.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/conveyor-long.glb" +dest_files=["res://.godot/imported/conveyor-long.glb-66f012f2cee13b64e285e762260efea5.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/conveyor-sides-cross.glb b/assets/third_party/kenney_factory_kit/conveyor-sides-cross.glb new file mode 100644 index 0000000..80d510e Binary files /dev/null and b/assets/third_party/kenney_factory_kit/conveyor-sides-cross.glb differ diff --git a/assets/third_party/kenney_factory_kit/conveyor-sides-cross.glb.import b/assets/third_party/kenney_factory_kit/conveyor-sides-cross.glb.import new file mode 100644 index 0000000..19d470d --- /dev/null +++ b/assets/third_party/kenney_factory_kit/conveyor-sides-cross.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://thgkkk6cjpom" +path="res://.godot/imported/conveyor-sides-cross.glb-2d7055cd691a304846a262d785513c4b.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/conveyor-sides-cross.glb" +dest_files=["res://.godot/imported/conveyor-sides-cross.glb-2d7055cd691a304846a262d785513c4b.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/conveyor-sides-junction-t.glb b/assets/third_party/kenney_factory_kit/conveyor-sides-junction-t.glb new file mode 100644 index 0000000..f51eca9 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/conveyor-sides-junction-t.glb differ diff --git a/assets/third_party/kenney_factory_kit/conveyor-sides-junction-t.glb.import b/assets/third_party/kenney_factory_kit/conveyor-sides-junction-t.glb.import new file mode 100644 index 0000000..43aefda --- /dev/null +++ b/assets/third_party/kenney_factory_kit/conveyor-sides-junction-t.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cluo4k4v6ts6g" +path="res://.godot/imported/conveyor-sides-junction-t.glb-9522fab940a8a710f52dbc7ebb7e3121.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/conveyor-sides-junction-t.glb" +dest_files=["res://.godot/imported/conveyor-sides-junction-t.glb-9522fab940a8a710f52dbc7ebb7e3121.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/conveyor-sides.glb b/assets/third_party/kenney_factory_kit/conveyor-sides.glb new file mode 100644 index 0000000..47742da Binary files /dev/null and b/assets/third_party/kenney_factory_kit/conveyor-sides.glb differ diff --git a/assets/third_party/kenney_factory_kit/conveyor-sides.glb.import b/assets/third_party/kenney_factory_kit/conveyor-sides.glb.import new file mode 100644 index 0000000..6881d42 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/conveyor-sides.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://baiwqcynkwmib" +path="res://.godot/imported/conveyor-sides.glb-e8f0172c2f44404b9d6d1d7e8627a608.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/conveyor-sides.glb" +dest_files=["res://.godot/imported/conveyor-sides.glb-e8f0172c2f44404b9d6d1d7e8627a608.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/conveyor-stripe-corner.glb b/assets/third_party/kenney_factory_kit/conveyor-stripe-corner.glb new file mode 100644 index 0000000..898f443 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/conveyor-stripe-corner.glb differ diff --git a/assets/third_party/kenney_factory_kit/conveyor-stripe-corner.glb.import b/assets/third_party/kenney_factory_kit/conveyor-stripe-corner.glb.import new file mode 100644 index 0000000..5f0ee70 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/conveyor-stripe-corner.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://lq8cnr1hux7k" +path="res://.godot/imported/conveyor-stripe-corner.glb-aeae94d3298233f68065fce8ee5efe16.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/conveyor-stripe-corner.glb" +dest_files=["res://.godot/imported/conveyor-stripe-corner.glb-aeae94d3298233f68065fce8ee5efe16.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/conveyor-stripe-cross.glb b/assets/third_party/kenney_factory_kit/conveyor-stripe-cross.glb new file mode 100644 index 0000000..e05f924 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/conveyor-stripe-cross.glb differ diff --git a/assets/third_party/kenney_factory_kit/conveyor-stripe-cross.glb.import b/assets/third_party/kenney_factory_kit/conveyor-stripe-cross.glb.import new file mode 100644 index 0000000..b1dc112 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/conveyor-stripe-cross.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bjjpklno2nqt5" +path="res://.godot/imported/conveyor-stripe-cross.glb-66985c1d65b17e72cf912765bbffe2dd.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/conveyor-stripe-cross.glb" +dest_files=["res://.godot/imported/conveyor-stripe-cross.glb-66985c1d65b17e72cf912765bbffe2dd.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/conveyor-stripe-junction-t.glb b/assets/third_party/kenney_factory_kit/conveyor-stripe-junction-t.glb new file mode 100644 index 0000000..b168711 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/conveyor-stripe-junction-t.glb differ diff --git a/assets/third_party/kenney_factory_kit/conveyor-stripe-junction-t.glb.import b/assets/third_party/kenney_factory_kit/conveyor-stripe-junction-t.glb.import new file mode 100644 index 0000000..1323d51 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/conveyor-stripe-junction-t.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bdyyinu8dnuh3" +path="res://.godot/imported/conveyor-stripe-junction-t.glb-631668aef96f9ab2996b9a682f005568.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/conveyor-stripe-junction-t.glb" +dest_files=["res://.godot/imported/conveyor-stripe-junction-t.glb-631668aef96f9ab2996b9a682f005568.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/conveyor-stripe-part-end.glb b/assets/third_party/kenney_factory_kit/conveyor-stripe-part-end.glb new file mode 100644 index 0000000..87a1d6c Binary files /dev/null and b/assets/third_party/kenney_factory_kit/conveyor-stripe-part-end.glb differ diff --git a/assets/third_party/kenney_factory_kit/conveyor-stripe-part-end.glb.import b/assets/third_party/kenney_factory_kit/conveyor-stripe-part-end.glb.import new file mode 100644 index 0000000..d5c05ac --- /dev/null +++ b/assets/third_party/kenney_factory_kit/conveyor-stripe-part-end.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://pe4bvlluhcmd" +path="res://.godot/imported/conveyor-stripe-part-end.glb-a05e8acaa024e3920863f492e588adea.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/conveyor-stripe-part-end.glb" +dest_files=["res://.godot/imported/conveyor-stripe-part-end.glb-a05e8acaa024e3920863f492e588adea.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/conveyor-stripe-part-middle.glb b/assets/third_party/kenney_factory_kit/conveyor-stripe-part-middle.glb new file mode 100644 index 0000000..acd1810 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/conveyor-stripe-part-middle.glb differ diff --git a/assets/third_party/kenney_factory_kit/conveyor-stripe-part-middle.glb.import b/assets/third_party/kenney_factory_kit/conveyor-stripe-part-middle.glb.import new file mode 100644 index 0000000..cdac3a8 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/conveyor-stripe-part-middle.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://diyr3qwmf8n6l" +path="res://.godot/imported/conveyor-stripe-part-middle.glb-bd5c9c200bfa0da7de6836b0ba767a19.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/conveyor-stripe-part-middle.glb" +dest_files=["res://.godot/imported/conveyor-stripe-part-middle.glb-bd5c9c200bfa0da7de6836b0ba767a19.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/conveyor-stripe-sides-cross.glb b/assets/third_party/kenney_factory_kit/conveyor-stripe-sides-cross.glb new file mode 100644 index 0000000..8f392c0 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/conveyor-stripe-sides-cross.glb differ diff --git a/assets/third_party/kenney_factory_kit/conveyor-stripe-sides-cross.glb.import b/assets/third_party/kenney_factory_kit/conveyor-stripe-sides-cross.glb.import new file mode 100644 index 0000000..bf70482 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/conveyor-stripe-sides-cross.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bdpin64n4vs2i" +path="res://.godot/imported/conveyor-stripe-sides-cross.glb-788631431158ec507939c3489a062f8a.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/conveyor-stripe-sides-cross.glb" +dest_files=["res://.godot/imported/conveyor-stripe-sides-cross.glb-788631431158ec507939c3489a062f8a.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/conveyor-stripe-sides-junction-t.glb b/assets/third_party/kenney_factory_kit/conveyor-stripe-sides-junction-t.glb new file mode 100644 index 0000000..6f04804 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/conveyor-stripe-sides-junction-t.glb differ diff --git a/assets/third_party/kenney_factory_kit/conveyor-stripe-sides-junction-t.glb.import b/assets/third_party/kenney_factory_kit/conveyor-stripe-sides-junction-t.glb.import new file mode 100644 index 0000000..d3a86e7 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/conveyor-stripe-sides-junction-t.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cx2378g3h8rac" +path="res://.godot/imported/conveyor-stripe-sides-junction-t.glb-7effab363c811762655b527a6155709b.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/conveyor-stripe-sides-junction-t.glb" +dest_files=["res://.godot/imported/conveyor-stripe-sides-junction-t.glb-7effab363c811762655b527a6155709b.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/conveyor-stripe-sides.glb b/assets/third_party/kenney_factory_kit/conveyor-stripe-sides.glb new file mode 100644 index 0000000..7f83dd4 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/conveyor-stripe-sides.glb differ diff --git a/assets/third_party/kenney_factory_kit/conveyor-stripe-sides.glb.import b/assets/third_party/kenney_factory_kit/conveyor-stripe-sides.glb.import new file mode 100644 index 0000000..f664d65 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/conveyor-stripe-sides.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://yx618pvy55so" +path="res://.godot/imported/conveyor-stripe-sides.glb-55a1dde918bc8975598c2d6a58483069.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/conveyor-stripe-sides.glb" +dest_files=["res://.godot/imported/conveyor-stripe-sides.glb-55a1dde918bc8975598c2d6a58483069.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/conveyor-stripe.glb b/assets/third_party/kenney_factory_kit/conveyor-stripe.glb new file mode 100644 index 0000000..d003cd5 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/conveyor-stripe.glb differ diff --git a/assets/third_party/kenney_factory_kit/conveyor-stripe.glb.import b/assets/third_party/kenney_factory_kit/conveyor-stripe.glb.import new file mode 100644 index 0000000..3519219 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/conveyor-stripe.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c1e23cxq33orj" +path="res://.godot/imported/conveyor-stripe.glb-6489ba92f7162a716a10489697e0d1ae.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/conveyor-stripe.glb" +dest_files=["res://.godot/imported/conveyor-stripe.glb-6489ba92f7162a716a10489697e0d1ae.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/conveyor.glb b/assets/third_party/kenney_factory_kit/conveyor.glb new file mode 100644 index 0000000..52c2ac1 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/conveyor.glb differ diff --git a/assets/third_party/kenney_factory_kit/conveyor.glb.import b/assets/third_party/kenney_factory_kit/conveyor.glb.import new file mode 100644 index 0000000..2eba8a1 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/conveyor.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bcmoa12tdsvel" +path="res://.godot/imported/conveyor.glb-b6b4c0259abe55ce4d3fb721c5f6d5fa.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/conveyor.glb" +dest_files=["res://.godot/imported/conveyor.glb-b6b4c0259abe55ce4d3fb721c5f6d5fa.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/crane-lift.glb b/assets/third_party/kenney_factory_kit/crane-lift.glb new file mode 100644 index 0000000..c264977 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/crane-lift.glb differ diff --git a/assets/third_party/kenney_factory_kit/crane-lift.glb.import b/assets/third_party/kenney_factory_kit/crane-lift.glb.import new file mode 100644 index 0000000..44141ca --- /dev/null +++ b/assets/third_party/kenney_factory_kit/crane-lift.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cawud4r12wsei" +path="res://.godot/imported/crane-lift.glb-0134bf90a4ae33cc6e48a4c9bbef65c5.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/crane-lift.glb" +dest_files=["res://.godot/imported/crane-lift.glb-0134bf90a4ae33cc6e48a4c9bbef65c5.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/crane-magnet.glb b/assets/third_party/kenney_factory_kit/crane-magnet.glb new file mode 100644 index 0000000..37727e9 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/crane-magnet.glb differ diff --git a/assets/third_party/kenney_factory_kit/crane-magnet.glb.import b/assets/third_party/kenney_factory_kit/crane-magnet.glb.import new file mode 100644 index 0000000..c5e584c --- /dev/null +++ b/assets/third_party/kenney_factory_kit/crane-magnet.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c2ns5lfhbcwfk" +path="res://.godot/imported/crane-magnet.glb-62b7345dfd71d7e65db38e2cc6ee8bdf.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/crane-magnet.glb" +dest_files=["res://.godot/imported/crane-magnet.glb-62b7345dfd71d7e65db38e2cc6ee8bdf.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/crane.glb b/assets/third_party/kenney_factory_kit/crane.glb new file mode 100644 index 0000000..50d1758 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/crane.glb differ diff --git a/assets/third_party/kenney_factory_kit/crane.glb.import b/assets/third_party/kenney_factory_kit/crane.glb.import new file mode 100644 index 0000000..26d9d5c --- /dev/null +++ b/assets/third_party/kenney_factory_kit/crane.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://clg2d3fox4ysl" +path="res://.godot/imported/crane.glb-ed15cc35a2f282284ec1f792b8ea1f23.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/crane.glb" +dest_files=["res://.godot/imported/crane.glb-ed15cc35a2f282284ec1f792b8ea1f23.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/door-wide-closed.glb b/assets/third_party/kenney_factory_kit/door-wide-closed.glb new file mode 100644 index 0000000..13722b0 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/door-wide-closed.glb differ diff --git a/assets/third_party/kenney_factory_kit/door-wide-closed.glb.import b/assets/third_party/kenney_factory_kit/door-wide-closed.glb.import new file mode 100644 index 0000000..3aba422 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/door-wide-closed.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://d4ct4l7k5atli" +path="res://.godot/imported/door-wide-closed.glb-878b74ae3a85e4a03fb2ca63998c3668.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/door-wide-closed.glb" +dest_files=["res://.godot/imported/door-wide-closed.glb-878b74ae3a85e4a03fb2ca63998c3668.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/door-wide-half.glb b/assets/third_party/kenney_factory_kit/door-wide-half.glb new file mode 100644 index 0000000..33918c1 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/door-wide-half.glb differ diff --git a/assets/third_party/kenney_factory_kit/door-wide-half.glb.import b/assets/third_party/kenney_factory_kit/door-wide-half.glb.import new file mode 100644 index 0000000..b814541 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/door-wide-half.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://ditwxibdeuhr" +path="res://.godot/imported/door-wide-half.glb-f2f63a2b83b7a5a71e61bff8b6bec153.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/door-wide-half.glb" +dest_files=["res://.godot/imported/door-wide-half.glb-f2f63a2b83b7a5a71e61bff8b6bec153.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/door-wide-open.glb b/assets/third_party/kenney_factory_kit/door-wide-open.glb new file mode 100644 index 0000000..76ccb2b Binary files /dev/null and b/assets/third_party/kenney_factory_kit/door-wide-open.glb differ diff --git a/assets/third_party/kenney_factory_kit/door-wide-open.glb.import b/assets/third_party/kenney_factory_kit/door-wide-open.glb.import new file mode 100644 index 0000000..d8e8edf --- /dev/null +++ b/assets/third_party/kenney_factory_kit/door-wide-open.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c45b2ef4hjguj" +path="res://.godot/imported/door-wide-open.glb-38de8f2e27b528526e462373545932f2.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/door-wide-open.glb" +dest_files=["res://.godot/imported/door-wide-open.glb-38de8f2e27b528526e462373545932f2.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/door.glb b/assets/third_party/kenney_factory_kit/door.glb new file mode 100644 index 0000000..9849119 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/door.glb differ diff --git a/assets/third_party/kenney_factory_kit/door.glb.import b/assets/third_party/kenney_factory_kit/door.glb.import new file mode 100644 index 0000000..e833abd --- /dev/null +++ b/assets/third_party/kenney_factory_kit/door.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://m1fsl34js4hm" +path="res://.godot/imported/door.glb-f080aefb90eb39b134e079d3edecb8e8.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/door.glb" +dest_files=["res://.godot/imported/door.glb-f080aefb90eb39b134e079d3edecb8e8.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/floor-large.glb b/assets/third_party/kenney_factory_kit/floor-large.glb new file mode 100644 index 0000000..8d6f23b Binary files /dev/null and b/assets/third_party/kenney_factory_kit/floor-large.glb differ diff --git a/assets/third_party/kenney_factory_kit/floor-large.glb.import b/assets/third_party/kenney_factory_kit/floor-large.glb.import new file mode 100644 index 0000000..2cf2df8 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/floor-large.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://ce4otfm7b440r" +path="res://.godot/imported/floor-large.glb-48807bd3bf4b5cf0094eb64754a19b1e.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/floor-large.glb" +dest_files=["res://.godot/imported/floor-large.glb-48807bd3bf4b5cf0094eb64754a19b1e.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/floor.glb b/assets/third_party/kenney_factory_kit/floor.glb new file mode 100644 index 0000000..5411c2c Binary files /dev/null and b/assets/third_party/kenney_factory_kit/floor.glb differ diff --git a/assets/third_party/kenney_factory_kit/floor.glb.import b/assets/third_party/kenney_factory_kit/floor.glb.import new file mode 100644 index 0000000..57118ba --- /dev/null +++ b/assets/third_party/kenney_factory_kit/floor.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c42clgi0eopul" +path="res://.godot/imported/floor.glb-fe596253d03257ea26e4581b3119dfa0.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/floor.glb" +dest_files=["res://.godot/imported/floor.glb-fe596253d03257ea26e4581b3119dfa0.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/hopper-high-round.glb b/assets/third_party/kenney_factory_kit/hopper-high-round.glb new file mode 100644 index 0000000..ca5260e Binary files /dev/null and b/assets/third_party/kenney_factory_kit/hopper-high-round.glb differ diff --git a/assets/third_party/kenney_factory_kit/hopper-high-round.glb.import b/assets/third_party/kenney_factory_kit/hopper-high-round.glb.import new file mode 100644 index 0000000..af64090 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/hopper-high-round.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://yygu666dqwjk" +path="res://.godot/imported/hopper-high-round.glb-d94ce60393400d8567fc909064c73981.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/hopper-high-round.glb" +dest_files=["res://.godot/imported/hopper-high-round.glb-d94ce60393400d8567fc909064c73981.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/hopper-high-square.glb b/assets/third_party/kenney_factory_kit/hopper-high-square.glb new file mode 100644 index 0000000..36aab55 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/hopper-high-square.glb differ diff --git a/assets/third_party/kenney_factory_kit/hopper-high-square.glb.import b/assets/third_party/kenney_factory_kit/hopper-high-square.glb.import new file mode 100644 index 0000000..0dd3329 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/hopper-high-square.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dvy5r88a5lvxq" +path="res://.godot/imported/hopper-high-square.glb-c50ff717303caf54a41d266224ad335b.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/hopper-high-square.glb" +dest_files=["res://.godot/imported/hopper-high-square.glb-c50ff717303caf54a41d266224ad335b.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/hopper-round.glb b/assets/third_party/kenney_factory_kit/hopper-round.glb new file mode 100644 index 0000000..b9aca93 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/hopper-round.glb differ diff --git a/assets/third_party/kenney_factory_kit/hopper-round.glb.import b/assets/third_party/kenney_factory_kit/hopper-round.glb.import new file mode 100644 index 0000000..b61ebbc --- /dev/null +++ b/assets/third_party/kenney_factory_kit/hopper-round.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://ch74j8prvr4f4" +path="res://.godot/imported/hopper-round.glb-ac86a706727ffa240a84f494da220763.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/hopper-round.glb" +dest_files=["res://.godot/imported/hopper-round.glb-ac86a706727ffa240a84f494da220763.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/hopper-square.glb b/assets/third_party/kenney_factory_kit/hopper-square.glb new file mode 100644 index 0000000..6df8182 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/hopper-square.glb differ diff --git a/assets/third_party/kenney_factory_kit/hopper-square.glb.import b/assets/third_party/kenney_factory_kit/hopper-square.glb.import new file mode 100644 index 0000000..f8b1a16 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/hopper-square.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bau107sx20hb6" +path="res://.godot/imported/hopper-square.glb-0bba9c85e4f4fd5407ac75b2546f7ef4.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/hopper-square.glb" +dest_files=["res://.godot/imported/hopper-square.glb-0bba9c85e4f4fd5407ac75b2546f7ef4.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/indicator-special-area.glb b/assets/third_party/kenney_factory_kit/indicator-special-area.glb new file mode 100644 index 0000000..cf424aa Binary files /dev/null and b/assets/third_party/kenney_factory_kit/indicator-special-area.glb differ diff --git a/assets/third_party/kenney_factory_kit/indicator-special-area.glb.import b/assets/third_party/kenney_factory_kit/indicator-special-area.glb.import new file mode 100644 index 0000000..85d1ff4 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/indicator-special-area.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c7ce4idq3jayn" +path="res://.godot/imported/indicator-special-area.glb-78e67e903955130b4386b6e3d3386cf3.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/indicator-special-area.glb" +dest_files=["res://.godot/imported/indicator-special-area.glb-78e67e903955130b4386b6e3d3386cf3.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/indicator-special-arrow.glb b/assets/third_party/kenney_factory_kit/indicator-special-arrow.glb new file mode 100644 index 0000000..a8b1450 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/indicator-special-arrow.glb differ diff --git a/assets/third_party/kenney_factory_kit/indicator-special-arrow.glb.import b/assets/third_party/kenney_factory_kit/indicator-special-arrow.glb.import new file mode 100644 index 0000000..200e2c5 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/indicator-special-arrow.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://7qrqu305b1pu" +path="res://.godot/imported/indicator-special-arrow.glb-b737b07968dc237320d43476c6b03404.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/indicator-special-arrow.glb" +dest_files=["res://.godot/imported/indicator-special-arrow.glb-b737b07968dc237320d43476c6b03404.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/indicator-special-cross.glb b/assets/third_party/kenney_factory_kit/indicator-special-cross.glb new file mode 100644 index 0000000..f3ba381 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/indicator-special-cross.glb differ diff --git a/assets/third_party/kenney_factory_kit/indicator-special-cross.glb.import b/assets/third_party/kenney_factory_kit/indicator-special-cross.glb.import new file mode 100644 index 0000000..ca4a288 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/indicator-special-cross.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dushbegnue2lb" +path="res://.godot/imported/indicator-special-cross.glb-1ab16f6e37ee777574b008a2b9178baf.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/indicator-special-cross.glb" +dest_files=["res://.godot/imported/indicator-special-cross.glb-1ab16f6e37ee777574b008a2b9178baf.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/indicator-special-lines.glb b/assets/third_party/kenney_factory_kit/indicator-special-lines.glb new file mode 100644 index 0000000..95519ef Binary files /dev/null and b/assets/third_party/kenney_factory_kit/indicator-special-lines.glb differ diff --git a/assets/third_party/kenney_factory_kit/indicator-special-lines.glb.import b/assets/third_party/kenney_factory_kit/indicator-special-lines.glb.import new file mode 100644 index 0000000..e7e1620 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/indicator-special-lines.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://glioo0g5wgew" +path="res://.godot/imported/indicator-special-lines.glb-c0f952421181f278e28b7d3fe9c6ac75.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/indicator-special-lines.glb" +dest_files=["res://.godot/imported/indicator-special-lines.glb-c0f952421181f278e28b7d3fe9c6ac75.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/lever-double.glb b/assets/third_party/kenney_factory_kit/lever-double.glb new file mode 100644 index 0000000..9dcfb67 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/lever-double.glb differ diff --git a/assets/third_party/kenney_factory_kit/lever-double.glb.import b/assets/third_party/kenney_factory_kit/lever-double.glb.import new file mode 100644 index 0000000..f98dc97 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/lever-double.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bq23k32ofdpbp" +path="res://.godot/imported/lever-double.glb-7f0b8afbabb861df6d7a1fc0335c9eb2.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/lever-double.glb" +dest_files=["res://.godot/imported/lever-double.glb-7f0b8afbabb861df6d7a1fc0335c9eb2.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/lever-single.glb b/assets/third_party/kenney_factory_kit/lever-single.glb new file mode 100644 index 0000000..094ad58 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/lever-single.glb differ diff --git a/assets/third_party/kenney_factory_kit/lever-single.glb.import b/assets/third_party/kenney_factory_kit/lever-single.glb.import new file mode 100644 index 0000000..ff529c0 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/lever-single.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cjyxhun5gpdg3" +path="res://.godot/imported/lever-single.glb-7e8664797ef1e21d18d56f49d2c8ebac.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/lever-single.glb" +dest_files=["res://.godot/imported/lever-single.glb-7e8664797ef1e21d18d56f49d2c8ebac.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/machine-bed.glb b/assets/third_party/kenney_factory_kit/machine-bed.glb new file mode 100644 index 0000000..4a16151 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/machine-bed.glb differ diff --git a/assets/third_party/kenney_factory_kit/machine-bed.glb.import b/assets/third_party/kenney_factory_kit/machine-bed.glb.import new file mode 100644 index 0000000..444b8b2 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/machine-bed.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://b6a6qta38jkgj" +path="res://.godot/imported/machine-bed.glb-273df6e9f6e26a3fec99824b9a3f96e2.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/machine-bed.glb" +dest_files=["res://.godot/imported/machine-bed.glb-273df6e9f6e26a3fec99824b9a3f96e2.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/machine-connection-hole.glb b/assets/third_party/kenney_factory_kit/machine-connection-hole.glb new file mode 100644 index 0000000..a23123a Binary files /dev/null and b/assets/third_party/kenney_factory_kit/machine-connection-hole.glb differ diff --git a/assets/third_party/kenney_factory_kit/machine-connection-hole.glb.import b/assets/third_party/kenney_factory_kit/machine-connection-hole.glb.import new file mode 100644 index 0000000..ba0361a --- /dev/null +++ b/assets/third_party/kenney_factory_kit/machine-connection-hole.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dxophgc1tuuba" +path="res://.godot/imported/machine-connection-hole.glb-9dd3ceaf135a3a2399b258d30c040eef.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/machine-connection-hole.glb" +dest_files=["res://.godot/imported/machine-connection-hole.glb-9dd3ceaf135a3a2399b258d30c040eef.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/machine-connection-pipe.glb b/assets/third_party/kenney_factory_kit/machine-connection-pipe.glb new file mode 100644 index 0000000..24a79c2 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/machine-connection-pipe.glb differ diff --git a/assets/third_party/kenney_factory_kit/machine-connection-pipe.glb.import b/assets/third_party/kenney_factory_kit/machine-connection-pipe.glb.import new file mode 100644 index 0000000..8557196 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/machine-connection-pipe.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c36gkwqfmkajy" +path="res://.godot/imported/machine-connection-pipe.glb-82313d621475fdfcf613b8d4bc67d14d.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/machine-connection-pipe.glb" +dest_files=["res://.godot/imported/machine-connection-pipe.glb-82313d621475fdfcf613b8d4bc67d14d.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/machine-fortified.glb b/assets/third_party/kenney_factory_kit/machine-fortified.glb new file mode 100644 index 0000000..998883b Binary files /dev/null and b/assets/third_party/kenney_factory_kit/machine-fortified.glb differ diff --git a/assets/third_party/kenney_factory_kit/machine-fortified.glb.import b/assets/third_party/kenney_factory_kit/machine-fortified.glb.import new file mode 100644 index 0000000..51f5abd --- /dev/null +++ b/assets/third_party/kenney_factory_kit/machine-fortified.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cwbwsjlblfagv" +path="res://.godot/imported/machine-fortified.glb-0e20c5051f8df3f31d88bd1bf01ae2e4.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/machine-fortified.glb" +dest_files=["res://.godot/imported/machine-fortified.glb-0e20c5051f8df3f31d88bd1bf01ae2e4.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/machine-window-bar.glb b/assets/third_party/kenney_factory_kit/machine-window-bar.glb new file mode 100644 index 0000000..21c0e90 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/machine-window-bar.glb differ diff --git a/assets/third_party/kenney_factory_kit/machine-window-bar.glb.import b/assets/third_party/kenney_factory_kit/machine-window-bar.glb.import new file mode 100644 index 0000000..fc867b0 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/machine-window-bar.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://ddh0she0i03cf" +path="res://.godot/imported/machine-window-bar.glb-9dd6ba0797e923872b686b4920551447.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/machine-window-bar.glb" +dest_files=["res://.godot/imported/machine-window-bar.glb-9dd6ba0797e923872b686b4920551447.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/machine-window.glb b/assets/third_party/kenney_factory_kit/machine-window.glb new file mode 100644 index 0000000..d4ca232 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/machine-window.glb differ diff --git a/assets/third_party/kenney_factory_kit/machine-window.glb.import b/assets/third_party/kenney_factory_kit/machine-window.glb.import new file mode 100644 index 0000000..6efa1aa --- /dev/null +++ b/assets/third_party/kenney_factory_kit/machine-window.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://crvt06u56u323" +path="res://.godot/imported/machine-window.glb-215988b9209bdcb98996374be9c00c00.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/machine-window.glb" +dest_files=["res://.godot/imported/machine-window.glb-215988b9209bdcb98996374be9c00c00.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/machine.glb b/assets/third_party/kenney_factory_kit/machine.glb new file mode 100644 index 0000000..f019600 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/machine.glb differ diff --git a/assets/third_party/kenney_factory_kit/machine.glb.import b/assets/third_party/kenney_factory_kit/machine.glb.import new file mode 100644 index 0000000..b827748 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/machine.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dipwhx2pa1y67" +path="res://.godot/imported/machine.glb-9f91a2f48f864829d81a2c4a74f82b24.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/machine.glb" +dest_files=["res://.godot/imported/machine.glb-9f91a2f48f864829d81a2c4a74f82b24.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/oopi.glb b/assets/third_party/kenney_factory_kit/oopi.glb new file mode 100644 index 0000000..533a0d4 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/oopi.glb differ diff --git a/assets/third_party/kenney_factory_kit/oopi.glb.import b/assets/third_party/kenney_factory_kit/oopi.glb.import new file mode 100644 index 0000000..40755ba --- /dev/null +++ b/assets/third_party/kenney_factory_kit/oopi.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c731buu0knsqr" +path="res://.godot/imported/oopi.glb-da365f9d933732afdff7b7c71da07ad8.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/oopi.glb" +dest_files=["res://.godot/imported/oopi.glb-da365f9d933732afdff7b7c71da07ad8.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/pipe-glass-large-bend.glb b/assets/third_party/kenney_factory_kit/pipe-glass-large-bend.glb new file mode 100644 index 0000000..88ac873 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/pipe-glass-large-bend.glb differ diff --git a/assets/third_party/kenney_factory_kit/pipe-glass-large-bend.glb.import b/assets/third_party/kenney_factory_kit/pipe-glass-large-bend.glb.import new file mode 100644 index 0000000..dac1833 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/pipe-glass-large-bend.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://ba53sx33t4rpe" +path="res://.godot/imported/pipe-glass-large-bend.glb-6f17007eae998ae26314569b5291f41e.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/pipe-glass-large-bend.glb" +dest_files=["res://.godot/imported/pipe-glass-large-bend.glb-6f17007eae998ae26314569b5291f41e.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/pipe-glass-large-bump.glb b/assets/third_party/kenney_factory_kit/pipe-glass-large-bump.glb new file mode 100644 index 0000000..1e17b83 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/pipe-glass-large-bump.glb differ diff --git a/assets/third_party/kenney_factory_kit/pipe-glass-large-bump.glb.import b/assets/third_party/kenney_factory_kit/pipe-glass-large-bump.glb.import new file mode 100644 index 0000000..f8b9946 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/pipe-glass-large-bump.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c7d8j5exirt7j" +path="res://.godot/imported/pipe-glass-large-bump.glb-a18c0c6db20dc3bd4f2d652eabf7186f.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/pipe-glass-large-bump.glb" +dest_files=["res://.godot/imported/pipe-glass-large-bump.glb-a18c0c6db20dc3bd4f2d652eabf7186f.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/pipe-glass-large-cross.glb b/assets/third_party/kenney_factory_kit/pipe-glass-large-cross.glb new file mode 100644 index 0000000..ddde7f0 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/pipe-glass-large-cross.glb differ diff --git a/assets/third_party/kenney_factory_kit/pipe-glass-large-cross.glb.import b/assets/third_party/kenney_factory_kit/pipe-glass-large-cross.glb.import new file mode 100644 index 0000000..095b3c2 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/pipe-glass-large-cross.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cmw4lnfsj2iwk" +path="res://.godot/imported/pipe-glass-large-cross.glb-a36092bf71655ff8108f2f3ba2143bbc.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/pipe-glass-large-cross.glb" +dest_files=["res://.godot/imported/pipe-glass-large-cross.glb-a36092bf71655ff8108f2f3ba2143bbc.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/pipe-glass-large-curve.glb b/assets/third_party/kenney_factory_kit/pipe-glass-large-curve.glb new file mode 100644 index 0000000..cf82541 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/pipe-glass-large-curve.glb differ diff --git a/assets/third_party/kenney_factory_kit/pipe-glass-large-curve.glb.import b/assets/third_party/kenney_factory_kit/pipe-glass-large-curve.glb.import new file mode 100644 index 0000000..be54a6e --- /dev/null +++ b/assets/third_party/kenney_factory_kit/pipe-glass-large-curve.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dfph64mubc85q" +path="res://.godot/imported/pipe-glass-large-curve.glb-4d3364387185c02a276e2e1e44b198e3.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/pipe-glass-large-curve.glb" +dest_files=["res://.godot/imported/pipe-glass-large-curve.glb-4d3364387185c02a276e2e1e44b198e3.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/pipe-glass-large-junction.glb b/assets/third_party/kenney_factory_kit/pipe-glass-large-junction.glb new file mode 100644 index 0000000..cbf3a6f Binary files /dev/null and b/assets/third_party/kenney_factory_kit/pipe-glass-large-junction.glb differ diff --git a/assets/third_party/kenney_factory_kit/pipe-glass-large-junction.glb.import b/assets/third_party/kenney_factory_kit/pipe-glass-large-junction.glb.import new file mode 100644 index 0000000..4830c96 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/pipe-glass-large-junction.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://djp1blgv3du8o" +path="res://.godot/imported/pipe-glass-large-junction.glb-561be9e236bd53af66bce20d6efbbad2.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/pipe-glass-large-junction.glb" +dest_files=["res://.godot/imported/pipe-glass-large-junction.glb-561be9e236bd53af66bce20d6efbbad2.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/pipe-glass-large-long.glb b/assets/third_party/kenney_factory_kit/pipe-glass-large-long.glb new file mode 100644 index 0000000..29e4f47 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/pipe-glass-large-long.glb differ diff --git a/assets/third_party/kenney_factory_kit/pipe-glass-large-long.glb.import b/assets/third_party/kenney_factory_kit/pipe-glass-large-long.glb.import new file mode 100644 index 0000000..a7fc4ba --- /dev/null +++ b/assets/third_party/kenney_factory_kit/pipe-glass-large-long.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://5u5phf703prq" +path="res://.godot/imported/pipe-glass-large-long.glb-12cf385142d32b67c2325b98cffdaabf.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/pipe-glass-large-long.glb" +dest_files=["res://.godot/imported/pipe-glass-large-long.glb-12cf385142d32b67c2325b98cffdaabf.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/pipe-glass-large-side.glb b/assets/third_party/kenney_factory_kit/pipe-glass-large-side.glb new file mode 100644 index 0000000..3a48e7b Binary files /dev/null and b/assets/third_party/kenney_factory_kit/pipe-glass-large-side.glb differ diff --git a/assets/third_party/kenney_factory_kit/pipe-glass-large-side.glb.import b/assets/third_party/kenney_factory_kit/pipe-glass-large-side.glb.import new file mode 100644 index 0000000..8503d13 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/pipe-glass-large-side.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://s5es8yvbjlyq" +path="res://.godot/imported/pipe-glass-large-side.glb-0c800fd8828a3d6cbb861d9ccade029d.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/pipe-glass-large-side.glb" +dest_files=["res://.godot/imported/pipe-glass-large-side.glb-0c800fd8828a3d6cbb861d9ccade029d.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/pipe-glass-large-valve.glb b/assets/third_party/kenney_factory_kit/pipe-glass-large-valve.glb new file mode 100644 index 0000000..6e7993f Binary files /dev/null and b/assets/third_party/kenney_factory_kit/pipe-glass-large-valve.glb differ diff --git a/assets/third_party/kenney_factory_kit/pipe-glass-large-valve.glb.import b/assets/third_party/kenney_factory_kit/pipe-glass-large-valve.glb.import new file mode 100644 index 0000000..bbe3b7e --- /dev/null +++ b/assets/third_party/kenney_factory_kit/pipe-glass-large-valve.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://3hw47nx5xrny" +path="res://.godot/imported/pipe-glass-large-valve.glb-8f084a247359422b1060231f1e2b1461.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/pipe-glass-large-valve.glb" +dest_files=["res://.godot/imported/pipe-glass-large-valve.glb-8f084a247359422b1060231f1e2b1461.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/pipe-glass-large.glb b/assets/third_party/kenney_factory_kit/pipe-glass-large.glb new file mode 100644 index 0000000..87c04c1 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/pipe-glass-large.glb differ diff --git a/assets/third_party/kenney_factory_kit/pipe-glass-large.glb.import b/assets/third_party/kenney_factory_kit/pipe-glass-large.glb.import new file mode 100644 index 0000000..b194a92 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/pipe-glass-large.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://br11yect2llc6" +path="res://.godot/imported/pipe-glass-large.glb-136cf097d19c7cfcb2b59dda4a84e178.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/pipe-glass-large.glb" +dest_files=["res://.godot/imported/pipe-glass-large.glb-136cf097d19c7cfcb2b59dda4a84e178.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/pipe-large-bend.glb b/assets/third_party/kenney_factory_kit/pipe-large-bend.glb new file mode 100644 index 0000000..3f6053f Binary files /dev/null and b/assets/third_party/kenney_factory_kit/pipe-large-bend.glb differ diff --git a/assets/third_party/kenney_factory_kit/pipe-large-bend.glb.import b/assets/third_party/kenney_factory_kit/pipe-large-bend.glb.import new file mode 100644 index 0000000..eaa90ed --- /dev/null +++ b/assets/third_party/kenney_factory_kit/pipe-large-bend.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bwnhakcrld4qf" +path="res://.godot/imported/pipe-large-bend.glb-9dbb30bc7c0ba4c2311dae6b59e980af.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/pipe-large-bend.glb" +dest_files=["res://.godot/imported/pipe-large-bend.glb-9dbb30bc7c0ba4c2311dae6b59e980af.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/pipe-large-bump.glb b/assets/third_party/kenney_factory_kit/pipe-large-bump.glb new file mode 100644 index 0000000..063287b Binary files /dev/null and b/assets/third_party/kenney_factory_kit/pipe-large-bump.glb differ diff --git a/assets/third_party/kenney_factory_kit/pipe-large-bump.glb.import b/assets/third_party/kenney_factory_kit/pipe-large-bump.glb.import new file mode 100644 index 0000000..214bddf --- /dev/null +++ b/assets/third_party/kenney_factory_kit/pipe-large-bump.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://rtjf5m4ejxfj" +path="res://.godot/imported/pipe-large-bump.glb-8f38bf5a379728c920706e7bfd339a45.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/pipe-large-bump.glb" +dest_files=["res://.godot/imported/pipe-large-bump.glb-8f38bf5a379728c920706e7bfd339a45.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/pipe-large-cross.glb b/assets/third_party/kenney_factory_kit/pipe-large-cross.glb new file mode 100644 index 0000000..8318880 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/pipe-large-cross.glb differ diff --git a/assets/third_party/kenney_factory_kit/pipe-large-cross.glb.import b/assets/third_party/kenney_factory_kit/pipe-large-cross.glb.import new file mode 100644 index 0000000..f6bd265 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/pipe-large-cross.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://70ltwarmb8dp" +path="res://.godot/imported/pipe-large-cross.glb-05cc6807f98f58209e037ad65c8dce4e.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/pipe-large-cross.glb" +dest_files=["res://.godot/imported/pipe-large-cross.glb-05cc6807f98f58209e037ad65c8dce4e.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/pipe-large-curve.glb b/assets/third_party/kenney_factory_kit/pipe-large-curve.glb new file mode 100644 index 0000000..a101449 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/pipe-large-curve.glb differ diff --git a/assets/third_party/kenney_factory_kit/pipe-large-curve.glb.import b/assets/third_party/kenney_factory_kit/pipe-large-curve.glb.import new file mode 100644 index 0000000..b2f65d4 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/pipe-large-curve.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cg4gntgvu0ygx" +path="res://.godot/imported/pipe-large-curve.glb-6eec998ea763533f987f3f80a9cdee34.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/pipe-large-curve.glb" +dest_files=["res://.godot/imported/pipe-large-curve.glb-6eec998ea763533f987f3f80a9cdee34.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/pipe-large-junction.glb b/assets/third_party/kenney_factory_kit/pipe-large-junction.glb new file mode 100644 index 0000000..a23240f Binary files /dev/null and b/assets/third_party/kenney_factory_kit/pipe-large-junction.glb differ diff --git a/assets/third_party/kenney_factory_kit/pipe-large-junction.glb.import b/assets/third_party/kenney_factory_kit/pipe-large-junction.glb.import new file mode 100644 index 0000000..081d2de --- /dev/null +++ b/assets/third_party/kenney_factory_kit/pipe-large-junction.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bhnoschrhlvci" +path="res://.godot/imported/pipe-large-junction.glb-013117f148abced9db0d317b61cd8ea7.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/pipe-large-junction.glb" +dest_files=["res://.godot/imported/pipe-large-junction.glb-013117f148abced9db0d317b61cd8ea7.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/pipe-large-long.glb b/assets/third_party/kenney_factory_kit/pipe-large-long.glb new file mode 100644 index 0000000..4a2b969 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/pipe-large-long.glb differ diff --git a/assets/third_party/kenney_factory_kit/pipe-large-long.glb.import b/assets/third_party/kenney_factory_kit/pipe-large-long.glb.import new file mode 100644 index 0000000..29f9fa0 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/pipe-large-long.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://jeh65q2g44xa" +path="res://.godot/imported/pipe-large-long.glb-8b67ac44d32361e8a8897a8cd9b1a771.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/pipe-large-long.glb" +dest_files=["res://.godot/imported/pipe-large-long.glb-8b67ac44d32361e8a8897a8cd9b1a771.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/pipe-large-side.glb b/assets/third_party/kenney_factory_kit/pipe-large-side.glb new file mode 100644 index 0000000..fa628ec Binary files /dev/null and b/assets/third_party/kenney_factory_kit/pipe-large-side.glb differ diff --git a/assets/third_party/kenney_factory_kit/pipe-large-side.glb.import b/assets/third_party/kenney_factory_kit/pipe-large-side.glb.import new file mode 100644 index 0000000..0474a9a --- /dev/null +++ b/assets/third_party/kenney_factory_kit/pipe-large-side.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://d1cyd8vmoc6ok" +path="res://.godot/imported/pipe-large-side.glb-aef6f004a0a96e39fba8867ebc0306b1.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/pipe-large-side.glb" +dest_files=["res://.godot/imported/pipe-large-side.glb-aef6f004a0a96e39fba8867ebc0306b1.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/pipe-large-valve.glb b/assets/third_party/kenney_factory_kit/pipe-large-valve.glb new file mode 100644 index 0000000..74bf566 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/pipe-large-valve.glb differ diff --git a/assets/third_party/kenney_factory_kit/pipe-large-valve.glb.import b/assets/third_party/kenney_factory_kit/pipe-large-valve.glb.import new file mode 100644 index 0000000..f42e077 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/pipe-large-valve.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bc5rjoygpdsxm" +path="res://.godot/imported/pipe-large-valve.glb-2731ca0cbd76ac7152c864a20adc069f.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/pipe-large-valve.glb" +dest_files=["res://.godot/imported/pipe-large-valve.glb-2731ca0cbd76ac7152c864a20adc069f.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/pipe-large.glb b/assets/third_party/kenney_factory_kit/pipe-large.glb new file mode 100644 index 0000000..24819b6 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/pipe-large.glb differ diff --git a/assets/third_party/kenney_factory_kit/pipe-large.glb.import b/assets/third_party/kenney_factory_kit/pipe-large.glb.import new file mode 100644 index 0000000..a5214d1 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/pipe-large.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://ct0wl1k68eyfp" +path="res://.godot/imported/pipe-large.glb-d523dec2cf821f4b98643d7ea6fff8fe.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/pipe-large.glb" +dest_files=["res://.godot/imported/pipe-large.glb-d523dec2cf821f4b98643d7ea6fff8fe.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/piston-round.glb b/assets/third_party/kenney_factory_kit/piston-round.glb new file mode 100644 index 0000000..9483b52 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/piston-round.glb differ diff --git a/assets/third_party/kenney_factory_kit/piston-round.glb.import b/assets/third_party/kenney_factory_kit/piston-round.glb.import new file mode 100644 index 0000000..2774b87 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/piston-round.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bppsxej4kbllm" +path="res://.godot/imported/piston-round.glb-787b7c52997a16c2ed26af784a6b5ca9.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/piston-round.glb" +dest_files=["res://.godot/imported/piston-round.glb-787b7c52997a16c2ed26af784a6b5ca9.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/piston-square.glb b/assets/third_party/kenney_factory_kit/piston-square.glb new file mode 100644 index 0000000..93ebc1b Binary files /dev/null and b/assets/third_party/kenney_factory_kit/piston-square.glb differ diff --git a/assets/third_party/kenney_factory_kit/piston-square.glb.import b/assets/third_party/kenney_factory_kit/piston-square.glb.import new file mode 100644 index 0000000..9d3ccc9 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/piston-square.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bj232prxtumbw" +path="res://.godot/imported/piston-square.glb-15134fde898e71b3ea18d617ef7424cd.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/piston-square.glb" +dest_files=["res://.godot/imported/piston-square.glb-15134fde898e71b3ea18d617ef7424cd.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/piston-thin-round.glb b/assets/third_party/kenney_factory_kit/piston-thin-round.glb new file mode 100644 index 0000000..aa8172f Binary files /dev/null and b/assets/third_party/kenney_factory_kit/piston-thin-round.glb differ diff --git a/assets/third_party/kenney_factory_kit/piston-thin-round.glb.import b/assets/third_party/kenney_factory_kit/piston-thin-round.glb.import new file mode 100644 index 0000000..174937b --- /dev/null +++ b/assets/third_party/kenney_factory_kit/piston-thin-round.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cv4jqm13xhg6b" +path="res://.godot/imported/piston-thin-round.glb-9b12009ea306b94438066ee1158b8d98.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/piston-thin-round.glb" +dest_files=["res://.godot/imported/piston-thin-round.glb-9b12009ea306b94438066ee1158b8d98.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/piston-thin-square.glb b/assets/third_party/kenney_factory_kit/piston-thin-square.glb new file mode 100644 index 0000000..8201297 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/piston-thin-square.glb differ diff --git a/assets/third_party/kenney_factory_kit/piston-thin-square.glb.import b/assets/third_party/kenney_factory_kit/piston-thin-square.glb.import new file mode 100644 index 0000000..e42f9fe --- /dev/null +++ b/assets/third_party/kenney_factory_kit/piston-thin-square.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cfd06rgjdkn2y" +path="res://.godot/imported/piston-thin-square.glb-ba441fe004a0ceb8c77d45c12294f5f6.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/piston-thin-square.glb" +dest_files=["res://.godot/imported/piston-thin-square.glb-ba441fe004a0ceb8c77d45c12294f5f6.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/robot-arm-a.glb b/assets/third_party/kenney_factory_kit/robot-arm-a.glb new file mode 100644 index 0000000..e29bd8d Binary files /dev/null and b/assets/third_party/kenney_factory_kit/robot-arm-a.glb differ diff --git a/assets/third_party/kenney_factory_kit/robot-arm-a.glb.import b/assets/third_party/kenney_factory_kit/robot-arm-a.glb.import new file mode 100644 index 0000000..02db46d --- /dev/null +++ b/assets/third_party/kenney_factory_kit/robot-arm-a.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bioj3anb4qiw8" +path="res://.godot/imported/robot-arm-a.glb-dd6a6128652117e6ff9f7d9c0fb85aaf.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/robot-arm-a.glb" +dest_files=["res://.godot/imported/robot-arm-a.glb-dd6a6128652117e6ff9f7d9c0fb85aaf.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/robot-arm-b.glb b/assets/third_party/kenney_factory_kit/robot-arm-b.glb new file mode 100644 index 0000000..f102f2d Binary files /dev/null and b/assets/third_party/kenney_factory_kit/robot-arm-b.glb differ diff --git a/assets/third_party/kenney_factory_kit/robot-arm-b.glb.import b/assets/third_party/kenney_factory_kit/robot-arm-b.glb.import new file mode 100644 index 0000000..edff008 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/robot-arm-b.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c5dnjwiidb47c" +path="res://.godot/imported/robot-arm-b.glb-79d19a700802c6a7e8456d9f5e10f8cb.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/robot-arm-b.glb" +dest_files=["res://.godot/imported/robot-arm-b.glb-79d19a700802c6a7e8456d9f5e10f8cb.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/scanner-high.glb b/assets/third_party/kenney_factory_kit/scanner-high.glb new file mode 100644 index 0000000..0c4f102 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/scanner-high.glb differ diff --git a/assets/third_party/kenney_factory_kit/scanner-high.glb.import b/assets/third_party/kenney_factory_kit/scanner-high.glb.import new file mode 100644 index 0000000..237635c --- /dev/null +++ b/assets/third_party/kenney_factory_kit/scanner-high.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c077f6srk6bhm" +path="res://.godot/imported/scanner-high.glb-a411910ae551a4f333a1dc13fd873f8e.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/scanner-high.glb" +dest_files=["res://.godot/imported/scanner-high.glb-a411910ae551a4f333a1dc13fd873f8e.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/scanner-low.glb b/assets/third_party/kenney_factory_kit/scanner-low.glb new file mode 100644 index 0000000..b7171e0 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/scanner-low.glb differ diff --git a/assets/third_party/kenney_factory_kit/scanner-low.glb.import b/assets/third_party/kenney_factory_kit/scanner-low.glb.import new file mode 100644 index 0000000..7ccc936 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/scanner-low.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://2au26mqpsv1w" +path="res://.godot/imported/scanner-low.glb-96854976a9c501fe98a260ce1651f5b2.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/scanner-low.glb" +dest_files=["res://.godot/imported/scanner-low.glb-96854976a9c501fe98a260ce1651f5b2.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/screen-flat.glb b/assets/third_party/kenney_factory_kit/screen-flat.glb new file mode 100644 index 0000000..58e6850 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/screen-flat.glb differ diff --git a/assets/third_party/kenney_factory_kit/screen-flat.glb.import b/assets/third_party/kenney_factory_kit/screen-flat.glb.import new file mode 100644 index 0000000..377b09c --- /dev/null +++ b/assets/third_party/kenney_factory_kit/screen-flat.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://ccufilswj7i7g" +path="res://.godot/imported/screen-flat.glb-a0441b478e745055383051b3e7672553.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/screen-flat.glb" +dest_files=["res://.godot/imported/screen-flat.glb-a0441b478e745055383051b3e7672553.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/screen-hanging-small.glb b/assets/third_party/kenney_factory_kit/screen-hanging-small.glb new file mode 100644 index 0000000..26bf836 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/screen-hanging-small.glb differ diff --git a/assets/third_party/kenney_factory_kit/screen-hanging-small.glb.import b/assets/third_party/kenney_factory_kit/screen-hanging-small.glb.import new file mode 100644 index 0000000..4df9470 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/screen-hanging-small.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://daml1jmd2q240" +path="res://.godot/imported/screen-hanging-small.glb-caaf0b518ebe58310e8cfd1266a3dac4.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/screen-hanging-small.glb" +dest_files=["res://.godot/imported/screen-hanging-small.glb-caaf0b518ebe58310e8cfd1266a3dac4.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/screen-hanging-wide.glb b/assets/third_party/kenney_factory_kit/screen-hanging-wide.glb new file mode 100644 index 0000000..c6ec9ba Binary files /dev/null and b/assets/third_party/kenney_factory_kit/screen-hanging-wide.glb differ diff --git a/assets/third_party/kenney_factory_kit/screen-hanging-wide.glb.import b/assets/third_party/kenney_factory_kit/screen-hanging-wide.glb.import new file mode 100644 index 0000000..5476cce --- /dev/null +++ b/assets/third_party/kenney_factory_kit/screen-hanging-wide.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dp6kh2f0twxl6" +path="res://.godot/imported/screen-hanging-wide.glb-95070d11b03d1e8eeb24db194ed621e3.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/screen-hanging-wide.glb" +dest_files=["res://.godot/imported/screen-hanging-wide.glb-95070d11b03d1e8eeb24db194ed621e3.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/screen-panel-flat.glb b/assets/third_party/kenney_factory_kit/screen-panel-flat.glb new file mode 100644 index 0000000..b100b82 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/screen-panel-flat.glb differ diff --git a/assets/third_party/kenney_factory_kit/screen-panel-flat.glb.import b/assets/third_party/kenney_factory_kit/screen-panel-flat.glb.import new file mode 100644 index 0000000..29e0484 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/screen-panel-flat.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bsfln2n5l7wld" +path="res://.godot/imported/screen-panel-flat.glb-0f7d725fe5872984bade783af583c973.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/screen-panel-flat.glb" +dest_files=["res://.godot/imported/screen-panel-flat.glb-0f7d725fe5872984bade783af583c973.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/screen-panel-small.glb b/assets/third_party/kenney_factory_kit/screen-panel-small.glb new file mode 100644 index 0000000..d5fcd5b Binary files /dev/null and b/assets/third_party/kenney_factory_kit/screen-panel-small.glb differ diff --git a/assets/third_party/kenney_factory_kit/screen-panel-small.glb.import b/assets/third_party/kenney_factory_kit/screen-panel-small.glb.import new file mode 100644 index 0000000..ec0bac7 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/screen-panel-small.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dybub7rrx5p3m" +path="res://.godot/imported/screen-panel-small.glb-d6ee21722eb9f93c0e18651fe4352ec1.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/screen-panel-small.glb" +dest_files=["res://.godot/imported/screen-panel-small.glb-d6ee21722eb9f93c0e18651fe4352ec1.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/screen-panel-wide.glb b/assets/third_party/kenney_factory_kit/screen-panel-wide.glb new file mode 100644 index 0000000..e3bbb08 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/screen-panel-wide.glb differ diff --git a/assets/third_party/kenney_factory_kit/screen-panel-wide.glb.import b/assets/third_party/kenney_factory_kit/screen-panel-wide.glb.import new file mode 100644 index 0000000..8e64b1e --- /dev/null +++ b/assets/third_party/kenney_factory_kit/screen-panel-wide.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dwwm7ca2cd4ij" +path="res://.godot/imported/screen-panel-wide.glb-182599550ef168683bd6d5a684a475aa.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/screen-panel-wide.glb" +dest_files=["res://.godot/imported/screen-panel-wide.glb-182599550ef168683bd6d5a684a475aa.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/screen-small.glb b/assets/third_party/kenney_factory_kit/screen-small.glb new file mode 100644 index 0000000..761da9f Binary files /dev/null and b/assets/third_party/kenney_factory_kit/screen-small.glb differ diff --git a/assets/third_party/kenney_factory_kit/screen-small.glb.import b/assets/third_party/kenney_factory_kit/screen-small.glb.import new file mode 100644 index 0000000..8627368 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/screen-small.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://5p0c32tlpgl" +path="res://.godot/imported/screen-small.glb-dc605b1055ff3a69ae6fb11b996109d9.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/screen-small.glb" +dest_files=["res://.godot/imported/screen-small.glb-dc605b1055ff3a69ae6fb11b996109d9.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/screen-wide.glb b/assets/third_party/kenney_factory_kit/screen-wide.glb new file mode 100644 index 0000000..968a970 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/screen-wide.glb differ diff --git a/assets/third_party/kenney_factory_kit/screen-wide.glb.import b/assets/third_party/kenney_factory_kit/screen-wide.glb.import new file mode 100644 index 0000000..74347fa --- /dev/null +++ b/assets/third_party/kenney_factory_kit/screen-wide.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://40korymqono" +path="res://.godot/imported/screen-wide.glb-0b0bb5e4b7594e74a1487ff98d99777e.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/screen-wide.glb" +dest_files=["res://.godot/imported/screen-wide.glb-0b0bb5e4b7594e74a1487ff98d99777e.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/structure-corner-inner.glb b/assets/third_party/kenney_factory_kit/structure-corner-inner.glb new file mode 100644 index 0000000..e092208 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/structure-corner-inner.glb differ diff --git a/assets/third_party/kenney_factory_kit/structure-corner-inner.glb.import b/assets/third_party/kenney_factory_kit/structure-corner-inner.glb.import new file mode 100644 index 0000000..1cb6594 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/structure-corner-inner.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://m71y38b7yerw" +path="res://.godot/imported/structure-corner-inner.glb-81783671107b3e87c80b7c5162acad9c.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/structure-corner-inner.glb" +dest_files=["res://.godot/imported/structure-corner-inner.glb-81783671107b3e87c80b7c5162acad9c.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/structure-corner-outer.glb b/assets/third_party/kenney_factory_kit/structure-corner-outer.glb new file mode 100644 index 0000000..bdf1ce2 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/structure-corner-outer.glb differ diff --git a/assets/third_party/kenney_factory_kit/structure-corner-outer.glb.import b/assets/third_party/kenney_factory_kit/structure-corner-outer.glb.import new file mode 100644 index 0000000..b61075f --- /dev/null +++ b/assets/third_party/kenney_factory_kit/structure-corner-outer.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bodrplym7sxkl" +path="res://.godot/imported/structure-corner-outer.glb-d51837647e6f4207bee4b6b36bc7be9d.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/structure-corner-outer.glb" +dest_files=["res://.godot/imported/structure-corner-outer.glb-d51837647e6f4207bee4b6b36bc7be9d.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/structure-doorway-wide.glb b/assets/third_party/kenney_factory_kit/structure-doorway-wide.glb new file mode 100644 index 0000000..94f7948 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/structure-doorway-wide.glb differ diff --git a/assets/third_party/kenney_factory_kit/structure-doorway-wide.glb.import b/assets/third_party/kenney_factory_kit/structure-doorway-wide.glb.import new file mode 100644 index 0000000..6f9aa71 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/structure-doorway-wide.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bh14ncsqkpf04" +path="res://.godot/imported/structure-doorway-wide.glb-91b572d74d201ae73a85de20cdd28a3e.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/structure-doorway-wide.glb" +dest_files=["res://.godot/imported/structure-doorway-wide.glb-91b572d74d201ae73a85de20cdd28a3e.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/structure-doorway.glb b/assets/third_party/kenney_factory_kit/structure-doorway.glb new file mode 100644 index 0000000..78c49f9 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/structure-doorway.glb differ diff --git a/assets/third_party/kenney_factory_kit/structure-doorway.glb.import b/assets/third_party/kenney_factory_kit/structure-doorway.glb.import new file mode 100644 index 0000000..2ec06c3 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/structure-doorway.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://b3yta26ubcayh" +path="res://.godot/imported/structure-doorway.glb-beddf5090df3b3da9908a89424578dfd.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/structure-doorway.glb" +dest_files=["res://.godot/imported/structure-doorway.glb-beddf5090df3b3da9908a89424578dfd.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/structure-high.glb b/assets/third_party/kenney_factory_kit/structure-high.glb new file mode 100644 index 0000000..8142368 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/structure-high.glb differ diff --git a/assets/third_party/kenney_factory_kit/structure-high.glb.import b/assets/third_party/kenney_factory_kit/structure-high.glb.import new file mode 100644 index 0000000..0ccd84a --- /dev/null +++ b/assets/third_party/kenney_factory_kit/structure-high.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c7qaisjlgyuj" +path="res://.godot/imported/structure-high.glb-90512b6244a605184dc117258ba1a9b7.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/structure-high.glb" +dest_files=["res://.godot/imported/structure-high.glb-90512b6244a605184dc117258ba1a9b7.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/structure-medium.glb b/assets/third_party/kenney_factory_kit/structure-medium.glb new file mode 100644 index 0000000..95f6377 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/structure-medium.glb differ diff --git a/assets/third_party/kenney_factory_kit/structure-medium.glb.import b/assets/third_party/kenney_factory_kit/structure-medium.glb.import new file mode 100644 index 0000000..e51063f --- /dev/null +++ b/assets/third_party/kenney_factory_kit/structure-medium.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://ietmbh3eclp3" +path="res://.godot/imported/structure-medium.glb-99f44e3cf85c34b481ff1550e7910556.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/structure-medium.glb" +dest_files=["res://.godot/imported/structure-medium.glb-99f44e3cf85c34b481ff1550e7910556.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/structure-short.glb b/assets/third_party/kenney_factory_kit/structure-short.glb new file mode 100644 index 0000000..f3b05ac Binary files /dev/null and b/assets/third_party/kenney_factory_kit/structure-short.glb differ diff --git a/assets/third_party/kenney_factory_kit/structure-short.glb.import b/assets/third_party/kenney_factory_kit/structure-short.glb.import new file mode 100644 index 0000000..6cc201a --- /dev/null +++ b/assets/third_party/kenney_factory_kit/structure-short.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://iht164x6462u" +path="res://.godot/imported/structure-short.glb-bec36e9c6b009b01a18359092254726b.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/structure-short.glb" +dest_files=["res://.godot/imported/structure-short.glb-bec36e9c6b009b01a18359092254726b.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/structure-tall.glb b/assets/third_party/kenney_factory_kit/structure-tall.glb new file mode 100644 index 0000000..5e7b273 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/structure-tall.glb differ diff --git a/assets/third_party/kenney_factory_kit/structure-tall.glb.import b/assets/third_party/kenney_factory_kit/structure-tall.glb.import new file mode 100644 index 0000000..0c221ac --- /dev/null +++ b/assets/third_party/kenney_factory_kit/structure-tall.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://n8myttljhe0k" +path="res://.godot/imported/structure-tall.glb-9a13e570c20fcd6a048d35a4217b4650.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/structure-tall.glb" +dest_files=["res://.godot/imported/structure-tall.glb-9a13e570c20fcd6a048d35a4217b4650.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/structure-wall.glb b/assets/third_party/kenney_factory_kit/structure-wall.glb new file mode 100644 index 0000000..1a07544 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/structure-wall.glb differ diff --git a/assets/third_party/kenney_factory_kit/structure-wall.glb.import b/assets/third_party/kenney_factory_kit/structure-wall.glb.import new file mode 100644 index 0000000..8c32465 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/structure-wall.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dj11jp57ri2ke" +path="res://.godot/imported/structure-wall.glb-7ee3a03da1a659a03ae676ae1db68c58.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/structure-wall.glb" +dest_files=["res://.godot/imported/structure-wall.glb-7ee3a03da1a659a03ae676ae1db68c58.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/structure-window-wide.glb b/assets/third_party/kenney_factory_kit/structure-window-wide.glb new file mode 100644 index 0000000..a25922d Binary files /dev/null and b/assets/third_party/kenney_factory_kit/structure-window-wide.glb differ diff --git a/assets/third_party/kenney_factory_kit/structure-window-wide.glb.import b/assets/third_party/kenney_factory_kit/structure-window-wide.glb.import new file mode 100644 index 0000000..32466b2 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/structure-window-wide.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c8t1vsrnnky3m" +path="res://.godot/imported/structure-window-wide.glb-9cc982db19dced756f85289de81040e7.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/structure-window-wide.glb" +dest_files=["res://.godot/imported/structure-window-wide.glb-9cc982db19dced756f85289de81040e7.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/structure-window.glb b/assets/third_party/kenney_factory_kit/structure-window.glb new file mode 100644 index 0000000..a004cf1 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/structure-window.glb differ diff --git a/assets/third_party/kenney_factory_kit/structure-window.glb.import b/assets/third_party/kenney_factory_kit/structure-window.glb.import new file mode 100644 index 0000000..af8a40c --- /dev/null +++ b/assets/third_party/kenney_factory_kit/structure-window.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bbwjcprnllby8" +path="res://.godot/imported/structure-window.glb-5ce00ac4d28ea70c3caccf618a8a79b3.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/structure-window.glb" +dest_files=["res://.godot/imported/structure-window.glb-5ce00ac4d28ea70c3caccf618a8a79b3.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/structure-yellow-high.glb b/assets/third_party/kenney_factory_kit/structure-yellow-high.glb new file mode 100644 index 0000000..53f6ebe Binary files /dev/null and b/assets/third_party/kenney_factory_kit/structure-yellow-high.glb differ diff --git a/assets/third_party/kenney_factory_kit/structure-yellow-high.glb.import b/assets/third_party/kenney_factory_kit/structure-yellow-high.glb.import new file mode 100644 index 0000000..09b7d15 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/structure-yellow-high.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://ci8gyvp3ltubd" +path="res://.godot/imported/structure-yellow-high.glb-efa5849a170ab6664c901a78e60761c7.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/structure-yellow-high.glb" +dest_files=["res://.godot/imported/structure-yellow-high.glb-efa5849a170ab6664c901a78e60761c7.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/structure-yellow-medium.glb b/assets/third_party/kenney_factory_kit/structure-yellow-medium.glb new file mode 100644 index 0000000..787302a Binary files /dev/null and b/assets/third_party/kenney_factory_kit/structure-yellow-medium.glb differ diff --git a/assets/third_party/kenney_factory_kit/structure-yellow-medium.glb.import b/assets/third_party/kenney_factory_kit/structure-yellow-medium.glb.import new file mode 100644 index 0000000..db667f4 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/structure-yellow-medium.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://b0fk2e82g6d18" +path="res://.godot/imported/structure-yellow-medium.glb-6f67a3341a93d9b44717bdf1479ca1c2.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/structure-yellow-medium.glb" +dest_files=["res://.godot/imported/structure-yellow-medium.glb-6f67a3341a93d9b44717bdf1479ca1c2.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/structure-yellow-short.glb b/assets/third_party/kenney_factory_kit/structure-yellow-short.glb new file mode 100644 index 0000000..37c3d38 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/structure-yellow-short.glb differ diff --git a/assets/third_party/kenney_factory_kit/structure-yellow-short.glb.import b/assets/third_party/kenney_factory_kit/structure-yellow-short.glb.import new file mode 100644 index 0000000..9e86c41 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/structure-yellow-short.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://db4pdus81f43l" +path="res://.godot/imported/structure-yellow-short.glb-11cf231c9d8c38c0304ca590eb3ccdaa.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/structure-yellow-short.glb" +dest_files=["res://.godot/imported/structure-yellow-short.glb-11cf231c9d8c38c0304ca590eb3ccdaa.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/structure-yellow-tall.glb b/assets/third_party/kenney_factory_kit/structure-yellow-tall.glb new file mode 100644 index 0000000..bb6a079 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/structure-yellow-tall.glb differ diff --git a/assets/third_party/kenney_factory_kit/structure-yellow-tall.glb.import b/assets/third_party/kenney_factory_kit/structure-yellow-tall.glb.import new file mode 100644 index 0000000..0baa9a7 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/structure-yellow-tall.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dllm1wlkln504" +path="res://.godot/imported/structure-yellow-tall.glb-2ff6c47c48bea75c1c8abae629ef9835.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/structure-yellow-tall.glb" +dest_files=["res://.godot/imported/structure-yellow-tall.glb-2ff6c47c48bea75c1c8abae629ef9835.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/top-large-checkerboard.glb b/assets/third_party/kenney_factory_kit/top-large-checkerboard.glb new file mode 100644 index 0000000..11471d0 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/top-large-checkerboard.glb differ diff --git a/assets/third_party/kenney_factory_kit/top-large-checkerboard.glb.import b/assets/third_party/kenney_factory_kit/top-large-checkerboard.glb.import new file mode 100644 index 0000000..a7f0e7d --- /dev/null +++ b/assets/third_party/kenney_factory_kit/top-large-checkerboard.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bquq6na5rc60j" +path="res://.godot/imported/top-large-checkerboard.glb-bc77f84db9a3514a68a14d60bfd26291.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/top-large-checkerboard.glb" +dest_files=["res://.godot/imported/top-large-checkerboard.glb-bc77f84db9a3514a68a14d60bfd26291.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/top-large.glb b/assets/third_party/kenney_factory_kit/top-large.glb new file mode 100644 index 0000000..149d791 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/top-large.glb differ diff --git a/assets/third_party/kenney_factory_kit/top-large.glb.import b/assets/third_party/kenney_factory_kit/top-large.glb.import new file mode 100644 index 0000000..d839862 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/top-large.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dmu6k8ox8c7cd" +path="res://.godot/imported/top-large.glb-1828ce0f25cff5be0e8007b7bbb95618.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/top-large.glb" +dest_files=["res://.godot/imported/top-large.glb-1828ce0f25cff5be0e8007b7bbb95618.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/top.glb b/assets/third_party/kenney_factory_kit/top.glb new file mode 100644 index 0000000..fc53f2c Binary files /dev/null and b/assets/third_party/kenney_factory_kit/top.glb differ diff --git a/assets/third_party/kenney_factory_kit/top.glb.import b/assets/third_party/kenney_factory_kit/top.glb.import new file mode 100644 index 0000000..287a4ab --- /dev/null +++ b/assets/third_party/kenney_factory_kit/top.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cvreyufs2kupj" +path="res://.godot/imported/top.glb-5be6c2ce60fc91d0d71fdec089316abb.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/top.glb" +dest_files=["res://.godot/imported/top.glb-5be6c2ce60fc91d0d71fdec089316abb.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/warning-orange.glb b/assets/third_party/kenney_factory_kit/warning-orange.glb new file mode 100644 index 0000000..e89225a Binary files /dev/null and b/assets/third_party/kenney_factory_kit/warning-orange.glb differ diff --git a/assets/third_party/kenney_factory_kit/warning-orange.glb.import b/assets/third_party/kenney_factory_kit/warning-orange.glb.import new file mode 100644 index 0000000..98c4858 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/warning-orange.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dr286einmdy0l" +path="res://.godot/imported/warning-orange.glb-f1c525822ad73a4bd0a2b46cf2b24a0e.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/warning-orange.glb" +dest_files=["res://.godot/imported/warning-orange.glb-f1c525822ad73a4bd0a2b46cf2b24a0e.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/third_party/kenney_factory_kit/warning-traffic.glb b/assets/third_party/kenney_factory_kit/warning-traffic.glb new file mode 100644 index 0000000..64b5da3 Binary files /dev/null and b/assets/third_party/kenney_factory_kit/warning-traffic.glb differ diff --git a/assets/third_party/kenney_factory_kit/warning-traffic.glb.import b/assets/third_party/kenney_factory_kit/warning-traffic.glb.import new file mode 100644 index 0000000..2f93950 --- /dev/null +++ b/assets/third_party/kenney_factory_kit/warning-traffic.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dufi47opa1q85" +path="res://.godot/imported/warning-traffic.glb-5318cf89bdd744daf48fc6084c454644.scn" + +[deps] + +source_file="res://assets/third_party/kenney_factory_kit/warning-traffic.glb" +dest_files=["res://.godot/imported/warning-traffic.glb-5318cf89bdd744daf48fc6084c454644.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/data/art-catalog.json b/data/art-catalog.json new file mode 100644 index 0000000..e822617 --- /dev/null +++ b/data/art-catalog.json @@ -0,0 +1,832 @@ +{ + "schemaVersion": 1, + "title": "魔力工坊原创美术目录", + "revision": "0.3.0", + "style": "assets/generated/STYLE.md", + "replaces": "Kenney Factory Kit 3.0 in the playable demo", + "items": [ + { + "id": "star_iron_ore", + "name": "星铁矿", + "category": "raw", + "stage": "t0", + "biome": "old_kingdom", + "icon": "assets/generated/icons/items/star_iron_ore.png", + "render": "assets/generated/renders/items/star_iron_ore.png" + }, + { + "id": "star_iron_ingot", + "name": "星铁锭", + "category": "material", + "stage": "t0", + "biome": "old_kingdom", + "icon": "assets/generated/icons/items/star_iron_ingot.png", + "render": "assets/generated/renders/items/star_iron_ingot.png" + }, + { + "id": "rune_clay", + "name": "符文黏土", + "category": "raw", + "stage": "t0", + "biome": "old_kingdom", + "icon": "assets/generated/icons/items/rune_clay.png", + "render": "assets/generated/renders/items/rune_clay.png" + }, + { + "id": "raw_mana_crystal", + "name": "粗魔晶", + "category": "raw", + "stage": "t0", + "biome": "old_kingdom", + "icon": "assets/generated/icons/items/raw_mana_crystal.png", + "render": "assets/generated/renders/items/raw_mana_crystal.png" + }, + { + "id": "awakened_crystal", + "name": "醒魔晶", + "category": "material", + "stage": "t0", + "biome": "old_kingdom", + "icon": "assets/generated/icons/items/awakened_crystal.png", + "render": "assets/generated/renders/items/awakened_crystal.png" + }, + { + "id": "ley_water", + "name": "地脉水", + "category": "fluid", + "stage": "t0", + "biome": "old_kingdom", + "icon": "assets/generated/icons/items/ley_water.png", + "render": "assets/generated/renders/items/ley_water.png" + }, + { + "id": "blank_tablet", + "name": "空白论证板", + "category": "component", + "stage": "t0", + "biome": "old_kingdom", + "icon": "assets/generated/icons/items/blank_tablet.png", + "render": "assets/generated/renders/items/blank_tablet.png" + }, + { + "id": "dawn_rune", + "name": "曙相符文", + "category": "component", + "stage": "t0", + "biome": "old_kingdom", + "icon": "assets/generated/icons/items/dawn_rune.png", + "render": "assets/generated/renders/items/dawn_rune.png" + }, + { + "id": "tide_rune", + "name": "潮相符文", + "category": "component", + "stage": "t0", + "biome": "old_kingdom", + "icon": "assets/generated/icons/items/tide_rune.png", + "render": "assets/generated/renders/items/tide_rune.png" + }, + { + "id": "dusk_rune", + "name": "暮相符文", + "category": "component", + "stage": "t0", + "biome": "old_kingdom", + "icon": "assets/generated/icons/items/dusk_rune.png", + "render": "assets/generated/renders/items/dusk_rune.png" + }, + { + "id": "inscription_proof", + "name": "刻印论证 K", + "category": "proof", + "stage": "t1", + "biome": "old_kingdom", + "icon": "assets/generated/icons/items/inscription_proof.png", + "render": "assets/generated/renders/items/inscription_proof.png" + }, + { + "id": "true_name_thread", + "name": "真名丝", + "category": "component", + "stage": "t1", + "biome": "old_kingdom", + "icon": "assets/generated/icons/items/true_name_thread.png", + "render": "assets/generated/renders/items/true_name_thread.png" + }, + { + "id": "clay_core", + "name": "黏土役偶核", + "category": "component", + "stage": "t1", + "biome": "old_kingdom", + "icon": "assets/generated/icons/items/clay_core.png", + "render": "assets/generated/renders/items/clay_core.png" + }, + { + "id": "clay_construct", + "name": "黏土役偶", + "category": "construct", + "stage": "t1", + "biome": "old_kingdom", + "icon": "assets/generated/icons/items/clay_construct.png", + "render": "assets/generated/renders/items/clay_construct.png" + }, + { + "id": "wild_proof_seed", + "name": "野生论证种", + "category": "raw", + "stage": "t2_life", + "biome": "verdant_forest", + "icon": "assets/generated/icons/items/wild_proof_seed.png", + "render": "assets/generated/renders/items/wild_proof_seed.png" + }, + { + "id": "proof_seed", + "name": "论证种", + "category": "catalyst", + "stage": "t2_life", + "biome": "verdant_forest", + "icon": "assets/generated/icons/items/proof_seed.png", + "render": "assets/generated/renders/items/proof_seed.png" + }, + { + "id": "mature_proof_seed", + "name": "成熟论证种", + "category": "state", + "stage": "t2_life", + "biome": "verdant_forest", + "icon": "assets/generated/icons/items/mature_proof_seed.png", + "render": "assets/generated/renders/items/mature_proof_seed.png" + }, + { + "id": "living_wood", + "name": "活木", + "category": "material", + "stage": "t2_life", + "biome": "verdant_forest", + "icon": "assets/generated/icons/items/living_wood.png", + "render": "assets/generated/renders/items/living_wood.png" + }, + { + "id": "fairy_dew", + "name": "妖精露", + "category": "fluid", + "stage": "t2_life", + "biome": "verdant_forest", + "icon": "assets/generated/icons/items/fairy_dew.png", + "render": "assets/generated/renders/items/fairy_dew.png" + }, + { + "id": "root_fiber", + "name": "根脉纤维", + "category": "component", + "stage": "t2_life", + "biome": "verdant_forest", + "icon": "assets/generated/icons/items/root_fiber.png", + "render": "assets/generated/renders/items/root_fiber.png" + }, + { + "id": "life_proof", + "name": "生机论证 L", + "category": "proof", + "stage": "t2_life", + "biome": "verdant_forest", + "icon": "assets/generated/icons/items/life_proof.png", + "render": "assets/generated/renders/items/life_proof.png" + }, + { + "id": "blight", + "name": "枯萎块", + "category": "byproduct", + "stage": "t2_life", + "biome": "verdant_forest", + "icon": "assets/generated/icons/items/blight.png", + "render": "assets/generated/renders/items/blight.png" + }, + { + "id": "life_anchor_core", + "name": "生命锚核", + "category": "ritual", + "stage": "t2_life", + "biome": "verdant_forest", + "icon": "assets/generated/icons/items/life_anchor_core.png", + "render": "assets/generated/renders/items/life_anchor_core.png" + }, + { + "id": "soul_ember", + "name": "游荡灵火", + "category": "raw", + "stage": "t2_death", + "biome": "silent_dead", + "icon": "assets/generated/icons/items/soul_ember.png", + "render": "assets/generated/renders/items/soul_ember.png" + }, + { + "id": "memory_blank", + "name": "记忆坯", + "category": "component", + "stage": "t2_death", + "biome": "silent_dead", + "icon": "assets/generated/icons/items/memory_blank.png", + "render": "assets/generated/renders/items/memory_blank.png" + }, + { + "id": "faded_memory", + "name": "褪色记忆", + "category": "state", + "stage": "t2_death", + "biome": "silent_dead", + "icon": "assets/generated/icons/items/faded_memory.png", + "render": "assets/generated/renders/items/faded_memory.png" + }, + { + "id": "bone_dust", + "name": "骨尘", + "category": "byproduct", + "stage": "t2_death", + "biome": "silent_dead", + "icon": "assets/generated/icons/items/bone_dust.png", + "render": "assets/generated/renders/items/bone_dust.png" + }, + { + "id": "recovered_memory", + "name": "亡者记忆", + "category": "material", + "stage": "t2_death", + "biome": "silent_dead", + "icon": "assets/generated/icons/items/recovered_memory.png", + "render": "assets/generated/renders/items/recovered_memory.png" + }, + { + "id": "death_proof", + "name": "幽冥论证 D", + "category": "proof", + "stage": "t2_death", + "biome": "silent_dead", + "icon": "assets/generated/icons/items/death_proof.png", + "render": "assets/generated/renders/items/death_proof.png" + }, + { + "id": "death_anchor_core", + "name": "亡者锚核", + "category": "ritual", + "stage": "t2_death", + "biome": "silent_dead", + "icon": "assets/generated/icons/items/death_anchor_core.png", + "render": "assets/generated/renders/items/death_anchor_core.png" + }, + { + "id": "twilight_reagent", + "name": "暮光合剂", + "category": "fluid", + "stage": "t3", + "biome": "ember_wastes", + "icon": "assets/generated/icons/items/twilight_reagent.png", + "render": "assets/generated/renders/items/twilight_reagent.png" + }, + { + "id": "refractory_coating", + "name": "焚风护层", + "category": "component", + "stage": "t3", + "biome": "ember_wastes", + "icon": "assets/generated/icons/items/refractory_coating.png", + "render": "assets/generated/renders/items/refractory_coating.png" + }, + { + "id": "phase_medium", + "name": "炼相介质", + "category": "material", + "stage": "t3", + "biome": "ember_wastes", + "icon": "assets/generated/icons/items/phase_medium.png", + "render": "assets/generated/renders/items/phase_medium.png" + }, + { + "id": "cold_phase_medium", + "name": "低温炼相介质", + "category": "state", + "stage": "t3", + "biome": "ember_wastes", + "icon": "assets/generated/icons/items/cold_phase_medium.png", + "render": "assets/generated/renders/items/cold_phase_medium.png" + }, + { + "id": "molten_phase_medium", + "name": "熔融炼相介质", + "category": "state", + "stage": "t3", + "biome": "ember_wastes", + "icon": "assets/generated/icons/items/molten_phase_medium.png", + "render": "assets/generated/renders/items/molten_phase_medium.png" + }, + { + "id": "charged_phase_medium", + "name": "充能炼相介质", + "category": "state", + "stage": "t3", + "biome": "ember_wastes", + "icon": "assets/generated/icons/items/charged_phase_medium.png", + "render": "assets/generated/renders/items/charged_phase_medium.png" + }, + { + "id": "elemental_proof", + "name": "元素论证 E", + "category": "proof", + "stage": "t3", + "biome": "ember_wastes", + "icon": "assets/generated/icons/items/elemental_proof.png", + "render": "assets/generated/renders/items/elemental_proof.png" + }, + { + "id": "slag", + "name": "炼相熔渣", + "category": "byproduct", + "stage": "t3", + "biome": "ember_wastes", + "icon": "assets/generated/icons/items/slag.png", + "render": "assets/generated/renders/items/slag.png" + }, + { + "id": "dragon_glass", + "name": "龙玻璃", + "category": "material", + "stage": "t3", + "biome": "ember_wastes", + "icon": "assets/generated/icons/items/dragon_glass.png", + "render": "assets/generated/renders/items/dragon_glass.png" + }, + { + "id": "ember_core", + "name": "熔火核心", + "category": "ritual", + "stage": "t3", + "biome": "ember_wastes", + "icon": "assets/generated/icons/items/ember_core.png", + "render": "assets/generated/renders/items/ember_core.png" + }, + { + "id": "name_strip_blank", + "name": "空白真名试片", + "category": "component", + "stage": "t4", + "biome": "mirror_marsh", + "icon": "assets/generated/icons/items/name_strip_blank.png", + "render": "assets/generated/renders/items/name_strip_blank.png" + }, + { + "id": "named_test_strip", + "name": "命名试片", + "category": "catalyst", + "stage": "t4", + "biome": "mirror_marsh", + "icon": "assets/generated/icons/items/named_test_strip.png", + "render": "assets/generated/renders/items/named_test_strip.png" + }, + { + "id": "returned_test_strip", + "name": "归返试片", + "category": "state", + "stage": "t4", + "biome": "mirror_marsh", + "icon": "assets/generated/icons/items/returned_test_strip.png", + "render": "assets/generated/renders/items/returned_test_strip.png" + }, + { + "id": "mirror_echo", + "name": "镜像残响", + "category": "material", + "stage": "t4", + "biome": "mirror_marsh", + "icon": "assets/generated/icons/items/mirror_echo.png", + "render": "assets/generated/renders/items/mirror_echo.png" + }, + { + "id": "shadow_matter", + "name": "影质", + "category": "byproduct", + "stage": "t4", + "biome": "mirror_marsh", + "icon": "assets/generated/icons/items/shadow_matter.png", + "render": "assets/generated/renders/items/shadow_matter.png" + }, + { + "id": "dimension_proof", + "name": "维度论证 S", + "category": "proof", + "stage": "t4", + "biome": "mirror_marsh", + "icon": "assets/generated/icons/items/dimension_proof.png", + "render": "assets/generated/renders/items/dimension_proof.png" + }, + { + "id": "mirror_coordinate", + "name": "镜界坐标", + "category": "component", + "stage": "t4", + "biome": "mirror_marsh", + "icon": "assets/generated/icons/items/mirror_coordinate.png", + "render": "assets/generated/renders/items/mirror_coordinate.png" + }, + { + "id": "space_anchor_core", + "name": "空间锚核", + "category": "ritual", + "stage": "t4", + "biome": "mirror_marsh", + "icon": "assets/generated/icons/items/space_anchor_core.png", + "render": "assets/generated/renders/items/space_anchor_core.png" + }, + { + "id": "boundary_stone", + "name": "环界石", + "category": "structure", + "stage": "t5", + "biome": "rift_gate", + "icon": "assets/generated/icons/items/boundary_stone.png", + "render": "assets/generated/renders/items/boundary_stone.png" + }, + { + "id": "life_offering", + "name": "生命供物", + "category": "ritual", + "stage": "t5", + "biome": "rift_gate", + "icon": "assets/generated/icons/items/life_offering.png", + "render": "assets/generated/renders/items/life_offering.png" + }, + { + "id": "death_offering", + "name": "亡者供物", + "category": "ritual", + "stage": "t5", + "biome": "rift_gate", + "icon": "assets/generated/icons/items/death_offering.png", + "render": "assets/generated/renders/items/death_offering.png" + }, + { + "id": "ember_offering", + "name": "熔火供物", + "category": "ritual", + "stage": "t5", + "biome": "rift_gate", + "icon": "assets/generated/icons/items/ember_offering.png", + "render": "assets/generated/renders/items/ember_offering.png" + }, + { + "id": "mirror_offering", + "name": "镜界供物", + "category": "ritual", + "stage": "t5", + "biome": "rift_gate", + "icon": "assets/generated/icons/items/mirror_offering.png", + "render": "assets/generated/renders/items/mirror_offering.png" + }, + { + "id": "entropy_crystal", + "name": "熵晶", + "category": "component", + "stage": "t5", + "biome": "rift_gate", + "icon": "assets/generated/icons/items/entropy_crystal.png", + "render": "assets/generated/renders/items/entropy_crystal.png" + }, + { + "id": "walker_construct", + "name": "界行者役偶", + "category": "construct", + "stage": "t5", + "biome": "rift_gate", + "icon": "assets/generated/icons/items/walker_construct.png", + "render": "assets/generated/renders/items/walker_construct.png" + }, + { + "id": "first_warp_record", + "name": "首次折跃记录", + "category": "record", + "stage": "t5", + "biome": "rift_gate", + "icon": "assets/generated/icons/items/first_warp_record.png", + "render": "assets/generated/renders/items/first_warp_record.png" + }, + { + "id": "tribute_block", + "name": "异界贡块", + "category": "material", + "stage": "post", + "biome": "post_rift", + "icon": "assets/generated/icons/items/tribute_block.png", + "render": "assets/generated/renders/items/tribute_block.png" + }, + { + "id": "paradox_residue", + "name": "悖论残渣", + "category": "byproduct", + "stage": "post", + "biome": "post_rift", + "icon": "assets/generated/icons/items/paradox_residue.png", + "render": "assets/generated/renders/items/paradox_residue.png" + }, + { + "id": "paradox_proof", + "name": "悖论论证 P", + "category": "proof", + "stage": "post", + "biome": "post_rift", + "icon": "assets/generated/icons/items/paradox_proof.png", + "render": "assets/generated/renders/items/paradox_proof.png" + }, + { + "id": "anomaly_relic", + "name": "异界遗物", + "category": "relic", + "stage": "post", + "biome": "post_rift", + "icon": "assets/generated/icons/items/anomaly_relic.png", + "render": "assets/generated/renders/items/anomaly_relic.png" + } + ], + "machines": [ + { + "id": "rough_furnace", + "name": "粗炼炉", + "stage": "t0", + "biome": "old_kingdom", + "render": "assets/generated/renders/machines/rough_furnace.png" + }, + { + "id": "crystal_refinery", + "name": "晶体精炼机", + "stage": "t0", + "biome": "old_kingdom", + "render": "assets/generated/renders/machines/crystal_refinery.png" + }, + { + "id": "rune_press", + "name": "符文压印台", + "stage": "t0", + "biome": "old_kingdom", + "render": "assets/generated/renders/machines/rune_press.png" + }, + { + "id": "inscription_array", + "name": "三相刻印阵", + "stage": "t1", + "biome": "old_kingdom", + "render": "assets/generated/renders/machines/inscription_array.png" + }, + { + "id": "clay_assembly", + "name": "黏土役偶阵", + "stage": "t1", + "biome": "old_kingdom", + "render": "assets/generated/renders/machines/clay_assembly.png" + }, + { + "id": "seed_bed", + "name": "共生苗床", + "stage": "t2_life", + "biome": "verdant_forest", + "render": "assets/generated/renders/machines/seed_bed.png" + }, + { + "id": "harvest_circle", + "name": "采收回种环", + "stage": "t2_life", + "biome": "verdant_forest", + "render": "assets/generated/renders/machines/harvest_circle.png" + }, + { + "id": "root_loom", + "name": "根脉织机", + "stage": "t2_life", + "biome": "verdant_forest", + "render": "assets/generated/renders/machines/root_loom.png" + }, + { + "id": "decay_chamber", + "name": "可控腐朽室", + "stage": "t2_death", + "biome": "silent_dead", + "render": "assets/generated/renders/machines/decay_chamber.png" + }, + { + "id": "soul_lamp", + "name": "魂灯召回台", + "stage": "t2_death", + "biome": "silent_dead", + "render": "assets/generated/renders/machines/soul_lamp.png" + }, + { + "id": "twilight_crucible", + "name": "暮光坩埚", + "stage": "t3", + "biome": "ember_wastes", + "render": "assets/generated/renders/machines/twilight_crucible.png" + }, + { + "id": "thermal_phase_furnace", + "name": "热相炉", + "stage": "t3", + "biome": "ember_wastes", + "render": "assets/generated/renders/machines/thermal_phase_furnace.png" + }, + { + "id": "frost_gate", + "name": "霜门", + "stage": "t3", + "biome": "ember_wastes", + "render": "assets/generated/renders/machines/frost_gate.png" + }, + { + "id": "charge_altar", + "name": "充能祭坛", + "stage": "t3", + "biome": "ember_wastes", + "render": "assets/generated/renders/machines/charge_altar.png" + }, + { + "id": "dragon_kiln", + "name": "龙玻璃窑", + "stage": "t3", + "biome": "ember_wastes", + "render": "assets/generated/renders/machines/dragon_kiln.png" + }, + { + "id": "true_name_loom", + "name": "真名织机", + "stage": "t4", + "biome": "mirror_marsh", + "render": "assets/generated/renders/machines/true_name_loom.png" + }, + { + "id": "mirror_endpoint", + "name": "镜像端点", + "stage": "t4", + "biome": "mirror_marsh", + "render": "assets/generated/renders/machines/mirror_endpoint.png" + }, + { + "id": "echo_separator", + "name": "残响分离器", + "stage": "t4", + "biome": "mirror_marsh", + "render": "assets/generated/renders/machines/echo_separator.png" + }, + { + "id": "identity_forge", + "name": "同一性锻台", + "stage": "t4", + "biome": "mirror_marsh", + "render": "assets/generated/renders/machines/identity_forge.png" + }, + { + "id": "ring_mason", + "name": "环界石工坊", + "stage": "t5", + "biome": "rift_gate", + "render": "assets/generated/renders/machines/ring_mason.png" + }, + { + "id": "offering_altar", + "name": "仪式供物台", + "stage": "t5", + "biome": "rift_gate", + "render": "assets/generated/renders/machines/offering_altar.png" + }, + { + "id": "grand_ritual", + "name": "异次元门仪式台", + "stage": "t5", + "biome": "rift_gate", + "render": "assets/generated/renders/machines/grand_ritual.png" + }, + { + "id": "tribute_press", + "name": "异界贡块压机", + "stage": "post", + "biome": "post_rift", + "render": "assets/generated/renders/machines/tribute_press.png" + }, + { + "id": "dimensional_gate", + "name": "异次元传送门", + "stage": "post", + "biome": "post_rift", + "render": "assets/generated/renders/machines/dimensional_gate.png" + }, + { + "id": "paradox_condenser", + "name": "悖论冷凝器", + "stage": "post", + "biome": "post_rift", + "render": "assets/generated/renders/machines/paradox_condenser.png" + } + ], + "logistics": [ + { + "id": "belt", + "name": "符轨", + "kind": "belt", + "description": "固定网格传送带。", + "render": "assets/generated/renders/logistics/belt.png" + }, + { + "id": "crystal_hopper", + "name": "魔晶料斗", + "kind": "source", + "description": "产出粗魔晶。", + "render": "assets/generated/renders/logistics/crystal_hopper.png" + }, + { + "id": "collection_vault", + "name": "收集仓", + "kind": "sink", + "description": "接收成品。", + "render": "assets/generated/renders/logistics/collection_vault.png" + }, + { + "id": "mana_pipe", + "name": "魔力管", + "kind": "mana_pipe", + "description": "传导地脉魔力。", + "render": "assets/generated/renders/logistics/mana_pipe.png" + }, + { + "id": "mana_source", + "name": "魔力源", + "kind": "mana_source", + "description": "地脉涌出口。", + "render": "assets/generated/renders/logistics/mana_source.png" + }, + { + "id": "bridge_arm", + "name": "契约桥臂", + "kind": "bridge", + "description": "机器上的显式取放端点。", + "render": "assets/generated/renders/logistics/bridge_arm.png" + } + ], + "materials": [ + { + "id": "factory_stone", + "name": "工坊暗石", + "usage": "ground", + "albedo": "assets/generated/materials/factory_stone.png" + }, + { + "id": "aged_brass", + "name": "旧黄铜", + "usage": "metal", + "albedo": "assets/generated/materials/aged_brass.png" + }, + { + "id": "mana_glass", + "name": "魔力琉璃", + "usage": "pipe", + "albedo": "assets/generated/materials/mana_glass.png" + }, + { + "id": "rune_slate", + "name": "符文板岩", + "usage": "inscription", + "albedo": "assets/generated/materials/rune_slate.png" + }, + { + "id": "living_bark", + "name": "活树皮", + "usage": "forest", + "albedo": "assets/generated/materials/living_bark.png" + }, + { + "id": "bone_ash", + "name": "骨灰", + "usage": "death", + "albedo": "assets/generated/materials/bone_ash.png" + }, + { + "id": "ember_crust", + "name": "烬壳", + "usage": "ember", + "albedo": "assets/generated/materials/ember_crust.png" + }, + { + "id": "star_mirror", + "name": "星镜面", + "usage": "mirror", + "albedo": "assets/generated/materials/star_mirror.png" + }, + { + "id": "rift_gold", + "name": "裂界金", + "usage": "rift", + "albedo": "assets/generated/materials/rift_gold.png" + }, + { + "id": "paradox_silk", + "name": "悖论丝", + "usage": "post", + "albedo": "assets/generated/materials/paradox_silk.png" + } + ] +} \ No newline at end of file diff --git a/data/recipe-book.json b/data/recipe-book.json new file mode 100644 index 0000000..5a76af4 --- /dev/null +++ b/data/recipe-book.json @@ -0,0 +1,3719 @@ +{ + "schemaVersion": 1, + "metadata": { + "title": "魔力工坊配方书", + "revision": "0.2.0", + "description": "覆盖五种魔法法则、首次折跃与门后交换的策划权威数据。", + "updatedAt": "2026-08-12T10:06:36.157Z" + }, + "stages": [ + { + "id": "t0", + "name": "T0 遗迹苏醒", + "order": 0, + "color": "#7d8b92" + }, + { + "id": "t1", + "name": "T1 符文机巧", + "order": 1, + "color": "#48c7d9" + }, + { + "id": "t2_life", + "name": "T2 翠绿魔林", + "order": 2, + "color": "#61c87a" + }, + { + "id": "t2_death", + "name": "T2 亡者静域", + "order": 3, + "color": "#8e75c7" + }, + { + "id": "t3", + "name": "T3 赤烬荒原", + "order": 4, + "color": "#e8784f" + }, + { + "id": "t4", + "name": "T4 星辉镜沼", + "order": 5, + "color": "#55a7dd" + }, + { + "id": "t5", + "name": "T5 门环工程", + "order": 6, + "color": "#d8b65a" + }, + { + "id": "post", + "name": "终局 门后世界", + "order": 7, + "color": "#d65da4" + } + ], + "biomes": [ + { + "id": "old_kingdom", + "name": "旧王国边境", + "color": "#657983", + "law": "刻印顺序与地脉共鸣" + }, + { + "id": "verdant_forest", + "name": "翠绿魔林", + "color": "#4fa968", + "law": "生长、回种与生态余额" + }, + { + "id": "silent_dead", + "name": "亡者静域", + "color": "#7664a2", + "law": "腐朽计时、身份与记忆召回" + }, + { + "id": "ember_wastes", + "name": "赤烬荒原", + "color": "#c96445", + "law": "温度、相态与热量交换" + }, + { + "id": "mirror_marsh", + "name": "星辉镜沼", + "color": "#4d8fbd", + "law": "空间真名、回声与概率" + }, + { + "id": "rift_gate", + "name": "裂界门址", + "color": "#ad8c43", + "law": "四锚同步与仪式熵" + }, + { + "id": "post_rift", + "name": "门后世界", + "color": "#ad4b85", + "law": "物质交换、结果袋与悖论" + } + ], + "machines": [ + { + "id": "rough_furnace", + "name": "粗炼炉", + "stage": "t0", + "biome": "old_kingdom", + "baseSpeed": 1, + "description": "把矿石转化为基础锭。", + "tags": [ + "heat" + ] + }, + { + "id": "crystal_refinery", + "name": "晶体精炼机", + "stage": "t0", + "biome": "old_kingdom", + "baseSpeed": 1, + "description": "唤醒魔晶并提供稳定魔力介质。", + "tags": [ + "mana" + ] + }, + { + "id": "rune_press", + "name": "符文压印台", + "stage": "t0", + "biome": "old_kingdom", + "baseSpeed": 1, + "description": "制作石板、单枚符文与真名材料。", + "tags": [ + "inscription" + ] + }, + { + "id": "inscription_array", + "name": "三相刻印阵", + "stage": "t1", + "biome": "old_kingdom", + "baseSpeed": 1, + "description": "按指定顺序让石板经过三相符文。", + "tags": [ + "inscription", + "ordered" + ] + }, + { + "id": "clay_assembly", + "name": "黏土役偶阵", + "stage": "t1", + "biome": "old_kingdom", + "baseSpeed": 1, + "description": "自动执行多步骤构装配方。", + "tags": [ + "construct" + ] + }, + { + "id": "seed_bed", + "name": "共生苗床", + "stage": "t2_life", + "biome": "verdant_forest", + "baseSpeed": 1, + "description": "让论证种成长并产生共生资源。", + "tags": [ + "growth" + ] + }, + { + "id": "harvest_circle", + "name": "采收回种环", + "stage": "t2_life", + "biome": "verdant_forest", + "baseSpeed": 1, + "description": "在生态余额非负时完成采收与回种。", + "tags": [ + "growth", + "balance" + ] + }, + { + "id": "root_loom", + "name": "根脉织机", + "stage": "t2_life", + "biome": "verdant_forest", + "baseSpeed": 1, + "description": "把活木和妖精露编成根系构件。", + "tags": [ + "life" + ] + }, + { + "id": "decay_chamber", + "name": "可控腐朽室", + "stage": "t2_death", + "biome": "silent_dead", + "baseSpeed": 1, + "description": "让物品按可见时钟失去形体。", + "tags": [ + "decay" + ] + }, + { + "id": "soul_lamp", + "name": "魂灯召回台", + "stage": "t2_death", + "biome": "silent_dead", + "baseSpeed": 1, + "description": "从残留身份中召回记忆。", + "tags": [ + "death", + "memory" + ] + }, + { + "id": "twilight_crucible", + "name": "暮光坩埚", + "stage": "t3", + "biome": "ember_wastes", + "baseSpeed": 1, + "description": "让生机与幽冥材料形成稳定合剂。", + "tags": [ + "alchemy" + ] + }, + { + "id": "thermal_phase_furnace", + "name": "热相炉", + "stage": "t3", + "biome": "ember_wastes", + "baseSpeed": 1, + "description": "加热物质并显式改变相态。", + "tags": [ + "temperature", + "state" + ] + }, + { + "id": "frost_gate", + "name": "霜门", + "stage": "t3", + "biome": "ember_wastes", + "baseSpeed": 1, + "description": "抽走热量并把介质降到低温态。", + "tags": [ + "cold", + "state" + ] + }, + { + "id": "charge_altar", + "name": "充能祭坛", + "stage": "t3", + "biome": "ember_wastes", + "baseSpeed": 1, + "description": "把熔融介质转为可保留的充能态。", + "tags": [ + "mana", + "state" + ] + }, + { + "id": "dragon_kiln", + "name": "龙玻璃窑", + "stage": "t3", + "biome": "ember_wastes", + "baseSpeed": 1, + "description": "在高热下烧结耐熵龙玻璃。", + "tags": [ + "heat", + "portal" + ] + }, + { + "id": "true_name_loom", + "name": "真名织机", + "stage": "t4", + "biome": "mirror_marsh", + "baseSpeed": 1, + "description": "给试片写入稳定空间真名。", + "tags": [ + "true_name" + ] + }, + { + "id": "mirror_endpoint", + "name": "镜像端点", + "stage": "t4", + "biome": "mirror_marsh", + "baseSpeed": 1, + "description": "把有真名的物品送过折叠路径并带回残响。", + "tags": [ + "dimension", + "transport" + ] + }, + { + "id": "echo_separator", + "name": "残响分离器", + "stage": "t4", + "biome": "mirror_marsh", + "baseSpeed": 1, + "description": "分离真实物、回声与影质。", + "tags": [ + "sorting", + "dimension" + ] + }, + { + "id": "identity_forge", + "name": "同一性锻台", + "stage": "t4", + "biome": "mirror_marsh", + "baseSpeed": 1, + "description": "固定物品的一条法则标签。", + "tags": [ + "identity", + "anchor" + ] + }, + { + "id": "ring_mason", + "name": "环界石工坊", + "stage": "t5", + "biome": "rift_gate", + "baseSpeed": 1, + "description": "制作门环结构与四锚构件。", + "tags": [ + "portal", + "construct" + ] + }, + { + "id": "offering_altar", + "name": "仪式供物台", + "stage": "t5", + "biome": "rift_gate", + "baseSpeed": 1, + "description": "把各生态区材料制成节拍一致的供物。", + "tags": [ + "ritual" + ] + }, + { + "id": "grand_ritual", + "name": "异次元门仪式台", + "stage": "t5", + "biome": "rift_gate", + "baseSpeed": 1, + "description": "控制四锚、同步批次和首次折跃。", + "tags": [ + "portal", + "ritual" + ] + }, + { + "id": "tribute_press", + "name": "异界贡块压机", + "stage": "post", + "biome": "post_rift", + "baseSpeed": 1, + "description": "把过剩物质按质量压成通用贡块。", + "tags": [ + "mass" + ] + }, + { + "id": "dimensional_gate", + "name": "异次元传送门", + "stage": "post", + "biome": "post_rift", + "baseSpeed": 1, + "description": "消费贡块并按调谐结果袋输出异界物质。", + "tags": [ + "portal", + "result_bag", + "entropy" + ] + }, + { + "id": "paradox_condenser", + "name": "悖论冷凝器", + "stage": "post", + "biome": "post_rift", + "baseSpeed": 1, + "description": "把异常物与熵冷凝为门后科研材料。", + "tags": [ + "paradox", + "recovery" + ] + } + ], + "items": [ + { + "id": "star_iron_ore", + "name": "星铁矿", + "category": "raw", + "stage": "t0", + "biome": "old_kingdom", + "mass": 1, + "stackSize": 100, + "isRaw": true, + "tags": [ + "metal", + "old_kingdom" + ], + "notes": "旧王国基础矿物。" + }, + { + "id": "star_iron_ingot", + "name": "星铁锭", + "category": "material", + "stage": "t0", + "biome": "old_kingdom", + "mass": 1, + "stackSize": 100, + "isRaw": false, + "tags": [ + "metal" + ], + "notes": "基础结构材料。" + }, + { + "id": "rune_clay", + "name": "符文黏土", + "category": "raw", + "stage": "t0", + "biome": "old_kingdom", + "mass": 0.5, + "stackSize": 200, + "isRaw": true, + "tags": [ + "earth", + "inscription" + ], + "notes": "可反复压制的魔法黏土。" + }, + { + "id": "raw_mana_crystal", + "name": "粗魔晶", + "category": "raw", + "stage": "t0", + "biome": "old_kingdom", + "mass": 0.5, + "stackSize": 200, + "isRaw": true, + "tags": [ + "crystal", + "mana" + ], + "notes": "未经唤醒的魔晶。" + }, + { + "id": "awakened_crystal", + "name": "醒魔晶", + "category": "material", + "stage": "t0", + "biome": "old_kingdom", + "mass": 0.5, + "stackSize": 200, + "isRaw": false, + "tags": [ + "crystal", + "mana" + ], + "notes": "稳定魔力介质。" + }, + { + "id": "ley_water", + "name": "地脉水", + "category": "fluid", + "stage": "t0", + "biome": "old_kingdom", + "mass": 0.1, + "stackSize": 1000, + "isRaw": true, + "tags": [ + "fluid", + "mana" + ], + "notes": "以十单位为常用配方量。" + }, + { + "id": "blank_tablet", + "name": "空白论证板", + "category": "component", + "stage": "t0", + "biome": "old_kingdom", + "mass": 0.5, + "stackSize": 200, + "isRaw": false, + "tags": [ + "inscription" + ], + "notes": "错误刻印后可以回收。" + }, + { + "id": "dawn_rune", + "name": "曙相符文", + "category": "component", + "stage": "t0", + "biome": "old_kingdom", + "mass": 0.1, + "stackSize": 200, + "isRaw": false, + "tags": [ + "inscription", + "dawn" + ], + "notes": "三相刻印第一步。" + }, + { + "id": "tide_rune", + "name": "潮相符文", + "category": "component", + "stage": "t0", + "biome": "old_kingdom", + "mass": 0.1, + "stackSize": 200, + "isRaw": false, + "tags": [ + "inscription", + "tide" + ], + "notes": "三相刻印第二步。" + }, + { + "id": "dusk_rune", + "name": "暮相符文", + "category": "component", + "stage": "t0", + "biome": "old_kingdom", + "mass": 0.1, + "stackSize": 200, + "isRaw": false, + "tags": [ + "inscription", + "dusk" + ], + "notes": "三相刻印第三步。" + }, + { + "id": "inscription_proof", + "name": "刻印论证 K", + "category": "proof", + "stage": "t1", + "biome": "old_kingdom", + "mass": 0.2, + "stackSize": 200, + "isRaw": false, + "tags": [ + "proof", + "inscription" + ], + "notes": "必须按曙、潮、暮顺序完成。" + }, + { + "id": "true_name_thread", + "name": "真名丝", + "category": "component", + "stage": "t1", + "biome": "old_kingdom", + "mass": 0.1, + "stackSize": 200, + "isRaw": false, + "tags": [ + "true_name", + "inscription" + ], + "notes": "用于给物品和空间端点写入身份。" + }, + { + "id": "clay_core", + "name": "黏土役偶核", + "category": "component", + "stage": "t1", + "biome": "old_kingdom", + "mass": 2, + "stackSize": 50, + "isRaw": false, + "tags": [ + "construct" + ], + "notes": "基础役偶核心。" + }, + { + "id": "clay_construct", + "name": "黏土役偶", + "category": "construct", + "stage": "t1", + "biome": "old_kingdom", + "mass": 5, + "stackSize": 20, + "isRaw": false, + "tags": [ + "construct", + "automation" + ], + "notes": "能重复执行复杂手工步骤。" + }, + { + "id": "wild_proof_seed", + "name": "野生论证种", + "category": "raw", + "stage": "t2_life", + "biome": "verdant_forest", + "mass": 0.1, + "stackSize": 200, + "isRaw": true, + "tags": [ + "life", + "seed" + ], + "notes": "魔林内自然出现。" + }, + { + "id": "proof_seed", + "name": "论证种", + "category": "catalyst", + "stage": "t2_life", + "biome": "verdant_forest", + "mass": 0.2, + "stackSize": 200, + "isRaw": false, + "tags": [ + "life", + "seed" + ], + "notes": "用于开始一次生长论证。" + }, + { + "id": "mature_proof_seed", + "name": "成熟论证种", + "category": "state", + "stage": "t2_life", + "biome": "verdant_forest", + "mass": 0.3, + "stackSize": 100, + "isRaw": false, + "tags": [ + "life", + "seed", + "mature" + ], + "notes": "必须在生态余额非负时采收。" + }, + { + "id": "living_wood", + "name": "活木", + "category": "material", + "stage": "t2_life", + "biome": "verdant_forest", + "mass": 1, + "stackSize": 100, + "isRaw": false, + "tags": [ + "life", + "organic" + ], + "notes": "可再生结构材料。" + }, + { + "id": "fairy_dew", + "name": "妖精露", + "category": "fluid", + "stage": "t2_life", + "biome": "verdant_forest", + "mass": 0.1, + "stackSize": 1000, + "isRaw": false, + "tags": [ + "life", + "fluid" + ], + "notes": "维持回种与枯萎恢复。" + }, + { + "id": "root_fiber", + "name": "根脉纤维", + "category": "component", + "stage": "t2_life", + "biome": "verdant_forest", + "mass": 0.5, + "stackSize": 200, + "isRaw": false, + "tags": [ + "life", + "root" + ], + "notes": "活体物流和生命锚材料。" + }, + { + "id": "life_proof", + "name": "生机论证 L", + "category": "proof", + "stage": "t2_life", + "biome": "verdant_forest", + "mass": 0.2, + "stackSize": 200, + "isRaw": false, + "tags": [ + "proof", + "life" + ], + "notes": "完整生长、采收、回种闭环的记录。" + }, + { + "id": "blight", + "name": "枯萎块", + "category": "byproduct", + "stage": "t2_life", + "biome": "verdant_forest", + "mass": 0.5, + "stackSize": 100, + "isRaw": false, + "tags": [ + "life", + "failure", + "system_generated" + ], + "notes": "生态失衡时产生,可恢复。" + }, + { + "id": "life_anchor_core", + "name": "生命锚核", + "category": "ritual", + "stage": "t2_life", + "biome": "verdant_forest", + "mass": 10, + "stackSize": 10, + "isRaw": false, + "tags": [ + "life", + "anchor" + ], + "notes": "门环四锚之一。" + }, + { + "id": "soul_ember", + "name": "游荡灵火", + "category": "raw", + "stage": "t2_death", + "biome": "silent_dead", + "mass": 0.1, + "stackSize": 200, + "isRaw": true, + "tags": [ + "death", + "soul" + ], + "notes": "亡域的灵魂供给。" + }, + { + "id": "memory_blank", + "name": "记忆坯", + "category": "component", + "stage": "t2_death", + "biome": "silent_dead", + "mass": 0.5, + "stackSize": 200, + "isRaw": false, + "tags": [ + "death", + "memory" + ], + "notes": "在腐朽室中失去形体。" + }, + { + "id": "faded_memory", + "name": "褪色记忆", + "category": "state", + "stage": "t2_death", + "biome": "silent_dead", + "mass": 0.2, + "stackSize": 200, + "isRaw": false, + "tags": [ + "death", + "memory", + "decayed" + ], + "notes": "尚保留材料类别的身份残片。" + }, + { + "id": "bone_dust", + "name": "骨尘", + "category": "byproduct", + "stage": "t2_death", + "biome": "silent_dead", + "mass": 0.2, + "stackSize": 200, + "isRaw": false, + "tags": [ + "death", + "recycle" + ], + "notes": "腐朽产生的可回收物。" + }, + { + "id": "recovered_memory", + "name": "亡者记忆", + "category": "material", + "stage": "t2_death", + "biome": "silent_dead", + "mass": 0.2, + "stackSize": 200, + "isRaw": false, + "tags": [ + "death", + "memory" + ], + "notes": "被魂灯完整召回的身份。" + }, + { + "id": "death_proof", + "name": "幽冥论证 D", + "category": "proof", + "stage": "t2_death", + "biome": "silent_dead", + "mass": 0.2, + "stackSize": 200, + "isRaw": false, + "tags": [ + "proof", + "death" + ], + "notes": "腐朽与召回闭环的记录。" + }, + { + "id": "death_anchor_core", + "name": "亡者锚核", + "category": "ritual", + "stage": "t2_death", + "biome": "silent_dead", + "mass": 10, + "stackSize": 10, + "isRaw": false, + "tags": [ + "death", + "anchor" + ], + "notes": "门环四锚之一。" + }, + { + "id": "twilight_reagent", + "name": "暮光合剂", + "category": "fluid", + "stage": "t3", + "biome": "ember_wastes", + "mass": 0.2, + "stackSize": 1000, + "isRaw": false, + "tags": [ + "life", + "death", + "alchemy" + ], + "notes": "让生长与腐朽形成可控循环。" + }, + { + "id": "refractory_coating", + "name": "焚风护层", + "category": "component", + "stage": "t3", + "biome": "ember_wastes", + "mass": 0.5, + "stackSize": 200, + "isRaw": false, + "tags": [ + "element", + "heatproof" + ], + "notes": "保护符轨和门环材料。" + }, + { + "id": "phase_medium", + "name": "炼相介质", + "category": "material", + "stage": "t3", + "biome": "ember_wastes", + "mass": 1, + "stackSize": 100, + "isRaw": false, + "tags": [ + "element", + "state" + ], + "notes": "元素论证循环的基础形态。" + }, + { + "id": "cold_phase_medium", + "name": "低温炼相介质", + "category": "state", + "stage": "t3", + "biome": "ember_wastes", + "mass": 1, + "stackSize": 100, + "isRaw": false, + "tags": [ + "element", + "cold", + "state" + ], + "notes": "三态循环第一态。" + }, + { + "id": "molten_phase_medium", + "name": "熔融炼相介质", + "category": "state", + "stage": "t3", + "biome": "ember_wastes", + "mass": 1, + "stackSize": 100, + "isRaw": false, + "tags": [ + "element", + "hot", + "state" + ], + "notes": "三态循环第二态。" + }, + { + "id": "charged_phase_medium", + "name": "充能炼相介质", + "category": "state", + "stage": "t3", + "biome": "ember_wastes", + "mass": 1, + "stackSize": 100, + "isRaw": false, + "tags": [ + "element", + "charged", + "state" + ], + "notes": "三态循环第三态。" + }, + { + "id": "elemental_proof", + "name": "元素论证 E", + "category": "proof", + "stage": "t3", + "biome": "ember_wastes", + "mass": 0.2, + "stackSize": 200, + "isRaw": false, + "tags": [ + "proof", + "element" + ], + "notes": "完成低温、熔融、充能循环的记录。" + }, + { + "id": "slag", + "name": "炼相熔渣", + "category": "byproduct", + "stage": "t3", + "biome": "ember_wastes", + "mass": 0.5, + "stackSize": 200, + "isRaw": false, + "tags": [ + "element", + "recycle" + ], + "notes": "不会消失,可用于贡块或灰烬复生。" + }, + { + "id": "dragon_glass", + "name": "龙玻璃", + "category": "material", + "stage": "t3", + "biome": "ember_wastes", + "mass": 2, + "stackSize": 100, + "isRaw": false, + "tags": [ + "element", + "portal", + "heatproof" + ], + "notes": "门环主要结构材料。" + }, + { + "id": "ember_core", + "name": "熔火核心", + "category": "ritual", + "stage": "t3", + "biome": "ember_wastes", + "mass": 8, + "stackSize": 20, + "isRaw": false, + "tags": [ + "element", + "anchor" + ], + "notes": "门环四锚之一。" + }, + { + "id": "name_strip_blank", + "name": "空白真名试片", + "category": "component", + "stage": "t4", + "biome": "mirror_marsh", + "mass": 0.5, + "stackSize": 200, + "isRaw": false, + "tags": [ + "dimension", + "true_name" + ], + "notes": "用于折叠往返实验。" + }, + { + "id": "named_test_strip", + "name": "命名试片", + "category": "catalyst", + "stage": "t4", + "biome": "mirror_marsh", + "mass": 0.5, + "stackSize": 200, + "isRaw": false, + "tags": [ + "dimension", + "true_name" + ], + "notes": "能够通过固定镜像端点。" + }, + { + "id": "returned_test_strip", + "name": "归返试片", + "category": "state", + "stage": "t4", + "biome": "mirror_marsh", + "mass": 0.5, + "stackSize": 200, + "isRaw": false, + "tags": [ + "dimension", + "returned" + ], + "notes": "携带可分离的镜像残响。" + }, + { + "id": "mirror_echo", + "name": "镜像残响", + "category": "material", + "stage": "t4", + "biome": "mirror_marsh", + "mass": 0.1, + "stackSize": 200, + "isRaw": false, + "tags": [ + "dimension", + "echo" + ], + "notes": "空间折叠后的稳定残留。" + }, + { + "id": "shadow_matter", + "name": "影质", + "category": "byproduct", + "stage": "t4", + "biome": "mirror_marsh", + "mass": 0.2, + "stackSize": 200, + "isRaw": false, + "tags": [ + "dimension", + "echo", + "recycle" + ], + "notes": "概率增殖和门后交换的重要催化物。" + }, + { + "id": "dimension_proof", + "name": "维度论证 S", + "category": "proof", + "stage": "t4", + "biome": "mirror_marsh", + "mass": 0.2, + "stackSize": 200, + "isRaw": false, + "tags": [ + "proof", + "dimension" + ], + "notes": "同一真名完成折叠往返的记录。" + }, + { + "id": "mirror_coordinate", + "name": "镜界坐标", + "category": "component", + "stage": "t4", + "biome": "mirror_marsh", + "mass": 0.2, + "stackSize": 200, + "isRaw": false, + "tags": [ + "dimension", + "coordinate" + ], + "notes": "首次折跃同步供物。" + }, + { + "id": "space_anchor_core", + "name": "空间锚核", + "category": "ritual", + "stage": "t4", + "biome": "mirror_marsh", + "mass": 10, + "stackSize": 10, + "isRaw": false, + "tags": [ + "dimension", + "anchor" + ], + "notes": "门环四锚之一。" + }, + { + "id": "boundary_stone", + "name": "环界石", + "category": "structure", + "stage": "t5", + "biome": "rift_gate", + "mass": 20, + "stackSize": 20, + "isRaw": false, + "tags": [ + "portal", + "structure" + ], + "notes": "首次门环需要十二块。" + }, + { + "id": "life_offering", + "name": "生命供物", + "category": "ritual", + "stage": "t5", + "biome": "rift_gate", + "mass": 1, + "stackSize": 100, + "isRaw": false, + "tags": [ + "portal", + "life" + ], + "notes": "每批仪式消耗一份。" + }, + { + "id": "death_offering", + "name": "亡者供物", + "category": "ritual", + "stage": "t5", + "biome": "rift_gate", + "mass": 1, + "stackSize": 100, + "isRaw": false, + "tags": [ + "portal", + "death" + ], + "notes": "每批仪式消耗一份。" + }, + { + "id": "ember_offering", + "name": "熔火供物", + "category": "ritual", + "stage": "t5", + "biome": "rift_gate", + "mass": 1, + "stackSize": 100, + "isRaw": false, + "tags": [ + "portal", + "element" + ], + "notes": "每批仪式消耗一份。" + }, + { + "id": "mirror_offering", + "name": "镜界供物", + "category": "ritual", + "stage": "t5", + "biome": "rift_gate", + "mass": 1, + "stackSize": 100, + "isRaw": false, + "tags": [ + "portal", + "dimension" + ], + "notes": "每批仪式消耗一份。" + }, + { + "id": "entropy_crystal", + "name": "熵晶", + "category": "component", + "stage": "t5", + "biome": "rift_gate", + "mass": 1, + "stackSize": 100, + "isRaw": false, + "tags": [ + "portal", + "entropy" + ], + "notes": "熵槽和门后异常捕获材料。" + }, + { + "id": "walker_construct", + "name": "界行者役偶", + "category": "construct", + "stage": "t5", + "biome": "rift_gate", + "mass": 25, + "stackSize": 1, + "isRaw": false, + "tags": [ + "portal", + "construct" + ], + "notes": "它开始穿门的帧就是通关时刻。" + }, + { + "id": "first_warp_record", + "name": "首次折跃记录", + "category": "record", + "stage": "t5", + "biome": "rift_gate", + "mass": 0.1, + "stackSize": 1, + "isRaw": false, + "tags": [ + "portal", + "victory" + ], + "notes": "只由首次折跃仪式产生。" + }, + { + "id": "tribute_block", + "name": "异界贡块", + "category": "material", + "stage": "post", + "biome": "post_rift", + "mass": 1, + "stackSize": 200, + "isRaw": false, + "tags": [ + "portal", + "mass" + ], + "notes": "一质量单位的通用门后输入。" + }, + { + "id": "paradox_residue", + "name": "悖论残渣", + "category": "byproduct", + "stage": "post", + "biome": "post_rift", + "mass": 1, + "stackSize": 200, + "isRaw": false, + "tags": [ + "paradox", + "recycle" + ], + "notes": "所有门后坏结果的统一回收入口。" + }, + { + "id": "paradox_proof", + "name": "悖论论证 P", + "category": "proof", + "stage": "post", + "biome": "post_rift", + "mass": 0.2, + "stackSize": 200, + "isRaw": false, + "tags": [ + "proof", + "paradox" + ], + "notes": "熵与异常物被成功驯服的记录。" + }, + { + "id": "anomaly_relic", + "name": "异界遗物", + "category": "relic", + "stage": "post", + "biome": "post_rift", + "mass": 5, + "stackSize": 20, + "isRaw": false, + "tags": [ + "paradox", + "relic" + ], + "notes": "改变局部配方规则的稀有可选物。" + } + ], + "recipes": [ + { + "id": "smelt_star_iron", + "name": "粗炼星铁", + "stage": "t0", + "biome": "old_kingdom", + "machineId": "rough_furnace", + "kind": "craft", + "duration": 2, + "unlockedBy": "B01", + "inputs": [ + { + "itemId": "star_iron_ore", + "amount": 1, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "star_iron_ingot", + "amount": 1 + } + ], + "manaPerSecond": 0, + "entropy": 0, + "conditions": [], + "tags": [ + "metal" + ], + "notes": "基础冶炼。", + "enabled": true + }, + { + "id": "awaken_crystal", + "name": "唤醒魔晶", + "stage": "t0", + "biome": "old_kingdom", + "machineId": "crystal_refinery", + "kind": "craft", + "duration": 3, + "unlockedBy": "B02", + "inputs": [ + { + "itemId": "raw_mana_crystal", + "amount": 1, + "mode": "consumed" + }, + { + "itemId": "ley_water", + "amount": 5, + "mode": "fluid" + } + ], + "outputs": [ + { + "itemId": "awakened_crystal", + "amount": 1 + } + ], + "manaPerSecond": 1, + "entropy": 0, + "conditions": [], + "tags": [ + "crystal" + ], + "notes": "当前原型精炼配方的正式数据版本。", + "enabled": true + }, + { + "id": "press_blank_tablet", + "name": "压制空白论证板", + "stage": "t0", + "biome": "old_kingdom", + "machineId": "rune_press", + "kind": "craft", + "duration": 1.5, + "unlockedBy": "B05", + "inputs": [ + { + "itemId": "rune_clay", + "amount": 2, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "blank_tablet", + "amount": 1 + } + ], + "manaPerSecond": 0.5, + "entropy": 0, + "conditions": [], + "tags": [ + "inscription" + ], + "notes": "刻印错误时返回该物品。", + "enabled": true + }, + { + "id": "carve_dawn_rune", + "name": "刻制曙相符文", + "stage": "t0", + "biome": "old_kingdom", + "machineId": "rune_press", + "kind": "craft", + "duration": 1, + "unlockedBy": "B05", + "inputs": [ + { + "itemId": "rune_clay", + "amount": 1, + "mode": "consumed" + }, + { + "itemId": "awakened_crystal", + "amount": 0.1, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "dawn_rune", + "amount": 1 + } + ], + "manaPerSecond": 0.5, + "entropy": 0, + "conditions": [], + "tags": [ + "inscription", + "dawn" + ], + "notes": "三相刻印第一步。", + "enabled": true + }, + { + "id": "carve_tide_rune", + "name": "刻制潮相符文", + "stage": "t0", + "biome": "old_kingdom", + "machineId": "rune_press", + "kind": "craft", + "duration": 1, + "unlockedBy": "B05", + "inputs": [ + { + "itemId": "rune_clay", + "amount": 1, + "mode": "consumed" + }, + { + "itemId": "ley_water", + "amount": 2, + "mode": "fluid" + } + ], + "outputs": [ + { + "itemId": "tide_rune", + "amount": 1 + } + ], + "manaPerSecond": 0.5, + "entropy": 0, + "conditions": [], + "tags": [ + "inscription", + "tide" + ], + "notes": "三相刻印第二步。", + "enabled": true + }, + { + "id": "carve_dusk_rune", + "name": "刻制暮相符文", + "stage": "t0", + "biome": "old_kingdom", + "machineId": "rune_press", + "kind": "craft", + "duration": 1, + "unlockedBy": "B05", + "inputs": [ + { + "itemId": "rune_clay", + "amount": 1, + "mode": "consumed" + }, + { + "itemId": "star_iron_ingot", + "amount": 0.2, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "dusk_rune", + "amount": 1 + } + ], + "manaPerSecond": 0.5, + "entropy": 0, + "conditions": [], + "tags": [ + "inscription", + "dusk" + ], + "notes": "三相刻印第三步。", + "enabled": true + }, + { + "id": "prove_inscription", + "name": "三相刻印论证", + "stage": "t1", + "biome": "old_kingdom", + "machineId": "inscription_array", + "kind": "inscription", + "duration": 5, + "unlockedBy": "K01", + "inputs": [ + { + "itemId": "blank_tablet", + "amount": 1, + "mode": "consumed" + }, + { + "itemId": "dawn_rune", + "amount": 1, + "mode": "catalyst" + }, + { + "itemId": "tide_rune", + "amount": 1, + "mode": "catalyst" + }, + { + "itemId": "dusk_rune", + "amount": 1, + "mode": "catalyst" + } + ], + "outputs": [ + { + "itemId": "inscription_proof", + "amount": 1 + } + ], + "manaPerSecond": 2, + "entropy": 0, + "conditions": [ + "刻印顺序必须为:曙相 → 潮相 → 暮相", + "错序时返回空白论证板" + ], + "tags": [ + "proof", + "ordered" + ], + "notes": "第一种法则论证。", + "enabled": true + }, + { + "id": "spin_true_name_thread", + "name": "纺制真名丝", + "stage": "t1", + "biome": "old_kingdom", + "machineId": "rune_press", + "kind": "inscription", + "duration": 4, + "unlockedBy": "K03", + "inputs": [ + { + "itemId": "rune_clay", + "amount": 2, + "mode": "consumed" + }, + { + "itemId": "awakened_crystal", + "amount": 1, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "true_name_thread", + "amount": 2 + } + ], + "manaPerSecond": 2, + "entropy": 0, + "conditions": [], + "tags": [ + "true_name" + ], + "notes": "空间和物品身份的通用构件。", + "enabled": true + }, + { + "id": "make_clay_core", + "name": "塑造役偶核", + "stage": "t1", + "biome": "old_kingdom", + "machineId": "clay_assembly", + "kind": "craft", + "duration": 5, + "unlockedBy": "K05", + "inputs": [ + { + "itemId": "rune_clay", + "amount": 4, + "mode": "consumed" + }, + { + "itemId": "star_iron_ingot", + "amount": 2, + "mode": "consumed" + }, + { + "itemId": "awakened_crystal", + "amount": 1, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "clay_core", + "amount": 1 + } + ], + "manaPerSecond": 2, + "entropy": 0, + "conditions": [], + "tags": [ + "construct" + ], + "notes": "役偶通用核心。", + "enabled": true + }, + { + "id": "make_clay_construct", + "name": "组装黏土役偶", + "stage": "t1", + "biome": "old_kingdom", + "machineId": "clay_assembly", + "kind": "craft", + "duration": 8, + "unlockedBy": "K05", + "inputs": [ + { + "itemId": "clay_core", + "amount": 1, + "mode": "consumed" + }, + { + "itemId": "true_name_thread", + "amount": 4, + "mode": "consumed" + }, + { + "itemId": "star_iron_ingot", + "amount": 4, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "clay_construct", + "amount": 1 + } + ], + "manaPerSecond": 3, + "entropy": 0, + "conditions": [], + "tags": [ + "construct", + "automation" + ], + "notes": "后期界行者役偶的基础躯体。", + "enabled": true + }, + { + "id": "gather_guiding_dew", + "name": "采集引导妖精露", + "stage": "t2_life", + "biome": "verdant_forest", + "machineId": "seed_bed", + "kind": "growth", + "duration": 18, + "unlockedBy": "L01", + "inputs": [ + { + "itemId": "wild_proof_seed", + "amount": 1, + "mode": "catalyst" + }, + { + "itemId": "ley_water", + "amount": 4, + "mode": "fluid" + } + ], + "outputs": [ + { + "itemId": "fairy_dew", + "amount": 3 + } + ], + "manaPerSecond": 0.5, + "entropy": 0, + "conditions": [ + "只能放在野生露泉半径 4 格内", + "每处露泉提供有限的主线启动量" + ], + "tags": [ + "life", + "bootstrap", + "world_site" + ], + "notes": "显式解决生机循环的首次启动;稳定循环建立后应拆除或迁作授粉节点。", + "enabled": true + }, + { + "id": "prepare_proof_seed", + "name": "准备论证种", + "stage": "t2_life", + "biome": "verdant_forest", + "machineId": "root_loom", + "kind": "craft", + "duration": 3, + "unlockedBy": "L02", + "inputs": [ + { + "itemId": "wild_proof_seed", + "amount": 1, + "mode": "consumed" + }, + { + "itemId": "blank_tablet", + "amount": 1, + "mode": "consumed" + }, + { + "itemId": "fairy_dew", + "amount": 2, + "mode": "fluid" + } + ], + "outputs": [ + { + "itemId": "proof_seed", + "amount": 1 + } + ], + "manaPerSecond": 1, + "entropy": 0, + "conditions": [], + "tags": [ + "life", + "seed" + ], + "notes": "首次进入魔林时由引导妖精露启动。", + "enabled": true + }, + { + "id": "grow_proof_seed", + "name": "共生生长", + "stage": "t2_life", + "biome": "verdant_forest", + "machineId": "seed_bed", + "kind": "growth", + "duration": 12, + "unlockedBy": "L02", + "inputs": [ + { + "itemId": "proof_seed", + "amount": 1, + "mode": "consumed" + }, + { + "itemId": "ley_water", + "amount": 10, + "mode": "fluid" + } + ], + "outputs": [ + { + "itemId": "mature_proof_seed", + "amount": 1 + }, + { + "itemId": "living_wood", + "amount": 4 + }, + { + "itemId": "fairy_dew", + "amount": 4 + }, + { + "itemId": "blight", + "amount": 1, + "chance": 0.05 + } + ], + "manaPerSecond": 1, + "entropy": 0, + "conditions": [ + "生态余额低于 0 时停止生长", + "局部过密会提高枯萎概率" + ], + "tags": [ + "life", + "growth" + ], + "notes": "生机产线的生产段。", + "enabled": true + }, + { + "id": "harvest_life_proof", + "name": "采收并回种", + "stage": "t2_life", + "biome": "verdant_forest", + "machineId": "harvest_circle", + "kind": "growth", + "duration": 5, + "unlockedBy": "L03", + "inputs": [ + { + "itemId": "mature_proof_seed", + "amount": 1, + "mode": "consumed" + }, + { + "itemId": "fairy_dew", + "amount": 1, + "mode": "fluid" + } + ], + "outputs": [ + { + "itemId": "life_proof", + "amount": 1 + }, + { + "itemId": "wild_proof_seed", + "amount": 1 + } + ], + "manaPerSecond": 1, + "entropy": 0, + "conditions": [ + "完成时区域生态余额必须不小于 0" + ], + "tags": [ + "life", + "proof", + "cycle" + ], + "notes": "把种子送回起点,构成闭环。", + "enabled": true + }, + { + "id": "weave_root_fiber", + "name": "编织根脉纤维", + "stage": "t2_life", + "biome": "verdant_forest", + "machineId": "root_loom", + "kind": "craft", + "duration": 4, + "unlockedBy": "L04", + "inputs": [ + { + "itemId": "living_wood", + "amount": 2, + "mode": "consumed" + }, + { + "itemId": "fairy_dew", + "amount": 2, + "mode": "fluid" + } + ], + "outputs": [ + { + "itemId": "root_fiber", + "amount": 2 + } + ], + "manaPerSecond": 1, + "entropy": 0, + "conditions": [], + "tags": [ + "life", + "component" + ], + "notes": "根轨和生命锚构件。", + "enabled": true + }, + { + "id": "recover_blight", + "name": "净化枯萎", + "stage": "t2_life", + "biome": "verdant_forest", + "machineId": "harvest_circle", + "kind": "recovery", + "duration": 8, + "unlockedBy": "L05", + "inputs": [ + { + "itemId": "blight", + "amount": 2, + "mode": "consumed" + }, + { + "itemId": "fairy_dew", + "amount": 5, + "mode": "fluid" + } + ], + "outputs": [ + { + "itemId": "wild_proof_seed", + "amount": 1 + }, + { + "itemId": "rune_clay", + "amount": 1 + } + ], + "manaPerSecond": 1, + "entropy": 0, + "conditions": [], + "tags": [ + "life", + "recovery" + ], + "notes": "标准难度下的枯萎恢复路径。", + "enabled": true + }, + { + "id": "forge_life_anchor", + "name": "凝聚生命锚核", + "stage": "t2_life", + "biome": "verdant_forest", + "machineId": "root_loom", + "kind": "ritual", + "duration": 20, + "unlockedBy": "L08", + "inputs": [ + { + "itemId": "life_proof", + "amount": 20, + "mode": "consumed" + }, + { + "itemId": "living_wood", + "amount": 10, + "mode": "consumed" + }, + { + "itemId": "root_fiber", + "amount": 10, + "mode": "consumed" + }, + { + "itemId": "awakened_crystal", + "amount": 5, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "life_anchor_core", + "amount": 1 + } + ], + "manaPerSecond": 5, + "entropy": 0, + "conditions": [ + "生态余额保持非负" + ], + "tags": [ + "life", + "anchor" + ], + "notes": "首次门环只需要一枚,但门后锚定会持续消耗维护材料。", + "enabled": true + }, + { + "id": "make_memory_blank", + "name": "制作记忆坯", + "stage": "t2_death", + "biome": "silent_dead", + "machineId": "soul_lamp", + "kind": "craft", + "duration": 3, + "unlockedBy": "D02", + "inputs": [ + { + "itemId": "blank_tablet", + "amount": 1, + "mode": "consumed" + }, + { + "itemId": "soul_ember", + "amount": 1, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "memory_blank", + "amount": 1 + } + ], + "manaPerSecond": 1, + "entropy": 0, + "conditions": [], + "tags": [ + "death", + "memory" + ], + "notes": "为腐朽论证准备可识别身份。", + "enabled": true + }, + { + "id": "decay_memory", + "name": "可控腐朽", + "stage": "t2_death", + "biome": "silent_dead", + "machineId": "decay_chamber", + "kind": "decay", + "duration": 15, + "unlockedBy": "D02", + "inputs": [ + { + "itemId": "memory_blank", + "amount": 1, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "faded_memory", + "amount": 1 + }, + { + "itemId": "bone_dust", + "amount": 2 + } + ], + "manaPerSecond": 0, + "entropy": 0, + "conditions": [ + "物品必须完整经历 15 秒腐朽计时", + "离开亡雾会暂停而非重置" + ], + "tags": [ + "death", + "decay", + "state" + ], + "notes": "利用损坏本身作为加工步骤。", + "enabled": true + }, + { + "id": "recall_death_proof", + "name": "魂灯召回论证", + "stage": "t2_death", + "biome": "silent_dead", + "machineId": "soul_lamp", + "kind": "decay", + "duration": 6, + "unlockedBy": "D03", + "inputs": [ + { + "itemId": "faded_memory", + "amount": 1, + "mode": "consumed" + }, + { + "itemId": "soul_ember", + "amount": 1, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "death_proof", + "amount": 1 + }, + { + "itemId": "recovered_memory", + "amount": 1 + } + ], + "manaPerSecond": 1, + "entropy": 0, + "conditions": [ + "褪色记忆仍保留原材料类别" + ], + "tags": [ + "death", + "proof", + "memory" + ], + "notes": "幽冥论证闭环的召回段。", + "enabled": true + }, + { + "id": "recycle_bone_dust", + "name": "轮回骨尘", + "stage": "t2_death", + "biome": "silent_dead", + "machineId": "soul_lamp", + "kind": "recovery", + "duration": 8, + "unlockedBy": "D05", + "inputs": [ + { + "itemId": "bone_dust", + "amount": 5, + "mode": "consumed" + }, + { + "itemId": "soul_ember", + "amount": 1, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "rune_clay", + "amount": 2 + }, + { + "itemId": "star_iron_ore", + "amount": 1 + } + ], + "manaPerSecond": 1, + "entropy": 0, + "conditions": [], + "tags": [ + "death", + "recovery" + ], + "notes": "亡域失败产物的确定性恢复路线。", + "enabled": true + }, + { + "id": "forge_death_anchor", + "name": "凝聚亡者锚核", + "stage": "t2_death", + "biome": "silent_dead", + "machineId": "soul_lamp", + "kind": "ritual", + "duration": 20, + "unlockedBy": "D08", + "inputs": [ + { + "itemId": "death_proof", + "amount": 20, + "mode": "consumed" + }, + { + "itemId": "recovered_memory", + "amount": 10, + "mode": "consumed" + }, + { + "itemId": "bone_dust", + "amount": 10, + "mode": "consumed" + }, + { + "itemId": "awakened_crystal", + "amount": 5, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "death_anchor_core", + "amount": 1 + } + ], + "manaPerSecond": 5, + "entropy": 0, + "conditions": [ + "魂灯网络至少保留 10 点灵火" + ], + "tags": [ + "death", + "anchor" + ], + "notes": "固定腐朽法则。", + "enabled": true + }, + { + "id": "brew_twilight_reagent", + "name": "调和暮光合剂", + "stage": "t3", + "biome": "ember_wastes", + "machineId": "twilight_crucible", + "kind": "craft", + "duration": 8, + "unlockedBy": "E01", + "inputs": [ + { + "itemId": "fairy_dew", + "amount": 4, + "mode": "fluid" + }, + { + "itemId": "recovered_memory", + "amount": 2, + "mode": "consumed" + }, + { + "itemId": "life_proof", + "amount": 1, + "mode": "consumed" + }, + { + "itemId": "death_proof", + "amount": 1, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "twilight_reagent", + "amount": 4 + } + ], + "manaPerSecond": 3, + "entropy": 0, + "conditions": [ + "生机与幽冥频率误差低于 15%" + ], + "tags": [ + "life", + "death", + "alchemy" + ], + "notes": "T2 两条路线的第一次实体汇合。", + "enabled": true + }, + { + "id": "make_refractory_coating", + "name": "制作焚风护层", + "stage": "t3", + "biome": "ember_wastes", + "machineId": "twilight_crucible", + "kind": "craft", + "duration": 5, + "unlockedBy": "E02", + "inputs": [ + { + "itemId": "twilight_reagent", + "amount": 2, + "mode": "fluid" + }, + { + "itemId": "star_iron_ingot", + "amount": 2, + "mode": "consumed" + }, + { + "itemId": "root_fiber", + "amount": 1, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "refractory_coating", + "amount": 2 + } + ], + "manaPerSecond": 2, + "entropy": 0, + "conditions": [], + "tags": [ + "element", + "heatproof" + ], + "notes": "打开赤烬物流走廊。", + "enabled": true + }, + { + "id": "prepare_phase_medium", + "name": "配制炼相介质", + "stage": "t3", + "biome": "ember_wastes", + "machineId": "twilight_crucible", + "kind": "craft", + "duration": 6, + "unlockedBy": "E03", + "inputs": [ + { + "itemId": "awakened_crystal", + "amount": 2, + "mode": "consumed" + }, + { + "itemId": "twilight_reagent", + "amount": 2, + "mode": "fluid" + }, + { + "itemId": "star_iron_ingot", + "amount": 1, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "phase_medium", + "amount": 1 + } + ], + "manaPerSecond": 2, + "entropy": 0, + "conditions": [], + "tags": [ + "element", + "state" + ], + "notes": "三态循环不会消耗其主体质量。", + "enabled": true + }, + { + "id": "chill_phase_medium", + "name": "低温炼相", + "stage": "t3", + "biome": "ember_wastes", + "machineId": "frost_gate", + "kind": "state", + "duration": 5, + "unlockedBy": "E04", + "inputs": [ + { + "itemId": "phase_medium", + "amount": 1, + "mode": "state" + } + ], + "outputs": [ + { + "itemId": "cold_phase_medium", + "amount": 1 + } + ], + "manaPerSecond": 3, + "entropy": 0, + "conditions": [ + "出口温度不高于 -20°C" + ], + "tags": [ + "element", + "cold", + "state" + ], + "notes": "三态循环第一步。", + "enabled": true + }, + { + "id": "melt_phase_medium", + "name": "熔融炼相", + "stage": "t3", + "biome": "ember_wastes", + "machineId": "thermal_phase_furnace", + "kind": "state", + "duration": 6, + "unlockedBy": "E04", + "inputs": [ + { + "itemId": "cold_phase_medium", + "amount": 1, + "mode": "state" + }, + { + "itemId": "refractory_coating", + "amount": 0.1, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "molten_phase_medium", + "amount": 1 + }, + { + "itemId": "slag", + "amount": 0.2 + } + ], + "manaPerSecond": 4, + "entropy": 0, + "conditions": [ + "核心温度至少 900°C" + ], + "tags": [ + "element", + "hot", + "state" + ], + "notes": "三态循环第二步。", + "enabled": true + }, + { + "id": "charge_phase_medium", + "name": "充能炼相", + "stage": "t3", + "biome": "ember_wastes", + "machineId": "charge_altar", + "kind": "state", + "duration": 6, + "unlockedBy": "E04", + "inputs": [ + { + "itemId": "molten_phase_medium", + "amount": 1, + "mode": "state" + }, + { + "itemId": "awakened_crystal", + "amount": 1, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "charged_phase_medium", + "amount": 1 + } + ], + "manaPerSecond": 5, + "entropy": 0, + "conditions": [ + "介质温度仍高于 600°C" + ], + "tags": [ + "element", + "charged", + "state" + ], + "notes": "三态循环第三步。", + "enabled": true + }, + { + "id": "prove_element_cycle", + "name": "封存元素论证", + "stage": "t3", + "biome": "ember_wastes", + "machineId": "twilight_crucible", + "kind": "state", + "duration": 4, + "unlockedBy": "E05", + "inputs": [ + { + "itemId": "charged_phase_medium", + "amount": 1, + "mode": "state" + }, + { + "itemId": "blank_tablet", + "amount": 1, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "elemental_proof", + "amount": 1 + }, + { + "itemId": "phase_medium", + "amount": 1 + } + ], + "manaPerSecond": 2, + "entropy": 0, + "conditions": [ + "同一炼相介质必须连续经历低温、熔融、充能" + ], + "tags": [ + "element", + "proof", + "cycle" + ], + "notes": "主体介质回到循环起点。", + "enabled": true + }, + { + "id": "fire_dragon_glass", + "name": "烧结龙玻璃", + "stage": "t3", + "biome": "ember_wastes", + "machineId": "dragon_kiln", + "kind": "state", + "duration": 12, + "unlockedBy": "E08", + "inputs": [ + { + "itemId": "molten_phase_medium", + "amount": 2, + "mode": "state" + }, + { + "itemId": "refractory_coating", + "amount": 2, + "mode": "consumed" + }, + { + "itemId": "living_wood", + "amount": 2, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "dragon_glass", + "amount": 2 + }, + { + "itemId": "slag", + "amount": 1 + } + ], + "manaPerSecond": 6, + "entropy": 0, + "conditions": [ + "窑温维持 1000°C 以上" + ], + "tags": [ + "element", + "portal" + ], + "notes": "首次门环主要吞吐压力。", + "enabled": true + }, + { + "id": "forge_ember_core", + "name": "凝聚熔火核心", + "stage": "t3", + "biome": "ember_wastes", + "machineId": "dragon_kiln", + "kind": "ritual", + "duration": 20, + "unlockedBy": "E08", + "inputs": [ + { + "itemId": "dragon_glass", + "amount": 4, + "mode": "consumed" + }, + { + "itemId": "charged_phase_medium", + "amount": 2, + "mode": "state" + }, + { + "itemId": "elemental_proof", + "amount": 5, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "ember_core", + "amount": 1 + } + ], + "manaPerSecond": 8, + "entropy": 0, + "conditions": [ + "连续高热供能" + ], + "tags": [ + "element", + "anchor" + ], + "notes": "门环四锚之一。", + "enabled": true + }, + { + "id": "press_name_strip", + "name": "制作空白真名试片", + "stage": "t4", + "biome": "mirror_marsh", + "machineId": "true_name_loom", + "kind": "craft", + "duration": 4, + "unlockedBy": "S01", + "inputs": [ + { + "itemId": "dragon_glass", + "amount": 1, + "mode": "consumed" + }, + { + "itemId": "blank_tablet", + "amount": 1, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "name_strip_blank", + "amount": 1 + } + ], + "manaPerSecond": 2, + "entropy": 0, + "conditions": [], + "tags": [ + "dimension", + "true_name" + ], + "notes": "镜界实验基底。", + "enabled": true + }, + { + "id": "name_test_strip", + "name": "写入空间真名", + "stage": "t4", + "biome": "mirror_marsh", + "machineId": "true_name_loom", + "kind": "inscription", + "duration": 5, + "unlockedBy": "S01", + "inputs": [ + { + "itemId": "name_strip_blank", + "amount": 1, + "mode": "consumed" + }, + { + "itemId": "true_name_thread", + "amount": 2, + "mode": "consumed" + }, + { + "itemId": "inscription_proof", + "amount": 1, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "named_test_strip", + "amount": 1 + } + ], + "manaPerSecond": 3, + "entropy": 0.2, + "conditions": [ + "入口和出口必须共享同一空间真名" + ], + "tags": [ + "dimension", + "true_name" + ], + "notes": "命名后才能稳定通过镜像端点。", + "enabled": true + }, + { + "id": "mirror_round_trip", + "name": "镜像往返", + "stage": "t4", + "biome": "mirror_marsh", + "machineId": "mirror_endpoint", + "kind": "state", + "duration": 8, + "unlockedBy": "S02", + "inputs": [ + { + "itemId": "named_test_strip", + "amount": 1, + "mode": "state" + } + ], + "outputs": [ + { + "itemId": "returned_test_strip", + "amount": 1 + }, + { + "itemId": "mirror_echo", + "amount": 1 + } + ], + "manaPerSecond": 5, + "entropy": 1, + "conditions": [ + "入口与出口真名一致", + "未命名路径会回到错误出口" + ], + "tags": [ + "dimension", + "transport", + "echo" + ], + "notes": "明确产生少量可处理熵。", + "enabled": true + }, + { + "id": "separate_dimension_proof", + "name": "分离维度论证", + "stage": "t4", + "biome": "mirror_marsh", + "machineId": "echo_separator", + "kind": "separation", + "duration": 6, + "unlockedBy": "S04", + "inputs": [ + { + "itemId": "returned_test_strip", + "amount": 1, + "mode": "consumed" + }, + { + "itemId": "mirror_echo", + "amount": 1, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "dimension_proof", + "amount": 1 + }, + { + "itemId": "named_test_strip", + "amount": 1 + }, + { + "itemId": "shadow_matter", + "amount": 0.25 + } + ], + "manaPerSecond": 4, + "entropy": 0.5, + "conditions": [ + "归返试片真名与原始记录一致" + ], + "tags": [ + "dimension", + "proof", + "cycle" + ], + "notes": "试片回到往返循环起点。", + "enabled": true + }, + { + "id": "plot_mirror_coordinate", + "name": "编织镜界坐标", + "stage": "t4", + "biome": "mirror_marsh", + "machineId": "true_name_loom", + "kind": "inscription", + "duration": 7, + "unlockedBy": "S05", + "inputs": [ + { + "itemId": "dimension_proof", + "amount": 2, + "mode": "consumed" + }, + { + "itemId": "mirror_echo", + "amount": 2, + "mode": "consumed" + }, + { + "itemId": "true_name_thread", + "amount": 1, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "mirror_coordinate", + "amount": 2 + } + ], + "manaPerSecond": 4, + "entropy": 0.5, + "conditions": [], + "tags": [ + "dimension", + "coordinate" + ], + "notes": "首次折跃的镜界供物来源。", + "enabled": true + }, + { + "id": "forge_space_anchor", + "name": "凝聚空间锚核", + "stage": "t4", + "biome": "mirror_marsh", + "machineId": "identity_forge", + "kind": "ritual", + "duration": 24, + "unlockedBy": "S08", + "inputs": [ + { + "itemId": "dimension_proof", + "amount": 20, + "mode": "consumed" + }, + { + "itemId": "dragon_glass", + "amount": 10, + "mode": "consumed" + }, + { + "itemId": "shadow_matter", + "amount": 5, + "mode": "consumed" + }, + { + "itemId": "awakened_crystal", + "amount": 5, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "space_anchor_core", + "amount": 1 + } + ], + "manaPerSecond": 8, + "entropy": 2, + "conditions": [ + "同一性锚锁定空间标签" + ], + "tags": [ + "dimension", + "anchor" + ], + "notes": "门环四锚之一。", + "enabled": true + }, + { + "id": "mason_boundary_stone", + "name": "砌筑环界石", + "stage": "t5", + "biome": "rift_gate", + "machineId": "ring_mason", + "kind": "craft", + "duration": 15, + "unlockedBy": "G02", + "inputs": [ + { + "itemId": "dragon_glass", + "amount": 4, + "mode": "consumed" + }, + { + "itemId": "living_wood", + "amount": 4, + "mode": "consumed" + }, + { + "itemId": "recovered_memory", + "amount": 2, + "mode": "consumed" + }, + { + "itemId": "mirror_echo", + "amount": 2, + "mode": "consumed" + }, + { + "itemId": "refractory_coating", + "amount": 2, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "boundary_stone", + "amount": 1 + } + ], + "manaPerSecond": 6, + "entropy": 0.5, + "conditions": [], + "tags": [ + "portal", + "structure" + ], + "notes": "首次折跃需要十二块,作为仪式催化结构不被消耗。", + "enabled": true + }, + { + "id": "prepare_life_offering", + "name": "制作生命供物", + "stage": "t5", + "biome": "rift_gate", + "machineId": "offering_altar", + "kind": "ritual", + "duration": 3, + "unlockedBy": "G04", + "inputs": [ + { + "itemId": "proof_seed", + "amount": 1, + "mode": "consumed" + }, + { + "itemId": "fairy_dew", + "amount": 2, + "mode": "fluid" + } + ], + "outputs": [ + { + "itemId": "life_offering", + "amount": 1 + } + ], + "manaPerSecond": 2, + "entropy": 0, + "conditions": [], + "tags": [ + "portal", + "life" + ], + "notes": "同步仪式一路。", + "enabled": true + }, + { + "id": "prepare_death_offering", + "name": "制作亡者供物", + "stage": "t5", + "biome": "rift_gate", + "machineId": "offering_altar", + "kind": "ritual", + "duration": 3, + "unlockedBy": "G04", + "inputs": [ + { + "itemId": "recovered_memory", + "amount": 1, + "mode": "consumed" + }, + { + "itemId": "bone_dust", + "amount": 2, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "death_offering", + "amount": 1 + } + ], + "manaPerSecond": 2, + "entropy": 0, + "conditions": [], + "tags": [ + "portal", + "death" + ], + "notes": "同步仪式一路。", + "enabled": true + }, + { + "id": "prepare_ember_offering", + "name": "制作熔火供物", + "stage": "t5", + "biome": "rift_gate", + "machineId": "offering_altar", + "kind": "ritual", + "duration": 3, + "unlockedBy": "G04", + "inputs": [ + { + "itemId": "ember_core", + "amount": 1, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "ember_offering", + "amount": 4 + } + ], + "manaPerSecond": 3, + "entropy": 0, + "conditions": [], + "tags": [ + "portal", + "element" + ], + "notes": "同步仪式一路。", + "enabled": true + }, + { + "id": "prepare_mirror_offering", + "name": "制作镜界供物", + "stage": "t5", + "biome": "rift_gate", + "machineId": "offering_altar", + "kind": "ritual", + "duration": 3, + "unlockedBy": "G04", + "inputs": [ + { + "itemId": "mirror_coordinate", + "amount": 1, + "mode": "consumed" + }, + { + "itemId": "shadow_matter", + "amount": 0.25, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "mirror_offering", + "amount": 1 + } + ], + "manaPerSecond": 3, + "entropy": 0.5, + "conditions": [], + "tags": [ + "portal", + "dimension" + ], + "notes": "同步仪式一路。", + "enabled": true + }, + { + "id": "condense_entropy_crystal", + "name": "凝结熵晶", + "stage": "t5", + "biome": "rift_gate", + "machineId": "identity_forge", + "kind": "separation", + "duration": 8, + "unlockedBy": "G05", + "inputs": [ + { + "itemId": "shadow_matter", + "amount": 4, + "mode": "consumed" + }, + { + "itemId": "slag", + "amount": 2, + "mode": "consumed" + }, + { + "itemId": "awakened_crystal", + "amount": 1, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "entropy_crystal", + "amount": 1 + } + ], + "manaPerSecond": 5, + "entropy": 0, + "conditions": [ + "从熵槽抽取至少 5 点仪式熵" + ], + "tags": [ + "portal", + "entropy" + ], + "notes": "熵槽结构与门后研究材料。", + "enabled": true + }, + { + "id": "assemble_walker_construct", + "name": "组装界行者役偶", + "stage": "t5", + "biome": "rift_gate", + "machineId": "ring_mason", + "kind": "craft", + "duration": 30, + "unlockedBy": "G08", + "inputs": [ + { + "itemId": "clay_construct", + "amount": 1, + "mode": "consumed" + }, + { + "itemId": "life_proof", + "amount": 10, + "mode": "consumed" + }, + { + "itemId": "death_proof", + "amount": 10, + "mode": "consumed" + }, + { + "itemId": "elemental_proof", + "amount": 10, + "mode": "consumed" + }, + { + "itemId": "dimension_proof", + "amount": 10, + "mode": "consumed" + }, + { + "itemId": "entropy_crystal", + "amount": 2, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "walker_construct", + "amount": 1 + } + ], + "manaPerSecond": 10, + "entropy": 1, + "conditions": [], + "tags": [ + "portal", + "construct" + ], + "notes": "首次折跃的载荷与胜利见证者。", + "enabled": true + }, + { + "id": "perform_first_warp", + "name": "执行首次折跃", + "stage": "t5", + "biome": "rift_gate", + "machineId": "grand_ritual", + "kind": "ritual", + "duration": 180, + "unlockedBy": "G09", + "inputs": [ + { + "itemId": "boundary_stone", + "amount": 12, + "mode": "catalyst" + }, + { + "itemId": "life_anchor_core", + "amount": 1, + "mode": "catalyst" + }, + { + "itemId": "death_anchor_core", + "amount": 1, + "mode": "catalyst" + }, + { + "itemId": "ember_core", + "amount": 1, + "mode": "catalyst" + }, + { + "itemId": "space_anchor_core", + "amount": 1, + "mode": "catalyst" + }, + { + "itemId": "life_offering", + "amount": 60, + "mode": "consumed" + }, + { + "itemId": "death_offering", + "amount": 60, + "mode": "consumed" + }, + { + "itemId": "ember_offering", + "amount": 60, + "mode": "consumed" + }, + { + "itemId": "mirror_offering", + "amount": 60, + "mode": "consumed" + }, + { + "itemId": "walker_construct", + "amount": 1, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "first_warp_record", + "amount": 1 + } + ], + "manaPerSecond": 100, + "entropy": 20, + "conditions": [ + "四路供物到达误差不超过 4 秒", + "四种魔力各 25/秒且偏差不超过 10%", + "仪式熵低于 25", + "完成后界行者役偶开始穿越孔径" + ], + "tags": [ + "portal", + "victory", + "synchronized" + ], + "notes": "首次折跃无随机失败;产出帧记录通关时间。", + "enabled": true + }, + { + "id": "press_life_tribute", + "name": "压制生机贡块", + "stage": "post", + "biome": "post_rift", + "machineId": "tribute_press", + "kind": "craft", + "duration": 2, + "unlockedBy": "X00", + "inputs": [ + { + "itemId": "living_wood", + "amount": 10, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "tribute_block", + "amount": 10 + } + ], + "manaPerSecond": 2, + "entropy": 0, + "conditions": [], + "tags": [ + "portal", + "life", + "mass" + ], + "notes": "保留生机标签,影响门后结果池。", + "enabled": true + }, + { + "id": "press_death_tribute", + "name": "压制幽冥贡块", + "stage": "post", + "biome": "post_rift", + "machineId": "tribute_press", + "kind": "craft", + "duration": 2, + "unlockedBy": "X00", + "inputs": [ + { + "itemId": "bone_dust", + "amount": 10, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "tribute_block", + "amount": 10 + } + ], + "manaPerSecond": 2, + "entropy": 0, + "conditions": [], + "tags": [ + "portal", + "death", + "mass" + ], + "notes": "保留幽冥标签,影响门后结果池。", + "enabled": true + }, + { + "id": "press_element_tribute", + "name": "压制元素贡块", + "stage": "post", + "biome": "post_rift", + "machineId": "tribute_press", + "kind": "craft", + "duration": 2, + "unlockedBy": "X00", + "inputs": [ + { + "itemId": "slag", + "amount": 10, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "tribute_block", + "amount": 10 + } + ], + "manaPerSecond": 2, + "entropy": 0, + "conditions": [], + "tags": [ + "portal", + "element", + "mass" + ], + "notes": "保留元素标签,影响门后结果池。", + "enabled": true + }, + { + "id": "press_mirror_tribute", + "name": "压制镜界贡块", + "stage": "post", + "biome": "post_rift", + "machineId": "tribute_press", + "kind": "craft", + "duration": 2, + "unlockedBy": "X00", + "inputs": [ + { + "itemId": "shadow_matter", + "amount": 10, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "tribute_block", + "amount": 10 + } + ], + "manaPerSecond": 2, + "entropy": 1, + "conditions": [], + "tags": [ + "portal", + "dimension", + "mass" + ], + "notes": "提高稀有结果和熵。", + "enabled": true + }, + { + "id": "exchange_unfocused", + "name": "无锚异界交换", + "stage": "post", + "biome": "post_rift", + "machineId": "dimensional_gate", + "kind": "result_bag", + "duration": 30, + "unlockedBy": "X00", + "inputs": [ + { + "itemId": "tribute_block", + "amount": 100, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "star_iron_ore", + "amount": 30, + "min": 25, + "max": 35, + "weight": 30 + }, + { + "itemId": "living_wood", + "amount": 20, + "min": 15, + "max": 25, + "weight": 20 + }, + { + "itemId": "bone_dust", + "amount": 20, + "min": 15, + "max": 25, + "weight": 20 + }, + { + "itemId": "dragon_glass", + "amount": 12, + "min": 8, + "max": 15, + "weight": 15 + }, + { + "itemId": "paradox_residue", + "amount": 12, + "min": 10, + "max": 15, + "weight": 15 + } + ], + "manaPerSecond": 30, + "entropy": 12, + "conditions": [ + "每 100 质量生成一个确定结果袋", + "袋内顺序随机但总量区间固定" + ], + "tags": [ + "portal", + "result_bag", + "unfocused" + ], + "notes": "总回收率高,输出池最大。", + "enabled": true + }, + { + "id": "exchange_life_anchored", + "name": "生机锚定交换", + "stage": "post", + "biome": "post_rift", + "machineId": "dimensional_gate", + "kind": "result_bag", + "duration": 34, + "unlockedBy": "X02", + "inputs": [ + { + "itemId": "tribute_block", + "amount": 100, + "mode": "consumed" + }, + { + "itemId": "life_anchor_core", + "amount": 1, + "mode": "catalyst" + } + ], + "outputs": [ + { + "itemId": "living_wood", + "amount": 58, + "min": 50, + "max": 65, + "weight": 60 + }, + { + "itemId": "fairy_dew", + "amount": 15, + "min": 10, + "max": 20, + "weight": 20 + }, + { + "itemId": "star_iron_ore", + "amount": 8, + "min": 5, + "max": 10, + "weight": 10 + }, + { + "itemId": "paradox_residue", + "amount": 12, + "min": 10, + "max": 15, + "weight": 10 + } + ], + "manaPerSecond": 35, + "entropy": 15, + "conditions": [ + "生命锚在线", + "结果袋权重合计 100" + ], + "tags": [ + "portal", + "result_bag", + "life", + "anchored" + ], + "notes": "减少魔林扩建压力,但需要处理残渣。", + "enabled": true + }, + { + "id": "exchange_element_anchored", + "name": "元素锚定交换", + "stage": "post", + "biome": "post_rift", + "machineId": "dimensional_gate", + "kind": "result_bag", + "duration": 36, + "unlockedBy": "X02", + "inputs": [ + { + "itemId": "tribute_block", + "amount": 100, + "mode": "consumed" + }, + { + "itemId": "ember_core", + "amount": 1, + "mode": "catalyst" + } + ], + "outputs": [ + { + "itemId": "dragon_glass", + "amount": 50, + "min": 42, + "max": 58, + "weight": 55 + }, + { + "itemId": "star_iron_ore", + "amount": 18, + "min": 12, + "max": 22, + "weight": 20 + }, + { + "itemId": "slag", + "amount": 12, + "min": 8, + "max": 16, + "weight": 15 + }, + { + "itemId": "paradox_residue", + "amount": 12, + "min": 10, + "max": 15, + "weight": 10 + } + ], + "manaPerSecond": 40, + "entropy": 18, + "conditions": [ + "熔火核心在线", + "结果袋权重合计 100" + ], + "tags": [ + "portal", + "result_bag", + "element", + "anchored" + ], + "notes": "龙玻璃补产的高复杂度替代路线。", + "enabled": true + }, + { + "id": "exchange_true_name_dragon_glass", + "name": "真名投送:龙玻璃", + "stage": "post", + "biome": "post_rift", + "machineId": "dimensional_gate", + "kind": "result_bag", + "duration": 45, + "unlockedBy": "X09", + "inputs": [ + { + "itemId": "tribute_block", + "amount": 100, + "mode": "consumed" + }, + { + "itemId": "space_anchor_core", + "amount": 1, + "mode": "catalyst" + }, + { + "itemId": "entropy_crystal", + "amount": 2, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "dragon_glass", + "amount": 60, + "min": 55, + "max": 65, + "weight": 65 + }, + { + "itemId": "star_iron_ore", + "amount": 8, + "min": 5, + "max": 10, + "weight": 10 + }, + { + "itemId": "slag", + "amount": 8, + "min": 5, + "max": 10, + "weight": 10 + }, + { + "itemId": "paradox_residue", + "amount": 20, + "min": 18, + "max": 24, + "weight": 15 + } + ], + "manaPerSecond": 55, + "entropy": 28, + "conditions": [ + "空间锚锁定 dragon_glass 真名", + "结果袋权重合计 100" + ], + "tags": [ + "portal", + "result_bag", + "true_name", + "element" + ], + "notes": "精准但昂贵,不能取代所有常规采集。", + "enabled": true + }, + { + "id": "condense_paradox_proof", + "name": "冷凝悖论论证", + "stage": "post", + "biome": "post_rift", + "machineId": "paradox_condenser", + "kind": "recovery", + "duration": 10, + "unlockedBy": "X00", + "inputs": [ + { + "itemId": "paradox_residue", + "amount": 10, + "mode": "consumed" + }, + { + "itemId": "shadow_matter", + "amount": 2, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "paradox_proof", + "amount": 1 + } + ], + "manaPerSecond": 6, + "entropy": 0, + "conditions": [ + "传送门当前熵至少 25" + ], + "tags": [ + "paradox", + "proof", + "recovery" + ], + "notes": "把门后复杂度转为科研资源。", + "enabled": true + }, + { + "id": "capture_anomaly_relic", + "name": "捕获异界遗物", + "stage": "post", + "biome": "post_rift", + "machineId": "paradox_condenser", + "kind": "result_bag", + "duration": 30, + "unlockedBy": "X08", + "inputs": [ + { + "itemId": "paradox_residue", + "amount": 25, + "mode": "consumed" + }, + { + "itemId": "entropy_crystal", + "amount": 5, + "mode": "consumed" + } + ], + "outputs": [ + { + "itemId": "anomaly_relic", + "amount": 1, + "chance": 0.08 + }, + { + "itemId": "paradox_residue", + "amount": 20, + "chance": 0.92 + } + ], + "manaPerSecond": 10, + "entropy": 12, + "conditions": [ + "传送门熵位于 75—99", + "失败结果仍返回可回收残渣" + ], + "tags": [ + "paradox", + "relic", + "optional", + "cycle" + ], + "notes": "稀有结果只服务可选玩法,绝不阻塞主线。", + "enabled": true + } + ] +} diff --git a/data/recipe-book.schema.json b/data/recipe-book.schema.json new file mode 100644 index 0000000..a394180 --- /dev/null +++ b/data/recipe-book.schema.json @@ -0,0 +1,144 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://mana-foundry.local/schema/recipe-book.schema.json", + "title": "Mana Foundry Recipe Book", + "type": "object", + "required": ["schemaVersion", "metadata", "stages", "biomes", "machines", "items", "recipes"], + "properties": { + "schemaVersion": { "type": "integer", "const": 1 }, + "metadata": { + "type": "object", + "required": ["title", "revision"], + "properties": { + "title": { "type": "string", "minLength": 1 }, + "revision": { "type": "string", "minLength": 1 }, + "description": { "type": "string" }, + "updatedAt": { "type": "string" } + }, + "additionalProperties": false + }, + "stages": { + "type": "array", + "items": { "$ref": "#/$defs/stage" } + }, + "biomes": { + "type": "array", + "items": { "$ref": "#/$defs/biome" } + }, + "machines": { + "type": "array", + "items": { "$ref": "#/$defs/machine" } + }, + "items": { + "type": "array", + "items": { "$ref": "#/$defs/item" } + }, + "recipes": { + "type": "array", + "items": { "$ref": "#/$defs/recipe" } + } + }, + "additionalProperties": false, + "$defs": { + "id": { "type": "string", "pattern": "^[a-z][a-z0-9_]*$" }, + "stage": { + "type": "object", + "required": ["id", "name", "order", "color"], + "properties": { + "id": { "$ref": "#/$defs/id" }, + "name": { "type": "string", "minLength": 1 }, + "order": { "type": "integer", "minimum": 0 }, + "color": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" } + }, + "additionalProperties": false + }, + "biome": { + "type": "object", + "required": ["id", "name", "color", "law"], + "properties": { + "id": { "$ref": "#/$defs/id" }, + "name": { "type": "string", "minLength": 1 }, + "color": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" }, + "law": { "type": "string" } + }, + "additionalProperties": false + }, + "machine": { + "type": "object", + "required": ["id", "name", "stage", "biome", "baseSpeed", "description"], + "properties": { + "id": { "$ref": "#/$defs/id" }, + "name": { "type": "string", "minLength": 1 }, + "stage": { "$ref": "#/$defs/id" }, + "biome": { "$ref": "#/$defs/id" }, + "baseSpeed": { "type": "number", "exclusiveMinimum": 0 }, + "description": { "type": "string" }, + "tags": { "type": "array", "items": { "type": "string" }, "uniqueItems": true } + }, + "additionalProperties": false + }, + "item": { + "type": "object", + "required": ["id", "name", "category", "stage", "biome", "mass", "stackSize", "isRaw", "tags", "notes"], + "properties": { + "id": { "$ref": "#/$defs/id" }, + "name": { "type": "string", "minLength": 1 }, + "category": { "type": "string", "minLength": 1 }, + "stage": { "$ref": "#/$defs/id" }, + "biome": { "$ref": "#/$defs/id" }, + "mass": { "type": "number", "exclusiveMinimum": 0 }, + "stackSize": { "type": "integer", "minimum": 1 }, + "isRaw": { "type": "boolean" }, + "tags": { "type": "array", "items": { "type": "string" }, "uniqueItems": true }, + "notes": { "type": "string" } + }, + "additionalProperties": false + }, + "ingredient": { + "type": "object", + "required": ["itemId", "amount", "mode"], + "properties": { + "itemId": { "$ref": "#/$defs/id" }, + "amount": { "type": "number", "exclusiveMinimum": 0 }, + "mode": { "enum": ["consumed", "catalyst", "fluid", "state"] } + }, + "additionalProperties": false + }, + "product": { + "type": "object", + "required": ["itemId", "amount"], + "properties": { + "itemId": { "$ref": "#/$defs/id" }, + "amount": { "type": "number", "minimum": 0 }, + "min": { "type": "number", "minimum": 0 }, + "max": { "type": "number", "minimum": 0 }, + "chance": { "type": "number", "minimum": 0, "maximum": 1 }, + "weight": { "type": "number", "minimum": 0, "maximum": 100 } + }, + "additionalProperties": false + }, + "recipe": { + "type": "object", + "required": ["id", "name", "stage", "biome", "machineId", "kind", "duration", "unlockedBy", "inputs", "outputs", "manaPerSecond", "entropy", "conditions", "tags", "notes", "enabled"], + "properties": { + "id": { "$ref": "#/$defs/id" }, + "name": { "type": "string", "minLength": 1 }, + "stage": { "$ref": "#/$defs/id" }, + "biome": { "$ref": "#/$defs/id" }, + "machineId": { "$ref": "#/$defs/id" }, + "kind": { "enum": ["craft", "inscription", "growth", "decay", "state", "separation", "ritual", "result_bag", "recovery"] }, + "duration": { "type": "number", "exclusiveMinimum": 0 }, + "unlockedBy": { "type": "string" }, + "inputs": { "type": "array", "items": { "$ref": "#/$defs/ingredient" } }, + "outputs": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/product" } }, + "manaPerSecond": { "type": "number", "minimum": 0 }, + "entropy": { "type": "number", "minimum": 0 }, + "conditions": { "type": "array", "items": { "type": "string" } }, + "tags": { "type": "array", "items": { "type": "string" }, "uniqueItems": true }, + "notes": { "type": "string" }, + "enabled": { "type": "boolean" } + }, + "additionalProperties": false + } + } +} diff --git a/docs/requirements-magic-factorio.md b/docs/requirements-magic-factorio.md new file mode 100644 index 0000000..4e770ab --- /dev/null +++ b/docs/requirements-magic-factorio.md @@ -0,0 +1,78 @@ +# 《魔力工坊》核心体验需求 + +> 2026-08-12,根据科技树 v0.1 评审反馈整理。此文件描述玩家应获得的体验,不规定具体代码实现。 + +## 问题陈述 + +当前方案虽然使用了魔晶、魔力与符文名称,玩家实际执行的仍是常规工厂游戏的采矿、熔炼、装配、升级和最终大宗交货。删除美术与名词后,它与工业题材没有足够可辨识的系统差异;异次元传送门也没有参与通关后的长期生产,因此缺少能让玩家主动实验、讲述意外故事的“好玩的东西”。 + +本作需要解决的问题是:让玩家感觉自己在驯服互相冲突的魔法规律,并把这些规律编进自动化工厂,而不是操作一座更换了贴图的现代工厂。 + +## 玩家任务 + +当我扩建魔法工坊时,我想发现并利用不同生态区的独特规律,把不稳定、带风险的魔法现象转化成可控产线;这样每次解决物流与资源问题时,都像完成了一次魔法实验,而不是把同一种传送带复制到下一片矿区。 + +## 需求优先级 + +### 必须满足 + +1. **魔法改变因果规则。** 至少存在空间刻印、生态培育、灵魂衰变、元素状态和维度折跃五种不同生产动词;不能只是普通机器和原料的改名。 +2. **异次元门是第一次通关目标。** 建立并启动异次元门等效于《Factorio》发射火箭,8/24 小时均以首次成功折跃为结束时刻。 +3. **异次元门在通关后继续工作。** 它必须成为可自动投料、可调谐、会产生新物流问题的核心生产建筑,而不是播放结算动画后失去用途。 +4. **随机变化可利用、可解释、可收拾。** 维度转化能把过剩物质变成当前短缺资源,从而降低纯采集压力;代价是混合输出、熵、副产物和风险。概率必须可见,失败产物必须可回收,主线不能被纯随机卡死。 +5. **生态区是“规则岛”。** 世界表面连续,但荆棘界墙、亡雾、焚风带、折光迷界等物理或法则阻隔限制跨区物流。每个生态区拥有自己的生产规则、资源循环和通关方式。 +6. **保留已有特色资产。** 固定网格、符轨、魔力管网、显式端点桥臂和事件驱动模拟继续存在,但应成为魔法系统的基础层。 +7. **节奏仍满足 8/24 小时。** 高手路线要有可计划的最短闭环;普通路线允许研究舒适科技、探索全部生态区并进行若干次返工。 + +### 应该满足 + +- 玩家可以选择先进入翠绿魔林或亡灵生态区,随后再汇合两种法则,形成早期路线差异。 +- 每个生态区至少有一种本地高效方案和一种昂贵的通用绕过方案。 +- 通关前逐步教会维度随机性的三个部件:混合输出、概率偏置、熵处理,避免终局突然出现陌生系统。 +- 魔法机器的布局关系有意义,例如符文阵邻接、地脉方向或区域共鸣,但不要求玩家进行像素级摆放。 +- 普通玩家可以用自动分拣、缓冲和稳定器把随机系统变得可靠;高手可以接受更高熵来换吞吐。 + +### 可以延后 + +- 完整敌对生物与塔防系统;亡灵生态区可以先以环境规则而不是战斗成立。 +- 真正进入多个完整异次元地图;首版终局通过传送门的物质交换和短时异常事件表现异次元。 +- 大量随机事件、传奇词缀、角色职业与法术战斗。 +- 无限种程序化生态区;首版先做 5 个边界清楚、可平衡的生态区。 + +## 已知约束 + +| 类型 | 约束 | +|---|---| +| 已确认 | Godot 4.7.1、2.5D 固定网格、单机 Windows 优先 | +| 已确认 | 模拟状态独立于场景节点,机器以事件唤醒而非逐帧轮询 | +| 已确认 | 已有符轨、魔力管、魔力源、精炼机、收集仓与显式端点桥臂原型 | +| 已确认 | 当前 Tasks 1—11 是演示范围,完整科技树属于后续全游戏范围 | +| 目标 | 熟练路线 P90 不超过 8 小时;普通首次流程 P75 不超过 24 小时 | +| 边界 | 标准主线暂不依赖战斗,不通过无法预测的随机掉落推进 | + +## 待验证假设 + +| 假设 | 风险 | 最小验证 | +|---|---:|---| +| 玩家愿意经营概率产线 | 高 | 做一个 3 输入池、5 输出池、可视概率、可循环废料的传送门原型 | +| 五个生态区足以支撑 24 小时 | 中 | 用纸面路线和灰盒地图测每区 2—4 小时是否仍有新决策 | +| 两个早期生态区可自由换序 | 中 | 验证任一路线都能取得进入第三生态区所需的生死共鸣材料 | +| 空间符文布局有趣而不繁琐 | 高 | 用 3×3/5×5 固定模板测试,不先做自由绘制符文 | +| 无强制战斗仍有外部压力 | 中 | 先以生长、腐朽、过热和熵泄漏制造可诊断的环境压力 | + +## 验收场景 + +1. **去皮测试:** 隐去名称与美术后,测试者仍能仅凭规则分辨魔林、亡域、烬土和镜域产线。 +2. **生态区测试:** 玩家不能把起始区蓝图原样复制到任何其他生态区并正常运行;必须至少处理一种本地规律。 +3. **传送门测试:** 首次折跃触发通关,但继续游戏后,传送门立刻提供一种有价值且需要自动分拣的新生产循环。 +4. **随机性测试:** 玩家能在界面上预测 100 次投料的大致产出,能通过锚定、催化和降速改变分布,坏结果可回收而不造成死档。 +5. **压力交换测试:** 传送门能减少至少一种稀缺资源的远征需求,但会明显增加分拣、缓存、熵处理或供能复杂度。 +6. **时间测试:** 高手最短路线可跳过非关键生态支线但不能跳过五种核心魔法动词;普通推荐路线在 24 小时内有足够时间修正一次大型布局错误。 + +## 会推翻当前需求的证据 + +- 概率生产即使完全可视、可偏置,仍被多数测试者视为不可控惩罚; +- 生态规律只增加重复操作,没有产生不同布局或策略; +- 为满足 8 小时,高手必须忽略所有魔法系统并退回纯吞吐玩法; +- 传送门成为所有基础资源的最优来源,导致生态区和采集系统失去意义。 + diff --git a/docs/tech-tree-nodes-v0.1.cost.translation b/docs/tech-tree-nodes-v0.1.cost.translation new file mode 100644 index 0000000..96b203b Binary files /dev/null and b/docs/tech-tree-nodes-v0.1.cost.translation differ diff --git a/docs/tech-tree-nodes-v0.1.csv b/docs/tech-tree-nodes-v0.1.csv new file mode 100644 index 0000000..201dbdc --- /dev/null +++ b/docs/tech-tree-nodes-v0.1.csv @@ -0,0 +1,77 @@ +id,tier,route_role,name,prerequisites,cost_packs,cost_sets,seconds_per_set,repeatable,trigger,unlock_summary +P00,T0,M,破损工坊,,,0,0,false,start,手工采集与基础制作 +P01,T0,M,粗炼术,P00,,0,0,false,tutorial,粗炼炉与基础锭 +P02,T0,M,魔晶提纯,P00,,0,0,false,tutorial,魔晶料斗与晶体精炼 +P03,T0,M,机械输运,P01,,0,0,false,tutorial,符轨I与基础收集仓 +P04,T0,M,魔力引流,P02,,0,0,false,tutorial,魔力源I与魔力管I +P05,T0,M,符文学,P01;P02,,0,0,false,tutorial,符文学台与青晶铭片 +C01,T1,M,自动机理I,P05,Q,10,10,false,research,装配机I +C02,T1,M,物流学I,P03;P05,Q,15,10,false,research,分流器I与汇流器I +C03,T1,M,魔力管网I,P04;P05,Q,20,10,false,research,魔力储罐I与网络视图 +C04,T1,M,桥臂学I,C01;C02,Q,25,10,false,research,范围3显式端点桥臂 +C05,T1,C,仓储学I,C02,Q,20,10,false,research,筛选仓与容量限制 +C06,T1,M,采掘术I,C01,Q,30,10,false,research,自动采掘器I +C07,T1,M,精炼术I,C01;P02,Q,35,10,false,research,连续精炼炉I +C08,T1,M,青晶刻印,C06;C07,Q,40,10,false,research,青晶铭片自动生产 +C09,T1,C,研究组织I,C08,Q,45,10,false,research,研究队列与速度加成 +C10,T1,M,平台工程I,C07,Q,50,10,false,research,浮台地板与初始岛扩建 +C11,T1,M,琥珀刻印,C03;C04;C08,Q,75,10,false,research,琥珀铭片与双通道研究所 +A01,T2,M,自动机理II,C01;C11,Q;A,60,15,false,research,装配机II +A02,T2,M,物流学II,C02;C11,Q;A,75,15,false,research,符轨II与优先分流 +A03,T2,M,桥臂学II,C04;C11,Q;A,75,15,false,research,范围7与优先桥臂 +A04,T2,M,魔力稳压,C03;C11,Q;A,80,15,false,research,蓄能器与优先阀 +A05,T2,M,采掘术II,C06;C11,Q;A,90,15,false,research,采掘器II与深层矿脉 +A06,T2,M,灵砂熔融,C07;C11,Q;A,100,15,false,research,魔导玻璃与晶体透镜 +A07,T2,C,符文逻辑,C05;C11,Q;A,100,15,false,research,信号线与条件控制 +A08,T2,C,模块设计I,A01;A06,Q;A,120,15,false,research,速度I与节能I模块 +A09,T2,M,天桥构筑,C10;A02,Q;A,120,15,false,research,相邻浮岛天桥 +A10,T2,M,以太流体处理,A04;A06,Q;A,150,15,false,research,泵储与流体管网 +A11,T2,O,守界术I,C03;A06,Q;A,80,15,false,research,避雷符与局部结界 +A12,T2,M,绯红刻印,A01;A03;A10,Q;A,180,15,false,research,绯红铭片与三通道研究所 +R01,T3,M,元素裂解,A10;A12,Q;A;R,120,20,false,research,元素分离器与溶剂 +R02,T3,M,炼金合成,R01;A12,Q;A;R,140,20,false,research,炼金反应釜与相位胶 +R03,T3,M,热魔循环,A04;R01;A12,Q;A;R,160,20,false,research,热魔轮机与魔力源II +R04,T3,C,物流学III,A02;R02,Q;A;R,180,20,false,research,符轨III与堆叠器 +R05,T3,C,桥臂学III,A03;A07;R01,Q;A;R,180,20,false,research,多端点条件桥臂 +R06,T3,M,自动机理III,A01;R02,Q;A;R,200,20,false,research,固液四输入装配机III +R07,T3,M,精密构件,A06;R02,Q;A;R,220,20,false,research,相位轴承与构装核心 +R08,T3,C,模块设计II,A08;R07,Q;A;R,250,20,false,research,速度II节能II产能I +R09,T3,C,构装傀儡,A07;R06;R07,Q;A;R,300,20,false,research,蓝图与建造傀儡 +R10,T3,M,地脉勘探,A05;R01,Q;A;R,220,20,false,research,深层扫描与资源热图 +R11,T3,O,守界术II,A11;R03;R07,Q;A;R,200,20,false,research,守界塔与傀儡守卫 +R12,T3,M,魔力管网II,A04;R03,Q;A;R,180,20,false,research,魔力干线与分区节点 +R13,T3,M,紫晶刻印,R06;R07;R10;R12,Q;A;R,350,20,false,research,紫晶铭片与四通道研究院 +V01,T4,M,规模生产,R06;R13,Q;A;R;V,250,25,false,research,装配机IV与批量配方 +V02,T4,C,物流枢纽,R04;R09;R13,Q;A;R;V,300,25,false,research,傀儡物流站 +V03,T4,C,折叠仓储,A07;R13,Q;A;R;V,300,25,false,research,大型折叠仓与缓冲仓 +V04,T4,C,建造阵列,R09;V01,Q;A;R;V,350,25,false,research,区域蓝图与远程铺设 +V05,T4,M,浮岛航运,A09;R10;R13,Q;A;R;V,400,25,false,research,天舟与浮岛港 +V06,T4,M,深层地脉采掘,A05;R10;V05,Q;A;R;V,400,25,false,research,天穹石矿场与远端魔力井 +V07,T4,M,魔力管网III,R12;V01,Q;A;R;V,350,25,false,research,高容主干与区域信标 +V08,T4,C,模块设计III,R08;V01;R13,Q;A;R;V,450,25,false,research,速度III节能III产能II +V09,T4,C,生产力学,R08;V01,Q;A;R;V,500,25,false,research,产能III模块与增幅塔 +V10,T4,M,相位冶金,R02;V01;V06,Q;A;R;V,500,25,false,research,相位合金与天穹桁架 +V11,T4,M,灵智核心,R07;V10,Q;A;R;V,550,25,false,research,灵智处理器与稳定器 +V12,T4,O,守界术III,R11;V07,Q;A;R;V,400,25,false,research,浮岛护罩与裂隙抑制 +V13,T4,M,翠光刻印,V07;V10;V11,Q;A;R;V,650,25,false,research,翠光铭片与五通道研究院 +G01,T5,M,灵智自动化,V01;V11;V13,Q;A;R;V;G,400,30,false,research,自适应装配与缺料诊断 +G02,T5,C,相位桥臂,R05;V11;V13,Q;A;R;V;G,450,30,false,research,跨层端点与桥臂增速 +G03,T5,M,折跃物流,V05;V10;V13,Q;A;R;V;G,600,30,false,research,成对折跃门与跨岛货单 +G04,T5,M,源质提取,V06;V10;V13,Q;A;R;V;G,600,30,false,research,裂隙锚与源质火花 +G05,T5,M,永续魔力,V07;G04,Q;A;R;V;G,700,30,false,research,心泉反应炉与魔力源III +G06,T5,C,傀儡网络,V02;G01,Q;A;R;V;G,550,30,false,research,请求式物流与自动补料 +G07,T5,M,天穹工程,V10;G01;G05,Q;A;R;V;G,800,30,false,research,心炉构件台与心炉结构 +G08,T5,C,模块设计IV,V08;G01;G04,Q;A;R;V;G,700,30,false,research,高阶速度节能产能模块 +G09,T5,C,研究组织II,C09;V11;G01,Q;A;R;V;G,500,30,false,research,研究加速与跨岛汇流 +G10,T5,C,全域调度,V02;G01;G03;G06,Q;A;R;V;G,650,30,false,research,跨岛信号与全局调度 +G11,T5,O,守界术IV,V12;G05,Q;A;R;V;G,600,30,false,research,世界护罩与风暴防护 +G12,T5,M,天穹心炉蓝图,G03;G04;G07,Q;A;R;V;G,1000,30,false,research,天穹心炉与输入规范 +G13,T5,M,世界重燃,G05;G12,Q;A;R;V;G,1200,30,false,research,心炉点火流程与胜利判定 +W01,POST,POST,天穹铭片,G13,,0,0,false,victory,天穹铭片持续配方与无限科研 +W02,POST,POST,魔晶采收效率,W01,W,1000,30,true,research,采掘产能每级加10% +W03,POST,POST,魔力传输效率,W01,W,1000,30,true,research,管网容量加5%且损耗减2% +W04,POST,POST,符轨吞吐,W01,W,1500,30,true,research,符轨速度与堆叠每级加10% +W05,POST,POST,桥臂相位,W01,W,1500,30,true,research,桥臂吞吐加10%且每两级范围加1 +W06,POST,POST,构装速度,W01,W,1000,30,true,research,傀儡移动与施工每级加10% +W07,POST,POST,研究压缩,W01,W,2000,30,true,research,研究速度每级加10% +W08,POST,POST,守界共振,W01;G11,W,1000,30,true,research,结界容量与恢复每级加10% diff --git a/docs/tech-tree-nodes-v0.1.csv.import b/docs/tech-tree-nodes-v0.1.csv.import new file mode 100644 index 0000000..977670b --- /dev/null +++ b/docs/tech-tree-nodes-v0.1.csv.import @@ -0,0 +1,19 @@ +[remap] + +importer="csv_translation" +type="Translation" +uid="uid://c3qikhoud4b5g" + +[deps] + +files=["res://docs/tech-tree-nodes-v0.1.tier.translation", "res://docs/tech-tree-nodes-v0.1.route.translation", "res://docs/tech-tree-nodes-v0.1.name.translation", "res://docs/tech-tree-nodes-v0.1.prerequisites.translation", "res://docs/tech-tree-nodes-v0.1.cost.translation", "res://docs/tech-tree-nodes-v0.1.cost.translation", "res://docs/tech-tree-nodes-v0.1.seconds.translation", "res://docs/tech-tree-nodes-v0.1.repeatable.translation", "res://docs/tech-tree-nodes-v0.1.trigger.translation", "res://docs/tech-tree-nodes-v0.1.unlock.translation"] + +source_file="res://docs/tech-tree-nodes-v0.1.csv" +dest_files=["res://docs/tech-tree-nodes-v0.1.tier.translation", "res://docs/tech-tree-nodes-v0.1.route.translation", "res://docs/tech-tree-nodes-v0.1.name.translation", "res://docs/tech-tree-nodes-v0.1.prerequisites.translation", "res://docs/tech-tree-nodes-v0.1.cost.translation", "res://docs/tech-tree-nodes-v0.1.cost.translation", "res://docs/tech-tree-nodes-v0.1.seconds.translation", "res://docs/tech-tree-nodes-v0.1.repeatable.translation", "res://docs/tech-tree-nodes-v0.1.trigger.translation", "res://docs/tech-tree-nodes-v0.1.unlock.translation"] + +[params] + +compress=1 +delimiter=0 +unescape_keys=false +unescape_translations=true diff --git a/docs/tech-tree-nodes-v0.1.name.translation b/docs/tech-tree-nodes-v0.1.name.translation new file mode 100644 index 0000000..885070b Binary files /dev/null and b/docs/tech-tree-nodes-v0.1.name.translation differ diff --git a/docs/tech-tree-nodes-v0.1.prerequisites.translation b/docs/tech-tree-nodes-v0.1.prerequisites.translation new file mode 100644 index 0000000..6749013 Binary files /dev/null and b/docs/tech-tree-nodes-v0.1.prerequisites.translation differ diff --git a/docs/tech-tree-nodes-v0.1.repeatable.translation b/docs/tech-tree-nodes-v0.1.repeatable.translation new file mode 100644 index 0000000..17d4b65 Binary files /dev/null and b/docs/tech-tree-nodes-v0.1.repeatable.translation differ diff --git a/docs/tech-tree-nodes-v0.1.route.translation b/docs/tech-tree-nodes-v0.1.route.translation new file mode 100644 index 0000000..aea6ac7 Binary files /dev/null and b/docs/tech-tree-nodes-v0.1.route.translation differ diff --git a/docs/tech-tree-nodes-v0.1.seconds.translation b/docs/tech-tree-nodes-v0.1.seconds.translation new file mode 100644 index 0000000..4e3fc14 Binary files /dev/null and b/docs/tech-tree-nodes-v0.1.seconds.translation differ diff --git a/docs/tech-tree-nodes-v0.1.tier.translation b/docs/tech-tree-nodes-v0.1.tier.translation new file mode 100644 index 0000000..0493e36 Binary files /dev/null and b/docs/tech-tree-nodes-v0.1.tier.translation differ diff --git a/docs/tech-tree-nodes-v0.1.trigger.translation b/docs/tech-tree-nodes-v0.1.trigger.translation new file mode 100644 index 0000000..bb5fa1e Binary files /dev/null and b/docs/tech-tree-nodes-v0.1.trigger.translation differ diff --git a/docs/tech-tree-nodes-v0.1.unlock.translation b/docs/tech-tree-nodes-v0.1.unlock.translation new file mode 100644 index 0000000..f854903 Binary files /dev/null and b/docs/tech-tree-nodes-v0.1.unlock.translation differ diff --git a/docs/tech-tree-nodes-v0.2.biome.translation b/docs/tech-tree-nodes-v0.2.biome.translation new file mode 100644 index 0000000..5d2136f Binary files /dev/null and b/docs/tech-tree-nodes-v0.2.biome.translation differ diff --git a/docs/tech-tree-nodes-v0.2.cost.translation b/docs/tech-tree-nodes-v0.2.cost.translation new file mode 100644 index 0000000..012999b Binary files /dev/null and b/docs/tech-tree-nodes-v0.2.cost.translation differ diff --git a/docs/tech-tree-nodes-v0.2.csv b/docs/tech-tree-nodes-v0.2.csv new file mode 100644 index 0000000..5eb8821 --- /dev/null +++ b/docs/tech-tree-nodes-v0.2.csv @@ -0,0 +1,81 @@ +id,tier,route_role,name,prerequisites,cost_proofs,cost_sets,seconds_per_set,repeatable,cost_growth,biome,law_tags,trigger,unlock_summary +B00,T0,M,苏醒于旧王国,,,0,0,false,,old_kingdom,inscription,start,手工采集与区域法则提示 +B01,T0,M,符轨与收集,B00,,0,0,false,,old_kingdom,logistics,tutorial,符轨转向与收集仓 +B02,T0,M,魔晶醒炼,B00,,0,0,false,,old_kingdom,inscription,tutorial,魔晶料斗与晶体精炼机 +B03,T0,M,地脉引流,B02,,0,0,false,,old_kingdom,resonance;tube,tutorial,魔力源与魔力管 +B04,T0,M,端点契约,B01;B02,,0,0,false,,old_kingdom,contract;bridge,tutorial,显式取放点桥臂 +B05,T0,M,三相观测,B03;B04,,0,0,false,,old_kingdom,inscription;research,tutorial,观测符阵与刻印论证 +K01,T1,M,自动刻印,B05,K,15,10,false,,old_kingdom,inscription;research,research,刻印台自动装填与错序回收 +K02,T1,M,共鸣分流,B03;K01,K,20,10,false,,old_kingdom,resonance;tube,research,魔力频率调谐节点 +K03,T1,M,契约桥臂I,B04;K01,K,25,10,false,,old_kingdom,contract;bridge,research,范围3真名过滤与节拍取放 +K04,T1,M,符阵邻接,K01;K02,K,30,10,false,,old_kingdom,inscription;layout,research,3x3符阵模板与邻接效果 +K05,T1,M,黏土役偶,K03;K04,K,35,10,false,,old_kingdom,construct;automation,research,重复执行复杂配方的役偶阵 +K06,T1,C,真名仓储,K03,K,25,10,false,,old_kingdom,true_name;storage,research,法则标签筛选仓 +K07,T1,M,地脉与界膜测绘,K02;K04,K,45,10,false,,old_kingdom,resonance;boundary,research,生态法则图与界膜薄弱点 +K08,T1,C,修复咒式,K04;K05,K,40,10,false,,old_kingdom,repair;construct,research,建筑自修复与符文回收 +K09,T1,C,学派合唱,K01;K04,K,50,10,false,,old_kingdom,research;resonance,research,多研究台共鸣加速 +K10,T1,M,界膜探针,K05;K07,K,60,10,false,,old_kingdom,boundary;survey,research,探测根门与魂灯驿位置 +K11,T1,M,双域勘定,K10,K,90,10,false,,old_kingdom,boundary;life;death,research,开放魔林与亡域初始实验 +L01,T2_LIFE,M,荆棘开路,K11,K,60,12,false,,verdant_forest,life;boundary,research,根门与边界根系状态 +L02,T2_LIFE,M,共生苗床,L01,K,80,12,false,,verdant_forest,life;growth,research,论证种活木与妖精露循环 +L03,T2_LIFE,M,生机论证,L02,K,100,12,false,,verdant_forest,life;research,research,自动生机论证与生态余额 +L04,T2_LIFE,M,根脉输运,L03,K;L,80,15,false,,verdant_forest,life;logistics,research,受生态余额限制的根轨 +L05,T2_LIFE,M,生态平衡,L03;L04,K;L,120,15,false,,verdant_forest,life;balance,research,回种塔与枯萎净化 +L06,T2_LIFE,C,活木构装,L04;L05,K;L,140,15,false,,verdant_forest,life;construct,research,缓慢自修复的活体框架 +L07,T2_LIFE,C,妖精授粉,L05,K;L,160,15,false,,verdant_forest,life;probability,research,周期增产与错种风险 +L08,T2_LIFE,M,生命锚,L04;L05,K;L,200,15,false,,verdant_forest,life;anchor,research,生命锚核 +D01,T2_DEATH,M,魂灯渡雾,K11,K,60,12,false,,silent_dead,death;boundary,research,魂灯驿与被记住状态 +D02,T2_DEATH,M,可控腐朽,D01,K,80,12,false,,silent_dead,death;decay,research,腐朽室骨尘与衰变计时 +D03,T2_DEATH,M,幽冥论证,D02,K,100,12,false,,silent_dead,death;research,research,自动幽冥论证与身份保留率 +D04,T2_DEATH,M,骨轨与魂舟,D03,K;D,80,15,false,,silent_dead,death;logistics,research,受灵火影响的亡域物流 +D05,T2_DEATH,M,记忆回收,D03;D04,K;D,120,15,false,,silent_dead,death;memory;recycle,research,召回材料类别并产出亡者记忆 +D06,T2_DEATH,C,骷髅劳役,D04;D05,K;D,140,15,false,,silent_dead,death;construct,research,消耗灵火的亡灵役偶 +D07,T2_DEATH,C,轮回契约,D05,K;D,160,15,false,,silent_dead,death;recycle,research,副产物回到低阶原料池 +D08,T2_DEATH,M,亡者锚,D04;D05,K;D,200,15,false,,silent_dead,death;anchor,research,亡者锚核 +E01,T3,M,生死合律,L08;D08,K;L;D,250,20,false,,ember_wastes,life;death;alchemy,research,暮光合剂与生死循环 +E02,T3,M,焚风护印,E01,K;L;D,150,20,false,,ember_wastes,element;boundary,research,耐火过界走廊与涂层 +E03,T3,M,热相炉,E02,K;L;D,180,20,false,,ember_wastes,element;temperature,research,温度状态与熔渣回收 +E04,T3,M,冷热双生,E03,K;L;D,200,20,false,,ember_wastes,element;state,research,冷热双门与三态实验 +E05,T3,M,元素论证,E04,K;L;D,250,20,false,,ember_wastes,element;research,research,自动元素论证与热网面板 +E06,T3,C,火灵契约,E03;E05,K;L;D;E,250,20,false,,ember_wastes,element;construct,research,高热增速火灵役偶 +E07,T3,M,相态转化,E05,K;L;D;E,300,20,false,,ember_wastes,element;state,research,固体熔体与充能态配方 +E08,T3,M,龙玻璃铸造,E02;E07,K;L;D;E,350,20,false,,ember_wastes,element;portal_material,research,龙玻璃与熔火核心 +E09,T3,C,四相魔力,K02;E05,K;L;D;E,300,20,false,,ember_wastes,resonance;element,research,集中生产四种魔力频率 +E10,T3,C,灰烬复生,L05;D05;E07,K;L;D;E,400,20,false,,ember_wastes,life;death;element;random,research,熔渣骨尘随机回到基础材料 +S01,T4,M,折光迷界,E08,K;L;D;E,250,25,false,,mirror_marsh,dimension;boundary,research,重复路径与第一对空间真名 +S02,T4,M,镜像端点,S01,K;L;D;E,300,25,false,,mirror_marsh,dimension;logistics,research,固定成对折叠端点 +S03,T4,M,残响采样,S02,K;L;D;E,350,25,false,,mirror_marsh,dimension;echo,research,镜像残响与影质 +S04,T4,M,维度论证,S03,K;L;D;E,400,25,false,,mirror_marsh,dimension;research,research,自动维度论证与熵面板 +S05,T4,M,概率刻度,S04,K;L;D;E;S,300,25,false,,mirror_marsh,dimension;probability,research,批次分布期望与最坏边界 +S06,T4,M,影质分离,S04;S05,K;L;D;E;S,350,25,false,,mirror_marsh,dimension;sorting;recycle,research,真假分类与影质回收 +S07,T4,C,折叠桥臂,K03;S04,K;L;D;E;S,350,25,false,,mirror_marsh,dimension;bridge;entropy,research,跨障碍取放并产生少量熵 +S08,T4,M,同一性锚,S05;S06,K;L;D;E;S,500,25,false,,mirror_marsh,dimension;anchor;true_name,research,锁定一个法则标签与空间锚核 +S09,T4,C,镜像增殖,S05;S06,K;L;D;E;S,550,25,false,,mirror_marsh,dimension;probability;entropy,research,批次概率副本与影质 +S10,T4,C,真名目录,K06;S08,K;L;D;E;S,500,25,false,,mirror_marsh,dimension;true_name;storage,research,全局真名过滤与库存分类 +G01,T5,M,门址测定,K07;L08;D08;E08;S08,K;L;D;E;S,500,30,false,,rift_gate,portal;survey,research,裂界门址与门环蓝图 +G02,T5,M,环界石,G01;E08;S08,K;L;D;E;S,600,30,false,,rift_gate,portal;construct,research,十二块可拼接环界石 +G03,T5,M,四锚共鸣,L08;D08;E08;S08,K;L;D;E;S,700,30,false,,rift_gate,portal;anchor;resonance,research,四锚基座与四种频率 +G04,T5,M,大仪式物流,K03;G02,K;L;D;E;S,500,30,false,,rift_gate,portal;logistics;rhythm,research,四秒同步释放节拍箱 +G05,T5,M,熵槽,S06;G03,K;L;D;E;S,550,30,false,,rift_gate,portal;entropy;safety,research,储存排放仪式熵与安全暂停 +G06,T5,C,门环自筑,K05;G02,K;L;D;E;S,600,30,false,,rift_gate,portal;construct,research,役偶按蓝图拼装门环 +G07,T5,C,高通量共鸣,K09;G03,K;L;D;E;S,650,30,false,,rift_gate,portal;resonance,research,四锚充能加速 +G08,T5,M,异次元传送门,G02;G03;G04;G05,K;L;D;E;S,1000,30,false,,rift_gate,portal,research,门环仪式台与界行者役偶 +G09,T5,M,首次折跃,G08,K;L;D;E;S,1200,30,false,,rift_gate,portal;victory,research,同步仪式稳定窗口与胜利判定 +G10,T5,C,命运偏置,S05;G05,K;L;D;E;S,700,30,false,,rift_gate,portal;probability;stability,research,异常预警与首次折跃容差 +X00,POST,POST,门后世界,G09,,0,0,false,,post_rift,paradox;portal,victory,基础异界交换结果袋与悖论冷凝器 +X01,POST,POST,混沌分拣,X00,P,40,30,false,,post_rift,paradox;sorting,research,多出口法则分类与概率缓冲 +X02,POST,POST,生态调谐,X01,P,80,30,false,,post_rift,paradox;anchor,research,四种生态输出池锚定 +X03,POST,POST,熵汲取,X01,P,120,30,false,,post_rift,paradox;entropy,research,异常捕获与悖论论证增产 +X04,POST,POST,质量契约,X02;X03,P,200,30,false,,post_rift,paradox;mass,research,保留输入质量等级 +X05,POST,POST,目的地星图,X04,P,300,30,false,,post_rift,paradox;destination,research,选择铁海翠梦骨庭等目的地 +X06,POST,POST,因果织机,X04;X05,P,500,30,false,,post_rift,paradox;causality,research,锁定一个标签并随机其余属性 +X07,POST,POST,双向货运,X05,P,600,30,false,,post_rift,paradox;contract;logistics,research,异界批次货运与契约回报 +X08,POST,POST,异界遗物,X03;X06,P,750,30,false,,post_rift,paradox;relic,research,改变局部配方规则的遗物 +X09,POST,POST,真名投送,X06;X07,P,1000,30,false,,post_rift,paradox;true_name,research,高成本指定物输出模式 +X10,POST,POST,多门网络,X07;X09,P,1500,30,false,,post_rift,paradox;portal_network,research,多门共享目的地目录 +I01,INFINITE,INFINITE,孔径容量,X10,P,1000,30,true,2.0,post_rift,paradox;throughput,research,传送门吞吐每级加10% +I02,INFINITE,INFINITE,熵耐受,X03,P,1200,30,true,1.8,post_rift,paradox;entropy,research,熵增长每级减5% +I03,INFINITE,INFINITE,交换回收率,X04,P,1500,30,true,2.0,post_rift,paradox;yield,research,可用质量每级加2% +I04,INFINITE,INFINITE,锚定精度,X02,P,1500,30,true,2.0,post_rift,paradox;anchor,research,目标生态族占比每级加3% +I05,INFINITE,INFINITE,目的地深度,X05,P,2000,30,true,2.0,post_rift,paradox;destination,research,解锁更稀有结果袋与契约 +I06,INFINITE,INFINITE,折跃节拍,X10,P,2000,30,true,2.0,post_rift,paradox;throughput,research,批次生成速度每级加10% diff --git a/docs/tech-tree-nodes-v0.2.csv.import b/docs/tech-tree-nodes-v0.2.csv.import new file mode 100644 index 0000000..591c8de --- /dev/null +++ b/docs/tech-tree-nodes-v0.2.csv.import @@ -0,0 +1,19 @@ +[remap] + +importer="csv_translation" +type="Translation" +uid="uid://ckwh14po8tbwa" + +[deps] + +files=["res://docs/tech-tree-nodes-v0.2.tier.translation", "res://docs/tech-tree-nodes-v0.2.route.translation", "res://docs/tech-tree-nodes-v0.2.name.translation", "res://docs/tech-tree-nodes-v0.2.prerequisites.translation", "res://docs/tech-tree-nodes-v0.2.cost.translation", "res://docs/tech-tree-nodes-v0.2.cost.translation", "res://docs/tech-tree-nodes-v0.2.seconds.translation", "res://docs/tech-tree-nodes-v0.2.repeatable.translation", "res://docs/tech-tree-nodes-v0.2.cost.translation", "res://docs/tech-tree-nodes-v0.2.biome.translation", "res://docs/tech-tree-nodes-v0.2.law.translation", "res://docs/tech-tree-nodes-v0.2.trigger.translation", "res://docs/tech-tree-nodes-v0.2.unlock.translation"] + +source_file="res://docs/tech-tree-nodes-v0.2.csv" +dest_files=["res://docs/tech-tree-nodes-v0.2.tier.translation", "res://docs/tech-tree-nodes-v0.2.route.translation", "res://docs/tech-tree-nodes-v0.2.name.translation", "res://docs/tech-tree-nodes-v0.2.prerequisites.translation", "res://docs/tech-tree-nodes-v0.2.cost.translation", "res://docs/tech-tree-nodes-v0.2.cost.translation", "res://docs/tech-tree-nodes-v0.2.seconds.translation", "res://docs/tech-tree-nodes-v0.2.repeatable.translation", "res://docs/tech-tree-nodes-v0.2.cost.translation", "res://docs/tech-tree-nodes-v0.2.biome.translation", "res://docs/tech-tree-nodes-v0.2.law.translation", "res://docs/tech-tree-nodes-v0.2.trigger.translation", "res://docs/tech-tree-nodes-v0.2.unlock.translation"] + +[params] + +compress=1 +delimiter=0 +unescape_keys=false +unescape_translations=true diff --git a/docs/tech-tree-nodes-v0.2.law.translation b/docs/tech-tree-nodes-v0.2.law.translation new file mode 100644 index 0000000..cabc2b5 Binary files /dev/null and b/docs/tech-tree-nodes-v0.2.law.translation differ diff --git a/docs/tech-tree-nodes-v0.2.name.translation b/docs/tech-tree-nodes-v0.2.name.translation new file mode 100644 index 0000000..4b3f0ed Binary files /dev/null and b/docs/tech-tree-nodes-v0.2.name.translation differ diff --git a/docs/tech-tree-nodes-v0.2.prerequisites.translation b/docs/tech-tree-nodes-v0.2.prerequisites.translation new file mode 100644 index 0000000..a8618ef Binary files /dev/null and b/docs/tech-tree-nodes-v0.2.prerequisites.translation differ diff --git a/docs/tech-tree-nodes-v0.2.repeatable.translation b/docs/tech-tree-nodes-v0.2.repeatable.translation new file mode 100644 index 0000000..55a7e55 Binary files /dev/null and b/docs/tech-tree-nodes-v0.2.repeatable.translation differ diff --git a/docs/tech-tree-nodes-v0.2.route.translation b/docs/tech-tree-nodes-v0.2.route.translation new file mode 100644 index 0000000..cf12ccb Binary files /dev/null and b/docs/tech-tree-nodes-v0.2.route.translation differ diff --git a/docs/tech-tree-nodes-v0.2.seconds.translation b/docs/tech-tree-nodes-v0.2.seconds.translation new file mode 100644 index 0000000..5591a64 Binary files /dev/null and b/docs/tech-tree-nodes-v0.2.seconds.translation differ diff --git a/docs/tech-tree-nodes-v0.2.tier.translation b/docs/tech-tree-nodes-v0.2.tier.translation new file mode 100644 index 0000000..cfe4550 Binary files /dev/null and b/docs/tech-tree-nodes-v0.2.tier.translation differ diff --git a/docs/tech-tree-nodes-v0.2.trigger.translation b/docs/tech-tree-nodes-v0.2.trigger.translation new file mode 100644 index 0000000..78eb1fc Binary files /dev/null and b/docs/tech-tree-nodes-v0.2.trigger.translation differ diff --git a/docs/tech-tree-nodes-v0.2.unlock.translation b/docs/tech-tree-nodes-v0.2.unlock.translation new file mode 100644 index 0000000..5d8ac85 Binary files /dev/null and b/docs/tech-tree-nodes-v0.2.unlock.translation differ diff --git a/docs/tech-tree-v0.1.md b/docs/tech-tree-v0.1.md new file mode 100644 index 0000000..cc337a6 --- /dev/null +++ b/docs/tech-tree-v0.1.md @@ -0,0 +1,337 @@ +# 《魔力工坊》完整科技树与 8/24 小时节奏基线 v0.1(已否决) + +> 本版因“魔法只换皮、终局门缺席、生态区没有独特规则”而被 v0.2 替代。请以 `docs/tech-tree-v0.2.md` 为当前设计;本文件仅保留作决策记录。 + +> 状态:可进入原型验证的设计基线。科技名与数值可以调,但阶段职责、主线依赖和时间验收口径不应在没有测试数据时随意改动。 + +## 1. 结论 + +完整流程采用“6 个时代、5 种通关前铭片、1 种通关后铭片”的结构: + +- 6 个教程里程碑,不消耗科研材料; +- 62 个有限科技,其中 40 个属于胜利关键路径,22 个是舒适性或专精分支; +- 终局目标为建造并稳定点燃“天穹心炉”,而不是只点完最后一项研究; +- 点燃后开放 7 条可无限研究的天穹科技,玩家可以继续经营; +- 熟练玩家的计划通关中位数为 7 小时 15 分,给 8 小时成就留 45 分钟容错; +- 有自动化游戏经验、首次接触本作的普通玩家,计划通关中位数为 18—21 小时,第 75 百分位不超过 24 小时。 + +现有原型正好是这一体系的早期横切片:传送带、魔晶料斗、精炼机、收集仓、魔力源、魔力管和显式取放点桥臂分别映射到 P02—C04。完整游戏不应推翻这套特色,只需要把它数据化并分阶段开放。 + +## 2. 从参考游戏继承什么 + +《Factorio》原版的两个限时通关成就是 8 小时和 15 小时,并不是 8 小时和 24 小时。本作仍按需求采用自己的 8/24 小时目标:8 小时是熟练路线挑战,24 小时是正常流程上限。 + +参考游戏中真正值得继承的不是科技名称,而是三条结构原则: + +1. 每种新科研材料都是一次“工厂考试”。《Factorio》的科研包从基础装配逐步引入石油、多级中间件和大规模生产;本作的五色铭片分别考核自动化、魔力物流、流体炼成、跨岛量产、灵智折跃。 +2. 主线只取树上的最小闭环。像《Factorio》的军备科研一样,本作的守界科技不进入胜利依赖;普通玩家可以研究舒适性科技,高手可以有意识地跳过。 +3. 终局必须验证产能。《Factorio》火箭要求大量低密度结构、火箭燃料和处理器;《戴森球计划》的宇宙矩阵重新汇合此前矩阵与反物质。本作的天穹心炉同样汇合相位合金、灵智处理器、充能晶体、源质火花和持续魔力。 + +## 3. 世界与胜利假设 + +以下设定是根据当前“浮空工坊 + 魔晶 + 魔力管网 + 桥臂”原型做出的最低限度延展,可在剧情定稿时改名: + +- 玩家接管一座熄灭的浮空铸造站,从修复基础产线开始,逐步连接周边浮岛地脉。 +- 物流层负责实体物品,魔力管网负责能量与配额,桥臂负责跨越多条符轨并把机器绑定到明确取放点。 +- 中期加入以太露流体;后期加入跨岛航运、天穹石与源质裂隙。 +- 标准战役不强制战斗。守界分支可以处理魔力风暴、裂隙污染和未来可能加入的敌对单位,但不阻塞主线。 + +### 胜利条件:重燃天穹心炉 + +完成 G13 后,玩家需要: + +1. 建造 9×9 的“天穹心炉”:200 相位合金、100 灵智处理器、200 充能晶体、50 源质火花; +2. 自动输入 100 个“心炉构件”。每个构件需要 5 相位合金、2 灵智处理器、10 充能晶体、1 源质火花,基础制作时间 12 秒; +3. 让心炉持续获得 100 魔力/秒,共完成 300 秒点火。断供只暂停进度,不清零; +4. 点火结束时记录通关时间并触发胜利。第一次点火产出 1,000 枚天穹铭片,之后可持续生产通关后科研材料。 + +这一终局的无加速硬下限约 25 分钟,高手可提前备料,普通玩家则有约 2.5 小时完成扩产与排错。 + +## 4. 资源与中间件主干 + +| 原料 | 第一加工 | 中期加工 | 后期用途 | +|---|---|---|---| +| 星铁矿 | 星铁锭、齿轮 | 强化平台板、精密构件 | 相位合金、心炉结构 | +| 辉铜矿 | 辉铜锭、导魔线 | 导魔线圈、符文板 | 灵智处理器、魔力主干 | +| 魔晶簇 | 粗魔晶、精炼魔晶 | 充能晶体、晶体透镜 | 翠光铭片、心炉构件 | +| 灵砂 | 魔导玻璃 | 晶体透镜、相位轴承 | 紫晶铭片、灵智核心 | +| 以太露 | 元素溶剂、热封片 | 相位胶、稳定剂 | 相位冶金、翠光铭片 | +| 天穹石 | 天穹锭 | 相位合金 | 心炉结构与构件 | +| 源质 | 源质火花 | 稳定源质 | 永续魔力、天穹铭片 | + +资源规则:初始岛必须拥有前三种资源;灵砂与以太露在相邻岛;天穹石与源质在更远的不同岛。地图生成必须保证关键资源距离有上下限,不能让 8 小时成就由随机种子决定。 + +## 5. 科研铭片 + +`成本 60 青琥 ×15s` 表示研究消耗 60 组材料,每组含 1 青晶和 1 琥珀铭片,每座 1 倍速研究台处理一组需 15 秒。研究台可并联,铭片仍需真实生产和运输。 + +| 铭片 | 配方(基准) | 解锁阶段 | 它考核的生产语法 | 普通目标 | 高手目标 | +|---|---|---|---|---:|---:| +| 青晶铭片 | 星铁齿轮×1 + 精炼魔晶×1,5 秒产 1 | P05 | 两条基础原料线与首次自动化 | 15/分 | 45/分 | +| 琥珀铭片 | 桥臂关节×1 + 导魔线圈×1,6 秒产 1 | C11 | 多机装配、魔力供给、跨线取放 | 15/分 | 45/分 | +| 绯红铭片 | 晶体透镜×1 + 元素溶剂×20 + 热封片×1,8 秒产 1 | A12 | 固液混合、泵储与副产物处理 | 15/分 | 60/分 | +| 紫晶铭片 | 构装核心×1 + 强化平台板×2 + 相位轴承×1,12 秒产 2 | R13 | 大宗材料、远程采掘与规模建设 | 20/分 | 60/分 | +| 翠光铭片 | 灵智处理器×1 + 相位稳定器×1 + 充能晶体×2,16 秒产 2 | V13 | 跨岛物流、高阶能量和精密多级件 | 20/分 | 75/分 | +| 天穹铭片 | 前五色各×1 + 源质火花×1,15 秒产 1 | 首次点火 | 全链汇合;仅用于通关后无限科技 | 按需 | 按需 | + +## 6. 六阶段节奏 + +| 阶段 | 高手窗口 | 普通窗口 | 新系统 | 离开阶段前的可观察考试 | +|---|---:|---:|---|---| +| T0 残炉求生 | 0:00—0:25 | 0:00—1:15 | 手工采集、粗炼、基础符轨、魔力引流 | 制作第一枚青晶铭片并开始研究 | +| T1 青晶·基础自动化 | 0:25—1:10 | 1:15—3:30 | 自动采掘、精炼、桥臂 I、平台扩建 | 青晶铭片稳定 15/分以上并解锁琥珀刻印 | +| T2 琥珀·魔力物流 | 1:10—2:20 | 3:30—6:30 | 二级物流、稳压、灵砂、以太流体 | 一条固液混合产线稳定产出绯红铭片 | +| T3 绯红·元素炼成 | 2:20—3:50 | 6:30—10:30 | 炼金、热魔循环、精密构件、地脉勘探 | 产线能够承受背压与魔力波动并产出紫晶铭片 | +| T4 紫晶·规模构装 | 3:50—5:30 | 10:30—15:30 | 跨岛航运、深层采掘、相位冶金、灵智核心 | 从第二座岛持续送回天穹石并产出翠光铭片 | +| T5 翠光·灵智折跃 | 5:30—7:10 | 15:30—21:30 | 折跃、源质、永续魔力、心炉工程 | 心炉所需四类高阶材料均已自动化且可汇流 | +| 终局点火 | 7:10—8:00 | 21:30—24:00 | 100 构件与持续供能 | 天穹心炉稳定点火 300 秒并触发胜利 | + +### 研究设施规模基线 + +| 阶段 | 每组研究时间 | 普通研究台数 | 高手研究台数 | +|---|---:|---:|---:| +| T1 | 10 秒 | 2 | 6 | +| T2 | 15 秒 | 3 | 10 | +| T3 | 20 秒 | 5 | 12 | +| T4 | 25 秒 | 8 | 18 | +| T5 | 30 秒 | 10 | 30 | + +研究台数只是平衡标尺,不设硬上限。产能不足、研究台不足和玩家建造速度都能形成瓶颈,但达标工厂不应出现超过 5 分钟的纯等待。 + +## 7. 主干依赖图 + +```mermaid +flowchart LR + P["T0 修复工坊"] --> C["C11 琥珀刻印"] + C --> A["A12 绯红刻印"] + A --> R["R13 紫晶刻印"] + R --> V["V13 翠光刻印"] + V --> G12["G12 天穹心炉蓝图"] + G12 --> G13["G13 世界重燃"] + G13 --> WIN["100 心炉构件 + 300 秒稳定供能"] + + P --> LOGI["符轨与桥臂"] + P --> MANA["魔力管网"] + C --> FLUID["以太流体与炼金"] + A --> SCALE["精密构装与地脉勘探"] + R --> ISLAND["跨岛航运与相位冶金"] + V --> ESSENCE["源质与永续魔力"] + + LOGI --> A + MANA --> A + FLUID --> R + SCALE --> V + ISLAND --> G12 + ESSENCE --> G12 +``` + +## 8. 完整有限科技表 + +角色说明:`M` 为胜利必需;`C` 为普通流程推荐的舒适性/回报型科技;`O` 为专精科技。高手可跳过大多数 C/O 节点,但不应通过手搓绕过 M 节点。 + +### T0:教程里程碑(不消耗铭片) + +| ID | 角色 | 科技 | 前置 | 解锁 | +|---|---|---|---|---| +| P00 | M | 破损工坊 | 无 | 手工采集、拆除、基础制作、地图扫描 | +| P01 | M | 粗炼术 | P00 | 粗炼炉;星铁锭、辉铜锭 | +| P02 | M | 魔晶提纯 | P00 | 魔晶料斗、晶体精炼机;粗魔晶到精炼魔晶 | +| P03 | M | 机械输运 | P01 | 符轨 I、基础收集仓、转向件 | +| P04 | M | 魔力引流 | P02 | 魔力源 I、魔力管 I、机器供能状态 | +| P05 | M | 符文学 | P01、P02 | 符文学台、青晶铭片配方、科技界面 | + +### T1:青晶·基础自动化 + +| ID | 角色 | 科技 | 前置 | 成本 | 解锁 | +|---|---|---|---|---:|---| +| C01 | M | 自动机理 I | P05 | 10 青 ×10s | 装配机 I;双输入固体配方 | +| C02 | M | 物流学 I | P03、P05 | 15 青 ×10s | 分流器 I、汇流器 I、符轨方向预览 | +| C03 | M | 魔力管网 I | P04、P05 | 20 青 ×10s | 魔力储罐 I、网络容量与需求视图 | +| C04 | M | 桥臂学 I | C01、C02 | 25 青 ×10s | 显式取放点桥臂;范围 3;单物品过滤 | +| C05 | C | 仓储学 I | C02 | 20 青 ×10s | 筛选仓、容量限制、库存告警 | +| C06 | M | 采掘术 I | C01 | 30 青 ×10s | 自动采掘器 I;星铁、辉铜、魔晶配方 | +| C07 | M | 精炼术 I | C01、P02 | 35 青 ×10s | 连续精炼炉 I;基础锭与精炼魔晶自动化 | +| C08 | M | 青晶刻印 | C06、C07 | 40 青 ×10s | 刻印台;青晶铭片自动生产 | +| C09 | C | 研究组织 I | C08 | 45 青 ×10s | 研究队列、研究速度 +25% | +| C10 | M | 平台工程 I | C07 | 50 青 ×10s | 浮台地板、承重梁、初始岛扩建 | +| C11 | M | 琥珀刻印 | C03、C04、C08 | 75 青 ×10s | 琥珀铭片;双通道研究所 | + +### T2:琥珀·魔力物流 + +| ID | 角色 | 科技 | 前置 | 成本 | 解锁 | +|---|---|---|---|---:|---| +| A01 | M | 自动机理 II | C01、C11 | 60 青琥 ×15s | 装配机 II;三种固体输入 | +| A02 | M | 物流学 II | C02、C11 | 75 青琥 ×15s | 符轨 II、筛选分流、优先输入输出 | +| A03 | M | 桥臂学 II | C04、C11 | 75 青琥 ×15s | 范围 7、白名单过滤、输入输出优先级 | +| A04 | M | 魔力稳压 | C03、C11 | 80 青琥 ×15s | 魔力蓄能器、优先阀、欠压恢复 | +| A05 | M | 采掘术 II | C06、C11 | 90 青琥 ×15s | 采掘器 II、深层矿脉入口 | +| A06 | M | 灵砂熔融 | C07、C11 | 100 青琥 ×15s | 灵砂炉、魔导玻璃、晶体透镜 | +| A07 | C | 符文逻辑 | C05、C11 | 100 青琥 ×15s | 信号线、库存传感器、启停条件 | +| A08 | C | 模块设计 I | A01、A06 | 120 青琥 ×15s | 速度 I、节能 I 模块 | +| A09 | M | 天桥构筑 | C10、A02 | 120 青琥 ×15s | 相邻浮岛天桥、运输口 | +| A10 | M | 以太流体处理 | A04、A06 | 150 青琥 ×15s | 以太泉、泵、流体罐、魔力管 II | +| A11 | O | 守界术 I | C03、A06 | 80 青琥 ×15s | 避雷符、局部结界、风暴预警 | +| A12 | M | 绯红刻印 | A01、A03、A10 | 180 青琥 ×15s | 绯红铭片;三通道研究所 | + +### T3:绯红·元素炼成 + +| ID | 角色 | 科技 | 前置 | 成本 | 解锁 | +|---|---|---|---|---:|---| +| R01 | M | 元素裂解 | A10、A12 | 120 青琥绯 ×20s | 元素分离器;溶剂、残渣、通量配方 | +| R02 | M | 炼金合成 | R01、A12 | 140 青琥绯 ×20s | 炼金反应釜;相位胶、热封片 | +| R03 | M | 热魔循环 | A04、R01、A12 | 160 青琥绯 ×20s | 热魔轮机、换热器、魔力源 II | +| R04 | C | 物流学 III | A02、R02 | 180 青琥绯 ×20s | 符轨 III、堆叠器、车道平衡器 | +| R05 | C | 桥臂学 III | A03、A07、R01 | 180 青琥绯 ×20s | 多取放点、条件取料、吞吐统计 | +| R06 | M | 自动机理 III | A01、R02 | 200 青琥绯 ×20s | 装配机 III;固液配方、四种输入 | +| R07 | M | 精密构件 | A06、R02 | 220 青琥绯 ×20s | 相位轴承、构装核心、精密框架 | +| R08 | C | 模块设计 II | A08、R07 | 250 青琥绯 ×20s | 速度 II、节能 II、产能 I 模块 | +| R09 | C | 构装傀儡 | A07、R06、R07 | 300 青琥绯 ×20s | 蓝图、建造傀儡、自动修复 | +| R10 | M | 地脉勘探 | A05、R01 | 220 青琥绯 ×20s | 深层扫描、资源热图、远端矿脉标记 | +| R11 | O | 守界术 II | A11、R03、R07 | 200 青琥绯 ×20s | 守界塔、傀儡守卫、结界供能优先级 | +| R12 | M | 魔力管网 II | A04、R03 | 180 青琥绯 ×20s | 魔力干线、分区节点、供能优先级 | +| R13 | M | 紫晶刻印 | R06、R07、R10、R12 | 350 青琥绯 ×20s | 紫晶铭片;四通道研究院 | + +### T4:紫晶·规模构装 + +| ID | 角色 | 科技 | 前置 | 成本 | 解锁 | +|---|---|---|---|---:|---| +| V01 | M | 规模生产 | R06、R13 | 250 青琥绯紫 ×25s | 装配机 IV、连续铸造炉、批量配方 | +| V02 | C | 物流枢纽 | R04、R09、R13 | 300 青琥绯紫 ×25s | 傀儡物流站、供给与请求接口 | +| V03 | C | 折叠仓储 | A07、R13 | 300 青琥绯紫 ×25s | 大型折叠仓、缓冲仓、库存分区 | +| V04 | C | 建造阵列 | R09、V01 | 350 青琥绯紫 ×25s | 区域蓝图、远程铺设、自动补建 | +| V05 | M | 浮岛航运 | A09、R10、R13 | 400 青琥绯紫 ×25s | 天舟、浮岛港、跨岛批量运输 | +| V06 | M | 深层地脉采掘 | A05、R10、V05 | 400 青琥绯紫 ×25s | 天穹石矿场、远端魔力井 | +| V07 | M | 魔力管网 III | R12、V01 | 350 青琥绯紫 ×25s | 高容魔力主干、区域信标、负载切除 | +| V08 | C | 模块设计 III | R08、V01、R13 | 450 青琥绯紫 ×25s | 速度 III、节能 III、产能 II 模块 | +| V09 | C | 生产力学 | R08、V01 | 500 青琥绯紫 ×25s | 产能 III 模块、魔力增幅塔;高手可做回报判断 | +| V10 | M | 相位冶金 | R02、V01、V06 | 500 青琥绯紫 ×25s | 天穹锭、相位合金、天穹桁架 | +| V11 | M | 灵智核心 | R07、V10 | 550 青琥绯紫 ×25s | 逻辑棱镜、灵智处理器、相位稳定器 | +| V12 | O | 守界术 III | R11、V07 | 400 青琥绯紫 ×25s | 浮岛护罩、裂隙抑制器 | +| V13 | M | 翠光刻印 | V07、V10、V11 | 650 青琥绯紫 ×25s | 翠光铭片;五通道大研究院 | + +### T5:翠光·灵智折跃 + +| ID | 角色 | 科技 | 前置 | 成本 | 解锁 | +|---|---|---|---|---:|---| +| G01 | M | 灵智自动化 | V01、V11、V13 | 400 五色 ×30s | 自适应装配机、配方组、缺料诊断 | +| G02 | C | 相位桥臂 | R05、V11、V13 | 450 五色 ×30s | 无实体跨轨取放、跨层端点、吞吐 +50% | +| G03 | M | 折跃物流 | V05、V10、V13 | 600 五色 ×30s | 成对折跃门、跨岛货单、批量调度 | +| G04 | M | 源质提取 | V06、V10、V13 | 600 五色 ×30s | 裂隙锚、源质提取器、源质火花 | +| G05 | M | 永续魔力 | V07、G04 | 700 五色 ×30s | 心泉反应炉、稳定源质、魔力源 III | +| G06 | C | 傀儡网络 | V02、G01 | 550 五色 ×30s | 请求式物流、自动补料、傀儡充能塔 | +| G07 | M | 天穹工程 | V10、G01、G05 | 800 五色 ×30s | 心炉构件台、天穹心炉结构配方 | +| G08 | C | 模块设计 IV | V08、G01、G04 | 700 五色 ×30s | 高阶速度、节能、产能模块 | +| G09 | C | 研究组织 II | C09、V11、G01 | 500 五色 ×30s | 研究速度 +50%、跨岛科研汇流 | +| G10 | C | 全域调度 | V02、G01、G03、G06 | 650 五色 ×30s | 跨岛信号、全局库存与配方调度 | +| G11 | O | 守界术 IV | V12、G05 | 600 五色 ×30s | 世界护罩、源质风暴零伤运行 | +| G12 | M | 天穹心炉蓝图 | G03、G04、G07 | 1,000 五色 ×30s | 9×9 天穹心炉、心炉输入规范 | +| G13 | M | 世界重燃 | G05、G12 | 1,200 五色 ×30s | 100 构件装填、300 秒点火流程、胜利判定 | + +## 9. 通关后科技 + +首次点火自动开放 W01,不再追加一层通关前门槛。无限科技只改善持续扩厂,不回头改变 8/24 小时基线。 + +| ID | 科技 | 前置 | 首级成本 | 每级增长 | 效果 | +|---|---|---|---:|---:|---| +| W01 | 天穹铭片 | 首次点火 | 自动 | — | 开放天穹铭片持续配方与无限科研 | +| W02 | 魔晶采收效率 | W01 | 1,000 天穹 | ×2 | 采掘产能 +10%/级 | +| W03 | 魔力传输效率 | W01 | 1,000 天穹 | ×2 | 管网容量 +5%、传输损耗 -2%/级 | +| W04 | 符轨吞吐 | W01 | 1,500 天穹 | ×2 | 符轨速度与堆叠上限 +10%/级 | +| W05 | 桥臂相位 | W01 | 1,500 天穹 | ×2 | 桥臂吞吐 +10%/级;每两级范围 +1 | +| W06 | 构装速度 | W01 | 1,000 天穹 | ×2 | 傀儡移动与施工速度 +10%/级 | +| W07 | 研究压缩 | W01 | 2,000 天穹 | ×2 | 研究速度 +10%/级 | +| W08 | 守界共振 | W01、G11 | 1,000 天穹 | ×2 | 结界容量与恢复 +10%/级 | + +## 10. 主线成本与产能校验 + +仅计算 M 节点,阶段成本如下。每阶段使用截至该阶段的全部铭片,因此颜色越早,累计需求越高。 + +| 阶段 | 本阶段研究组数 | 使用铭片 | 关键路径结束后的累计单色需求 | +|---|---:|---|---| +| T1 | 300 | 青 | 青 300 | +| T2 | 930 | 青、琥 | 青 1,230;琥 930 | +| T3 | 1,590 | 青、琥、绯 | 青 2,820;琥 2,520;绯 1,590 | +| T4 | 3,100 | 青、琥、绯、紫 | 青 5,920;琥 5,620;绯 4,690;紫 3,100 | +| T5 | 5,300 | 五色 | 青 11,220;琥 10,920;绯 9,990;紫 8,400;翠 5,300 | + +高手线按 45/45/60/60/75 枚每分钟建设五色产能,可以在对应阶段窗口内完成主线科研,并留出停机与扩产余量。普通线按 15/15/15/20/20 枚每分钟、研究台逐步扩到 10 座,也能在 21.5 小时前完成科研。时间差主要来自布局、理解、跨岛建设和排错,而不是把研究成本简单放大三倍。 + +### 舒适科技的回报规则 + +- C 类科技若在剩余流程中不能回收其研究与建设成本,就不应被 UI 标成“推荐”。 +- 速度、建造和物流升级的正常回本时间应为 30—60 分钟;产能模块为 60—90 分钟。 +- 8 小时路线原则上只研究能在 45 分钟内回本的 C 类科技;普通路线通过傀儡、蓝图、库存诊断和全局调度降低理解与操作负担。 +- O 类守界科技不得偷偷成为地图生存的必选项;标准难度只允许它减少损失或提高容错。 + +## 11. 两个限时成就的精确定义 + +| 成就 | 条件 | 设计含义 | +|---|---|---| +| 分秒必铸 | 标准战役在 08:00:00 前完成首次稳定点火 | 熟悉配方、预留产能、主动跳过低回报分支的高端路线 | +| 一昼重燃 | 标准战役在 24:00:00 前完成首次稳定点火 | 正常探索、研究推荐舒适科技并允许数次返工的普通路线 | + +计时规则: + +- 从玩家首次获得控制权开始,只累计世界模拟时间;暂停、加载和不可操作过场不计时; +- 保存、读取和退出不能重置计时;多人游戏按世界时间计算; +- 开发模式、修改科技/配方倍率、超出标准范围的资源预设会使限时成就失效; +- 8 小时通关同时授予 24 小时成就; +- 完成 G13 不算通关,必须让心炉实际完成 300 秒稳定点火; +- UI 始终显示当前时间、最近阶段目标时间和是否仍具备成就资格,不制造隐形失败。 + +## 12. 平衡验收与遥测 + +每次完整测试至少记录: + +- 第一座自动采掘器、第一条持续精炼线、五种铭片首次自动产出的时间; +- C11、A12、R13、V13、G12、G13 的完成时间; +- 每种铭片的峰值/平均产速、研究空闲时间、机器缺料时间、魔力欠压时间; +- 跨岛往返次数、手工制作次数、拆建次数、桥臂配置失败次数; +- 心炉落地时间、100 构件完成时间、点火中断次数和最终通关时间。 + +版本进入内容锁定前必须达到: + +- 熟悉路线的测试者 P50 ≤ 7:15,P90 ≤ 8:00; +- 有同类游戏经验的首次玩家 P50 为 18—21 小时,P75 ≤ 24:00; +- 达标产线下,任何单项主线研究都不造成超过 5 分钟的被动等待; +- 至少 80% 的首次玩家无需外部攻略就能解释当前机器停机原因; +- 任一阶段若超过 25% 玩家在同一处卡住,先修目标提示、状态反馈或配方可读性,再考虑直接降成本。 + +调参顺序固定为:教学与状态反馈 → 配方复杂度 → 建筑吞吐 → 科研组数 → 资源密度。不要用暗中加速、失败后自动赠送资源或按游玩时长打折来伪造 24 小时达标。 + +## 13. 数据实现约束 + +科技必须由数据定义,至少包含: + +```text +id +tier +route_role # M / C / O / POST +prerequisite_ids[] +cost.packs[] +cost.sets +cost.seconds_per_set +unlock_ids[] +tags[] # logistics / mana / alchemy / construction / warding ... +repeatable_formula # 仅通关后科技 +``` + +运行时要求: + +- 启动时校验 ID 唯一、前置存在、图无环、M 主线不依赖 O 节点; +- 研究、配方、建筑与 UI 共用同一份解锁 ID,不能在界面脚本中另写一份科技判断; +- 存档保存已完成科技、当前研究、已投入的各色铭片和成就计时资格; +- 提供离线节奏模拟器,能计算任意路线的铭片总量、理论最短研究时间和最终物料需求; +- 当前事件驱动模拟继续保留,研究台只在投料、完成、断料或队列变化时唤醒。 + +完整可机读节点表见 `docs/tech-tree-nodes-v0.1.csv`,实施拆分见 `tasks/tech-tree-plan.md` 与 `tasks/tech-tree-todo.md`。 + +## 14. 参考资料 + +- [Factorio 官方游戏目标说明](https://www.factorio.com/game/content) +- [Factorio Wiki:Achievements](https://wiki.factorio.com/Achievements) +- [Factorio Wiki:Science pack](https://wiki.factorio.com/Science_pack) +- [Factorio Wiki:Rocket silo](https://wiki.factorio.com/Rocket_silo) +- [Dyson Sphere Program Wiki:Matrix Lab](https://dyson-sphere-program.fandom.com/wiki/Matrix_Lab) +- [Dyson Sphere Program Wiki:Universe Matrix](https://dyson-sphere-program.fandom.com/wiki/Universe_Matrix) +- [Dyson Sphere Program Wiki:Mission Completed!](https://dyson-sphere-program.fandom.com/wiki/Mission_Completed%21) diff --git a/docs/tech-tree-v0.2.md b/docs/tech-tree-v0.2.md new file mode 100644 index 0000000..bfbabd6 --- /dev/null +++ b/docs/tech-tree-v0.2.md @@ -0,0 +1,357 @@ +# 《魔力工坊》完整科技树 v0.2:法则工厂与异次元门 + +> 本版替代 v0.1。v0.1 的时间模型可以参考,但“浮岛采矿—五色铭片—天穹心炉”方向被否决,因为它没有让魔法改变生产规律。 + +## 1. 核心承诺 + +本作不是把矿机、熔炉、装配机和火箭改成魔法名称,而是让玩家自动化五种彼此不同的魔法因果: + +| 魔法动词 | 工厂问题 | 玩家真正做的事 | +|---|---|---| +| 刻印与共鸣 | 空间关系、顺序、魔力频率 | 让物品按正确顺序穿过符文节点;用邻接和调谐改变机器行为 | +| 培育与共生 | 可再生资源、生态平衡 | 让资源生长、采收、回种,并控制枯萎而不是抽空矿点 | +| 腐朽与回忆 | 时间、身份、循环 | 利用物品衰变计时,把“损坏”变成配方步骤,再召回保留的记忆 | +| 炼相与元素 | 温度、状态、能量交换 | 主动让物质经历冷、热、熔融和充能状态,而不是只给机器供电 | +| 折叠与变换 | 概率、混合输出、熵 | 接受可预测但顺序随机的结果,用锚、催化剂、分拣和回收塑造分布 | + +去掉所有美术和名词后,这五种产线也必须在布局、停机原因和最优解上彼此不同。 + +## 2. 世界不是群岛,而是“规则岛” + +世界表面连续,道路、山脉和远处建筑都能彼此看见;但生态区边缘存在 2—5 格厚的物理或法则阻隔。每条边界只保留 2—3 个天然薄弱点,必须建造对应的过界设施,因而在物流拓扑上形成一个个岛。 + +```mermaid +flowchart LR + START["旧王国边境\n起始工坊"] + LIFE["翠绿魔林\n生长与共生"] + DEATH["亡者静域\n腐朽与回忆"] + EMBER["赤烬荒原\n温度与相态"] + MIRROR["星辉镜沼\n折叠与概率"] + RIFT["裂界门址\n异次元传送门"] + + START -->|"荆棘界墙 / 根门"| LIFE + START -->|"亡雾河 / 魂灯驿"| DEATH + LIFE -->|"生死合律"| EMBER + DEATH -->|"生死合律"| EMBER + EMBER -->|"折光迷界 / 镜像端点"| MIRROR + MIRROR -->|"四锚共鸣"| RIFT +``` + +### 生态区规则 + +| 生态区 | 可见生态 | 阻隔方式 | 本地法则 | 失败后果 | 高阶利用 | +|---|---|---|---|---|---| +| 旧王国边境 | 废弃村镇、石桥、残破魔法工坊 | 通往外域的旧路被界膜覆盖 | 刻印顺序和地脉共鸣 | 错序石板失效但可重刻 | 用符阵邻接改变机器配方与效率 | +| 翠绿魔林 | 巨树、发光菌、妖精花圃、活体藤蔓 | 荆棘界墙会顶开普通建筑 | 生长必须伴随回种;区域有生态余额 | 过度采收引发枯萎与根系堵塞 | 维持共生后获得无限再生原料与活木自修复 | +| 亡者静域 | 墓园、骨林、黑色芦苇、游荡灵火 | 亡雾让无魂灯保护的物品逐渐失去身份 | 物品按时间腐朽,记忆可以被召回 | 物品变成可回收骨尘,不直接消失 | 用腐朽完成配方;骷髅役偶无需常规魔力 | +| 赤烬荒原 | 火山沟、焦土、龙骨、元素喷泉 | 焚风使普通符轨和管道过热停摆 | 温度与相态决定配方和速度 | 过热停机并生成熔渣,冷却后可回收 | 串联热源加速全线;灰烬可经生死法则复生 | +| 星辉镜沼 | 镜湖、悬空碎片、重复倒影、星砂滩 | 折光迷界让未命名路径回到错误出口 | 物品可产生回声、影质和概率副本 | 混合输出与熵升高,不摧毁建筑 | 用同一性锚限定属性,主动经营概率增殖 | +| 裂界门址 | 古代门环遗址、无影区、漂浮符号 | 未锚定建筑持续积累熵并自行停机 | 四种生态法则在此同时生效 | 仪式暂停、输出异常物;标准难度不永久毁档 | 建成异次元门;通关后把熵转成资源与研究 | + +### 过界设施 + +- **根门:** 与魔林达成生长契约后,允许符轨通过一条不会重新合拢的根隧道。 +- **魂灯驿:** 给一批物品临时附上“被记住”状态,穿越亡雾时不会丢失身份。 +- **冷热双门:** 一端吸收焚风,一端释放冷流,形成可供符轨和管道通过的安全走廊。 +- **镜像端点:** 不铺连续线路,而是给入口与出口写入同一真名,形成固定折叠连接。 +- **界域门:** 通关后才出现的昂贵通用边界设施,不取代前期各生态区的本地解法。 + +## 3. 科研不是五种换色瓶子 + +科研消耗的是“法则论证”。每种论证都必须由相应魔法现象自动产生,因此建立科研产能本身就是一次机制考试。 + +| 论证 | 自动生产方式 | 它要求玩家解决什么 | 普通目标 | 高手目标 | +|---|---|---|---:|---:| +| 刻印论证 K | 空白石板依次通过三种相位符文,次序正确后成为论证 | 符阵布局、顺序物流、基础魔力调谐 | 15/分 | 45/分 | +| 生机论证 L | 一枚论证种完成生长、采收、回种闭环,且区域生态余额非负 | 可再生循环与区域负载 | 10—15/分 | 45/分 | +| 幽冥论证 D | 记忆坯在腐朽室失去形体,再于魂灯中召回身份 | 计时物流、缓冲和灵魂供给 | 10—15/分 | 45/分 | +| 元素论证 E | 同一介质依次经历低温、熔融和充能三种状态 | 热网平衡、相态转换与副产物 | 15—20/分 | 60/分 | +| 维度论证 S | 命名试片通过镜像端点并返回原真名仓,分离其残响 | 成对端点、混合输出、低强度熵 | 20/分 | 60/分 | +| 悖论论证 P | 通关后冷凝异次元门产生的熵与异常物 | 主动提高风险,再把混乱收集为知识 | 按风险 | 按风险 | + +规则:L 与 D 两条支线可以任意顺序进入;主线在“生死合律”重新汇合。E 与 S 逐层加入。没有低概率随机掉落是前置科技的唯一来源。 + +## 4. 8/24 小时阶段节奏 + +| 阶段 | 高手窗口 | 普通窗口 | 核心体验 | 阶段完成标志 | +|---|---:|---:|---|---| +| T0 遗迹苏醒 | 0:00—0:25 | 0:00—1:15 | 修复符轨、魔晶精炼、地脉、桥臂 | 生产第一枚刻印论证 | +| T1 符文机巧 | 0:25—1:15 | 1:15—3:30 | 顺序刻印、共鸣分流、符阵邻接 | 界膜探针定位魔林与亡域入口 | +| T2 双生生态 | 1:15—2:50 | 3:30—8:30 | 魔林培育与亡域腐朽;顺序自由 | 生命锚与亡者锚同时稳定 | +| T3 元素炼相 | 2:50—4:00 | 8:30—12:30 | 生死合律、热网、三态循环 | 自动产出元素论证与龙玻璃 | +| T4 镜界折叠 | 4:00—5:30 | 12:30—17:30 | 固定折叠、概率可视、影质分离 | 同一性锚稳定且维度论证持续生产 | +| T5 门环工程 | 5:30—7:10 | 17:30—22:00 | 四锚共鸣、同步物流、熵控制 | 异次元门、役偶与四路仪式料齐备 | +| 首次折跃 | 7:10—8:00 | 22:00—24:00 | 60 次同步投料、四相供能、役偶穿门 | 界行者役偶开始折跃并触发胜利 | + +## 5. 主干依赖 + +```mermaid +flowchart LR + B["B05 三相观测"] --> K["K11 双域勘定"] + K --> L["L08 生命锚"] + K --> D["D08 亡者锚"] + L --> E["E01 生死合律"] + D --> E + E --> E8["E08 龙玻璃铸造"] + E8 --> S["S08 同一性锚"] + L --> G3["G03 四锚共鸣"] + D --> G3 + E8 --> G3 + S --> G3 + G3 --> G8["G08 异次元传送门"] + G8 --> G9["G09 首次折跃"] + G9 --> WIN["界行者役偶穿门"] + WIN --> POST["门后物质变换与悖论科研"] +``` + +角色说明:`M` 为首次折跃必需;`C` 为舒适性或高手可计算回报的可选科技。通关前不设置依赖随机掉落的科技,也不设置纯战斗科技。 + +## 6. 完整通关前科技树 + +### T0:遗迹苏醒(教程里程碑) + +| ID | 角色 | 科技 | 前置 | 解锁 | +|---|---|---|---|---| +| B00 | M | 苏醒于旧王国 | 无 | 手工采集、拆除、基础制作、区域法则提示 | +| B01 | M | 符轨与收集 | B00 | 现有传送带、转向、收集仓 | +| B02 | M | 魔晶醒炼 | B00 | 魔晶料斗、晶体精炼机、粗晶到醒晶 | +| B03 | M | 地脉引流 | B02 | 魔力源、魔力管、供能状态与容量 | +| B04 | M | 端点契约 | B01、B02 | 现有显式取放点桥臂;机器与端点绑定 | +| B05 | M | 三相观测 | B03、B04 | 3×3 观测符阵、刻印论证、法则科技界面 | + +### T1:符文机巧 + +| ID | 角色 | 科技 | 前置 | 成本 | 解锁 | +|---|---|---|---|---:|---| +| K01 | M | 自动刻印 | B05 | 15 K ×10s | 刻印台自动装填与回收错序石板 | +| K02 | M | 共鸣分流 | B03、K01 | 20 K ×10s | 调谐节点;一条地脉分出不同频率 | +| K03 | M | 契约桥臂 I | B04、K01 | 25 K ×10s | 范围 3、真名过滤、节拍取放 | +| K04 | M | 符阵邻接 | K01、K02 | 30 K ×10s | 3×3 固定符阵模板;邻接改变配方状态 | +| K05 | M | 黏土役偶 | K03、K04 | 35 K ×10s | 可重复执行复杂手工配方的役偶阵 | +| K06 | C | 真名仓储 | K03 | 25 K ×10s | 按真名与法则标签筛选的契约仓 | +| K07 | M | 地脉与界膜测绘 | K02、K04 | 45 K ×10s | 生态区法则图、界膜薄弱点、地脉方向 | +| K08 | C | 修复咒式 | K04、K05 | 40 K ×10s | 建筑自修复、可回收失效符文 | +| K09 | C | 学派合唱 | K01、K04 | 50 K ×10s | 多研究台共鸣;研究速度 +25% | +| K10 | M | 界膜探针 | K05、K07 | 60 K ×10s | 探测荆棘界墙与亡雾河的可穿越点 | +| K11 | M | 双域勘定 | K10 | 90 K ×10s | 魔林与亡域可任意顺序进入;开放 L/D 初始实验 | + +### T2A:翠绿魔林 + +| ID | 角色 | 科技 | 前置 | 成本 | 解锁 | +|---|---|---|---|---:|---| +| L01 | M | 荆棘开路 | K11 | 60 K ×12s | 一处根门、边界根系状态 | +| L02 | M | 共生苗床 | L01 | 80 K ×12s | 论证种、活木、妖精露的生长循环 | +| L03 | M | 生机论证 | L02 | 100 K ×12s | 自动产生 L;生态余额面板 | +| L04 | M | 根脉输运 | L03 | 80 KL ×15s | 会自行生长但受生态余额限制的根轨 | +| L05 | M | 生态平衡 | L03、L04 | 120 KL ×15s | 回种塔、枯萎净化、区域生长配额 | +| L06 | C | 活木构装 | L04、L05 | 140 KL ×15s | 缓慢自修复的活体机器框架 | +| L07 | C | 妖精授粉 | L05 | 160 KL ×15s | 周期性增产;失衡时会错种邻近苗床 | +| L08 | M | 生命锚 | L04、L05 | 200 KL ×15s | 生命锚核;固定生长法则供门环使用 | + +### T2B:亡者静域 + +| ID | 角色 | 科技 | 前置 | 成本 | 解锁 | +|---|---|---|---|---:|---| +| D01 | M | 魂灯渡雾 | K11 | 60 K ×12s | 一处魂灯驿;批次物品获得被记住状态 | +| D02 | M | 可控腐朽 | D01 | 80 K ×12s | 腐朽室、骨尘、记忆坯和可视衰变计时 | +| D03 | M | 幽冥论证 | D02 | 100 K ×12s | 自动产生 D;身份保留率面板 | +| D04 | M | 骨轨与魂舟 | D03 | 80 KD ×15s | 不受亡雾影响的本地物流,但吞吐随灵火变化 | +| D05 | M | 记忆回收 | D03、D04 | 120 KD ×15s | 从骨尘召回材料类别,产出亡者记忆 | +| D06 | C | 骷髅劳役 | D04、D05 | 140 KD ×15s | 不耗常规魔力、消耗灵火的亡灵役偶 | +| D07 | C | 轮回契约 | D05 | 160 KD ×15s | 失效品与副产物回到低阶原料池 | +| D08 | M | 亡者锚 | D04、D05 | 200 KD ×15s | 亡者锚核;固定腐朽法则供门环使用 | + +### T3:赤烬荒原与元素炼相 + +| ID | 角色 | 科技 | 前置 | 成本 | 解锁 | +|---|---|---|---|---:|---| +| E01 | M | 生死合律 | L08、D08 | 250 KLD ×20s | 暮光合剂;把生长与腐朽合成可控循环 | +| E02 | M | 焚风护印 | E01 | 150 KLD ×20s | 第一条耐火过界走廊、耐火涂层 | +| E03 | M | 热相炉 | E02 | 180 KLD ×20s | 物品温度状态、热源、冷源、熔渣回收 | +| E04 | M | 冷热双生 | E03 | 200 KLD ×20s | 冷热双门;同一介质的三态实验 | +| E05 | M | 元素论证 | E04 | 250 KLD ×20s | 自动产生 E;热网与相态面板 | +| E06 | C | 火灵契约 | E03、E05 | 250 KLDE ×20s | 高热区增速役偶;低温时休眠 | +| E07 | M | 相态转化 | E05 | 300 KLDE ×20s | 固体、熔体、充能态之间的通用配方 | +| E08 | M | 龙玻璃铸造 | E02、E07 | 350 KLDE ×20s | 龙玻璃、熔火核心、耐熵门环材料 | +| E09 | C | 四相魔力 | K02、E05 | 300 KLDE ×20s | 集中生产生机、幽冥、炽热、星辉四种频率 | +| E10 | C | 灰烬复生 | L05、D05、E07 | 400 KLDE ×20s | 熔渣与骨尘经生死循环变为随机基础材料 | + +### T4:星辉镜沼与空间折叠 + +| ID | 角色 | 科技 | 前置 | 成本 | 解锁 | +|---|---|---|---|---:|---| +| S01 | M | 折光迷界 | E08 | 250 KLDE ×25s | 显示重复路径;允许写入第一对空间真名 | +| S02 | M | 镜像端点 | S01 | 300 KLDE ×25s | 固定成对的短距折叠入口与出口 | +| S03 | M | 残响采样 | S02 | 350 KLDE ×25s | 从往返物品分离镜像残响与影质 | +| S04 | M | 维度论证 | S03 | 400 KLDE ×25s | 自动产生 S;折叠路径与熵面板 | +| S05 | M | 概率刻度 | S04 | 300 KLDES ×25s | 显示批次分布、期望值和最坏边界 | +| S06 | M | 影质分离 | S04、S05 | 350 KLDES ×25s | 真假分类器、影质回收槽、异常停机保护 | +| S07 | C | 折叠桥臂 | K03、S04 | 350 KLDES ×25s | 跨障碍取放,但每次传输产生少量熵 | +| S08 | M | 同一性锚 | S05、S06 | 500 KLDES ×25s | 锁定物品一个法则标签;空间锚核 | +| S09 | C | 镜像增殖 | S05、S06 | 550 KLDES ×25s | 批次内概率副本;同步生成影质与熵 | +| S10 | C | 真名目录 | K06、S08 | 500 KLDES ×25s | 全局真名过滤、跨域库存分类 | + +### T5:门环工程 + +| ID | 角色 | 科技 | 前置 | 成本 | 解锁 | +|---|---|---|---|---:|---| +| G01 | M | 门址测定 | K07、L08、D08、E08、S08 | 500 五证 ×30s | 裂界门址与安全建造格;门环蓝图 | +| G02 | M | 环界石 | G01、E08、S08 | 600 五证 ×30s | 12 块可拼接环界石及其跨域配方 | +| G03 | M | 四锚共鸣 | L08、D08、E08、S08 | 700 五证 ×30s | 四锚基座;锚核把原始魔力调成四种频率 | +| G04 | M | 大仪式物流 | K03、G02 | 500 五证 ×30s | 节拍箱;四路物品在四秒窗口同步释放 | +| G05 | M | 熵槽 | S06、G03 | 550 五证 ×30s | 储存与排放仪式熵;过高时安全暂停 | +| G06 | C | 门环自筑 | K05、G02 | 600 五证 ×30s | 役偶按蓝图搬运并拼装环界石 | +| G07 | C | 高通量共鸣 | K09、G03 | 650 五证 ×30s | 四锚充能速度 +35%,容差不变 | +| G08 | M | 异次元传送门 | G02、G03、G04、G05 | 1,000 五证 ×30s | 可建造门环、仪式控制台、界行者役偶配方 | +| G09 | M | 首次折跃 | G08 | 1,200 五证 ×30s | 60 批同步仪式、180 秒稳定窗口、胜利判定 | +| G10 | C | 命运偏置 | S05、G05 | 700 五证 ×30s | 仪式异常更早预警;首次折跃容差 +5% | + +## 7. 首次折跃:等效于发射火箭 + +异次元门不是一个 9×9 成品建筑,而是玩家在门址内拼出的区域仪式: + +1. 用 12 块环界石围成门环,中间保留可穿越孔径; +2. 在四个方位安装生命锚、亡者锚、熔火核心与空间锚; +3. 自动完成 60 次同步投料。每批包含生命种、亡者记忆、熔火核心碎片、镜界坐标各 1,四路到达误差不得超过 4 秒; +4. 四个锚分别维持 25 魔力/秒,连续 180 秒,任一频率偏差超过 10% 时暂停; +5. 仪式熵低于 25 时,把界行者役偶送入孔径。役偶开始折跃的模拟帧就是通关时刻。 + +主线首次折跃没有随机成功率。任何不稳定只会暂停并给出原因,不会吃掉唯一材料。8 小时完成同时获得 24 小时成就。 + +这个终局验收的不是单纯矿量,而是:四个生态区均已运作、四路物流能够同步、四种魔力保持比例、玩家理解熵并能把异常物分流。 + +## 8. 通关后的门:用复杂度换资源压力 + +首次折跃后不结束存档。门立刻开放“异界交换”:玩家可以把任意过剩物质投入门内,接收来自其他维度的混合物质。 + +### 8.1 随机不是赌场,而是可规划的乱序批次 + +- 每累计 100 点输入质量,传送门根据当前调谐生成一个“结果袋”;袋内各类产物数量严格落在界面显示的区间内,再随机打乱输出顺序。 +- 玩家不能预测下一件物品,但能预测 100 点质量最终大致得到什么;物流有趣,长期产能仍可计算。 +- 任何主线或唯一科技材料都不依赖低于 5% 的随机结果;异常物都能分解为悖论尘重新投入。 +- 标准难度下,熵事件不会永久摧毁建筑或删除整仓物品。 + +### 8.2 三种调谐策略 + +| 模式 | 每 100 质量的典型结果 | 优点 | 代价 | +|---|---|---|---| +| 无锚敞开 | 约 90 可用随机物 + 10 影质/残渣 | 总回收率最高,有机会发现稀有物 | 输出池大、分拣复杂、熵增长快 | +| 生态锚定 | 约 80 指定生态族 + 10 随机物 + 10 残渣 | 缓解某一生态区的资源压力 | 需要锚核,回收率略低,仍需分拣 | +| 真名投送 | 约 65 指定物 + 15 随机物 + 20 悖论残渣 | 能稳定补足明确瓶颈 | 催化成本高、熵最高,不能替代正常基础采集 | + +输入的法则标签会影响结果:活体输入偏向生机池,骨与记忆偏向亡域池,高温物偏向元素池,影质会提高稀有结果和事故率。玩家因此会为“喂门”建立专门配方,而不是只倒垃圾。 + +### 8.3 熵是第二条生产线 + +| 熵值 | 门的行为 | 玩家机会 | +|---:|---|---| +| 0—24 | 稳定交换 | 低风险补资源 | +| 25—49 | 混合输出增加,开始生成悖论尘 | 最高效地产生通关后科研材料 | +| 50—74 | 相邻物品偶尔产生可分离的回声副本 | 高吞吐增殖,但需要真假分拣和大缓冲 | +| 75—99 | 出现短时法则泄漏,门会主动降速 | 捕获稀有异常物;必须配置熵槽和隔离区 | +| 100 | 门安全闭合,熵不会继续增长 | 清理熵槽、献祭残渣或等待衰减后重启 | + +压力交换关系必须保持:传送门能少建一部分远端采集线,却会多出混合分拣、概率缓冲、熵回收、锚核维护和更高魔力消耗。它是另一种工厂,不是免费资源按钮。 + +### 8.4 一个实际的终局决策 + +玩家准备扩建第二座门,但赤烬荒原的龙玻璃不足,仓库里却堆满了活木和骨尘。玩家可以选择回荒原再建一条热相线,也可以: + +1. 把活木、骨尘压成同质量的“异界贡块”; +2. 给门安装熔火核心作为元素锚,把结果池偏向龙玻璃、熔渣和火灵结晶; +3. 为了赶工,把孔径开到二倍吞吐,让熵进入 50—74 区间; +4. 用法则分类器把龙玻璃送往门环工地,把熔渣送回灰烬复生,把影质和回声副本送进独立缓冲; +5. 在熵接近 75 前决定降速清槽,或继续赌一次高熵异常以获取稀有火灵遗物。 + +这条路线少建了一处远端矿场,却多出一座围绕概率、真假物品、回收和风险阈值工作的工厂。另一名玩家完全可以选择稳定采集,两条路线都成立。 + +## 9. 通关后科技树 + +首次折跃自动解锁 X00,并返回 100 枚悖论论证,让玩家无需先冒险就能启动门后玩法。此后 P 主要由熵 25 以上的门运行产生。 + +| ID | 科技 | 前置 | 成本 | 解锁 | +|---|---|---|---:|---| +| X00 | 门后世界 | 首次折跃 | 自动 | 基础异界交换、结果袋界面、悖论冷凝器 | +| X01 | 混沌分拣 | X00 | 40 P | 多出口法则分类器、概率缓冲仓 | +| X02 | 生态调谐 | X01 | 80 P | 生命、亡者、元素、镜界四种输出池锚定 | +| X03 | 熵汲取 | X01 | 120 P | 熵转悖论论证效率提升;异常捕获器 | +| X04 | 质量契约 | X02、X03 | 200 P | 保留输入的质量等级,减少低阶退化 | +| X05 | 目的地星图 | X04 | 300 P | 从输出族进一步选择“铁海、翠梦、骨庭”等目的地 | +| X06 | 因果织机 | X04、X05 | 500 P | 锁定一个标签,放开其余属性随机变化 | +| X07 | 双向货运 | X05 | 600 P | 向异界发送整批货物并换取可预览契约回报 | +| X08 | 异界遗物 | X03、X06 | 750 P | 捕获改变局部配方规则的可插拔遗物 | +| X09 | 真名投送 | X06、X07 | 1,000 P | 65% 指定物模式;高催化与熵成本 | +| X10 | 多门网络 | X07、X09 | 1,500 P | 多座门共享目的地目录,但熵分别结算 | + +### 无限研究 + +| ID | 科技 | 前置 | 首级成本 | 增长 | 效果 | +|---|---|---|---:|---:|---| +| I01 | 孔径容量 | X10 | 1,000 P | ×2 | 每级门吞吐 +10% | +| I02 | 熵耐受 | X03 | 1,200 P | ×1.8 | 每级熵增长 -5%,最低保留 25% 基础增长 | +| I03 | 交换回收率 | X04 | 1,500 P | ×2 | 每级可用质量 +2%,总上限 98% | +| I04 | 锚定精度 | X02 | 1,500 P | ×2 | 每级目标生态族占比 +3% | +| I05 | 目的地深度 | X05 | 2,000 P | ×2 | 解锁更稀有的结果袋与异界契约 | +| I06 | 折跃节拍 | X10 | 2,000 P | ×2 | 每级批次生成速度 +10% | + +## 10. 主线成本校验 + +仅统计 M 节点;K/L/D/E/S 分别代表五种法则论证。 + +| 阶段 | 本阶段主要消耗 | 关键路径结束后的累计需求 | +|---|---|---| +| T1 | 320 K | K 320 | +| T2 | 1,280 K + 400 L + 400 D | K 1,600;L 400;D 400 | +| T3 | 1,680 KLD + 650 E | K 3,280;L 2,080;D 2,080;E 650 | +| T4 | 2,450 KLDE + 1,150 S | K 5,730;L 4,530;D 4,530;E 3,100;S 1,150 | +| T5 | 5,050 五证 | K 10,780;L 9,580;D 9,580;E 8,150;S 6,200 | + +### 理论研究时间 + +| 阶段 | 高手研究台 | 高手理论研究时间 | 阶段窗口 | 普通研究台 | 普通理论研究时间 | 阶段窗口 | +|---|---:|---:|---:|---:|---:|---:| +| T1 | 6 | 8.9 分 | 50 分 | 2 | 26.7 分 | 135 分 | +| T2 | 10 | 29.6 分 | 95 分 | 4 | 74.0 分 | 300 分 | +| T3 | 12 | 46.7 分 | 70 分 | 5 | 112.0 分 | 240 分 | +| T4 | 18 | 56.7 分 | 90 分 | 8 | 127.6 分 | 300 分 | +| T5 | 30 | 84.2 分 | 100 分 | 10 | 252.5 分 | 270 分 | + +研究可以与生态区建设和门环备料并行。T5 是高手路线最紧的研究门槛,应优先通过实测调研究台建设成本、五证产速和 G08/G09 成本,而不是砍掉门环仪式。 + +## 11. 设计护栏 + +- **不再用换名解决问题:** 新科技若只能描述成“更快的传送带/更大的熔炉/更强的电线”,默认删除或合并。 +- **随机必须有三层控制:** 概率可见、分布可偏置、坏结果可回收;缺一项就不能进入正式内容。 +- **生态区不能只是资源区:** 每区至少改变一个布局约束、一个物流规则和一个停机原因。 +- **不让魔法变成画符作业:** 符阵使用 3×3、5×5 模板与吸附预览,不要求自由手绘或像素级朝向。 +- **不让门取代世界:** 未研究无限科技时,异界交换的可用质量回收率不超过 90%;精确投送不超过 65%。 +- **不让失败毁档:** 标准难度下,枯萎、腐朽、过热和熵都会留下可回收物,并明确显示恢复路径。 +- **高手也必须玩魔法:** 8 小时主线不能跳过生长闭环、一次受控腐朽、三态循环、影质分离和四锚同步。 + +## 12. 数据实现要求 + +科技数据除常规 ID、前置、成本和解锁外,需要支持: + +```text +law_tags[] # inscription / life / death / element / dimension / paradox +biome_id +boundary_unlock_ids[] +experiment_requirement # 自动论证必须满足的状态条件 +route_role # M / C / POST / INFINITE +entropy_rules +probability_bag_definition +preserved_item_tags[] +failure_recovery_recipe_id +``` + +必须有自动校验: + +- ID 唯一、前置存在、依赖图无环; +- M 主线不依赖 C、POST、INFINITE; +- 首次折跃闭包包含五种法则动词; +- 任一主线唯一材料都存在非随机获取方式; +- 结果袋各概率合计为 100%,输出质量落在配置上下限; +- 生态区失败状态均有恢复路径; +- 8/24 小时路线成本与阶段窗口可由离线工具重新计算。 + +可机读节点见 `docs/tech-tree-nodes-v0.2.csv`。体验需求见 `docs/requirements-magic-factorio.md`。 diff --git a/project.godot b/project.godot new file mode 100644 index 0000000..abcc4b6 --- /dev/null +++ b/project.godot @@ -0,0 +1,26 @@ +; Engine configuration file. +; Edit through the Godot editor when possible. + +config_version=5 + +[application] + +config/name="Mana Foundry" +config/description="A 2.5D magical factory-building demo." +run/main_scene="res://scenes/main.tscn" + +[display] + +window/size/viewport_width=1280 +window/size/viewport_height=720 +window/size/window_width_override=1280 +window/size/window_height_override=720 +window/stretch/mode="canvas_items" + +[rendering] + +renderer/rendering_method="gl_compatibility" +renderer/rendering_method.mobile="gl_compatibility" +textures/default_filters/use_nearest_mipmap_filter=false +environment/defaults/default_clear_color=Color(0.018, 0.035, 0.055, 1) + diff --git a/scenes/main.tscn b/scenes/main.tscn new file mode 100644 index 0000000..018b48f --- /dev/null +++ b/scenes/main.tscn @@ -0,0 +1,7 @@ +[gd_scene load_steps=2 format=3] + +[ext_resource path="res://src/main.gd" type="Script" id="1_main"] + +[node name="ManaFoundry" type="Node3D"] +script = ExtResource("1_main") + diff --git a/src/main.gd b/src/main.gd new file mode 100644 index 0000000..3b6101d --- /dev/null +++ b/src/main.gd @@ -0,0 +1,1390 @@ +extends Node3D + +const WorldSimulation = preload("res://src/simulation/world_simulation.gd") + +const CELL_SIZE := 2.0 +const MAP_HALF_WIDTH := 10 +const MAP_HALF_HEIGHT := 6 +const ITEM_RENDER_CAPACITY := 512 + +const COLOR_BG := Color("#07131d") +const COLOR_PANEL := Color("#102531e8") +const COLOR_PANEL_DARK := Color("#08151ee8") +const COLOR_TEXT := Color("#e9f7f5") +const COLOR_MUTED := Color("#8faeb2") +const COLOR_CYAN := Color("#42e8d1") +const COLOR_VIOLET := Color("#a878ff") +const COLOR_AMBER := Color("#ffc766") +const COLOR_DANGER := Color("#ff6b78") +const COLOR_GROUND := Color("#172a31") +const COLOR_GRID := Color("#36515a") + +const RENDER_PATHS := { + WorldSimulation.KIND_BELT: "res://assets/generated/renders/logistics/belt.png", + WorldSimulation.KIND_SOURCE: "res://assets/generated/renders/logistics/crystal_hopper.png", + WorldSimulation.KIND_MACHINE: "res://assets/generated/renders/machines/crystal_refinery.png", + WorldSimulation.KIND_CHARGER: "res://assets/generated/renders/machines/charge_altar.png", + WorldSimulation.KIND_SINK: "res://assets/generated/renders/logistics/collection_vault.png", + WorldSimulation.KIND_MANA_PIPE: "res://assets/generated/renders/logistics/mana_pipe.png", + WorldSimulation.KIND_MANA_SOURCE: "res://assets/generated/renders/logistics/mana_source.png", +} + +const ITEM_ICON_PATHS := { + WorldSimulation.ITEM_RAW: "res://assets/generated/icons/items/raw_mana_crystal.png", + WorldSimulation.ITEM_REFINED: "res://assets/generated/icons/items/awakened_crystal.png", + WorldSimulation.ITEM_CHARGED: "res://assets/generated/icons/items/charged_phase_medium.png", +} + +const ITEM_RENDER_PATHS := { + WorldSimulation.ITEM_RAW: "res://assets/generated/renders/items/raw_mana_crystal.png", + WorldSimulation.ITEM_REFINED: "res://assets/generated/renders/items/awakened_crystal.png", + WorldSimulation.ITEM_CHARGED: "res://assets/generated/renders/items/charged_phase_medium.png", +} + +const GROUND_MATERIAL_PATH := "res://assets/generated/materials/factory_stone.png" + +const DISPLAY_NAMES := { + WorldSimulation.KIND_BELT: "传送带", + WorldSimulation.KIND_SOURCE: "魔晶料斗", + WorldSimulation.KIND_MACHINE: "晶体精炼机", + WorldSimulation.KIND_CHARGER: "充能台", + WorldSimulation.KIND_SINK: "收集仓", + WorldSimulation.KIND_MANA_PIPE: "魔力管", + WorldSimulation.KIND_MANA_SOURCE: "魔力源", +} + +const RECIPE_DISPLAY := { + WorldSimulation.RECIPE_REFINE: "粗晶 → 精炼晶", + WorldSimulation.RECIPE_CHARGE: "精炼晶 → 充能晶", +} + +const ITEM_DISPLAY := { + WorldSimulation.ITEM_RAW: "粗晶", + WorldSimulation.ITEM_REFINED: "精炼晶", + WorldSimulation.ITEM_CHARGED: "充能晶", +} + +var simulation := WorldSimulation.new() +var simulation_accumulator := 0.0 +var simulation_enabled := false +var game_paused := false +var selected_kind: StringName = WorldSimulation.KIND_BELT +var selected_rotation := 0 +var hovered_cell := Vector2i.ZERO +var hover_is_valid := false + +var camera: Camera3D +var camera_focus := Vector3.ZERO +var camera_distance := 28.0 + +var world_container: Node3D +var building_container: Node3D +var bridge_container: Node3D +var decoration_container: Node3D +var preview: MeshInstance3D +var preview_material: StandardMaterial3D +var building_nodes: Dictionary = {} +var indicator_materials: Dictionary = {} +var bridge_mode := false +var bridge_stage := 0 +var bridge_machine_id := -1 +var bridge_input_cell := Vector2i.ZERO +var anchor_machine_id := -1 + +var item_renderer: MultiMeshInstance3D +var item_multimesh: MultiMesh +var item_capacity := ITEM_RENDER_CAPACITY +var previous_item_positions: Dictionary = {} +var current_item_positions: Dictionary = {} + +var objective_label: Label +var selected_label: Label +var stats_label: Label +var stats_panel: Control +var inspect_panel: Control +var inspect_label: Label +var inspect_icon: TextureRect +var start_overlay: Control +var pause_overlay: Control +var victory_overlay: Control +var victory_label: Label +var tool_buttons: Dictionary = {} +var bridge_button: Button +var victory_shown := false +var selected_building_id := -1 +var charger_machine_id := -1 +var stats_visible := true +var stats_refresh := 0.0 +var last_tick_microseconds := 0 + + +func _ready() -> void: + _create_environment() + _create_world_geometry() + _create_camera() + _create_item_renderer() + _create_ui() + _reset_demo() + _update_tool_ui() + var user_arguments := OS.get_cmdline_user_args() + if "--showcase" in user_arguments or "--capture-demo" in user_arguments: + _start_game() + _build_showcase_line() + if "--capture-demo" in user_arguments: + _capture_demo_frame.call_deferred() + + +func _process(delta: float) -> void: + _update_camera(delta) + _update_hover() + _update_preview() + + if simulation_enabled and not game_paused: + simulation_accumulator += delta + while simulation_accumulator >= WorldSimulation.TICK_SECONDS: + var started := Time.get_ticks_usec() + _capture_item_positions_before_tick() + simulation.step() + _capture_item_positions_after_tick() + last_tick_microseconds = Time.get_ticks_usec() - started + simulation_accumulator -= WorldSimulation.TICK_SECONDS + + var interpolation := clampf( + simulation_accumulator / WorldSimulation.TICK_SECONDS, + 0.0, + 1.0 + ) + _update_item_renderer(interpolation) + _update_building_indicators() + _update_objective() + _update_inspect_panel() + + stats_refresh -= delta + if stats_refresh <= 0.0: + stats_refresh = 0.2 + _update_stats() + + +func _unhandled_input(event: InputEvent) -> void: + if event is InputEventKey and event.pressed and not event.echo: + match event.keycode: + KEY_1: + _select_tool(WorldSimulation.KIND_BELT) + KEY_2: + _select_tool(WorldSimulation.KIND_SOURCE) + KEY_3: + _select_tool(WorldSimulation.KIND_MACHINE) + KEY_4: + _select_tool(WorldSimulation.KIND_SINK) + KEY_5: + _select_tool(WorldSimulation.KIND_MANA_PIPE) + KEY_6: + _select_tool(WorldSimulation.KIND_MANA_SOURCE) + KEY_7: + _select_tool(WorldSimulation.KIND_CHARGER) + KEY_B: + _begin_bridge_config() + KEY_R: + selected_rotation = posmod(selected_rotation + 1, 4) + _update_tool_ui() + KEY_N: + _reset_demo() + KEY_F1: + stats_visible = not stats_visible + stats_panel.visible = stats_visible + KEY_ESCAPE: + if bridge_mode: + _cancel_bridge_config() + elif simulation_enabled: + _set_paused(not game_paused) + + if not simulation_enabled or game_paused: + return + + if event is InputEventMouseButton and event.pressed: + match event.button_index: + MOUSE_BUTTON_LEFT: + if bridge_mode: + _handle_bridge_click() + else: + _try_place_selected() + MOUSE_BUTTON_RIGHT: + if bridge_mode: + _cancel_bridge_config() + else: + _try_remove_hovered() + MOUSE_BUTTON_WHEEL_UP: + camera_distance = maxf(15.0, camera_distance - 2.0) + _update_camera_transform() + MOUSE_BUTTON_WHEEL_DOWN: + camera_distance = minf(42.0, camera_distance + 2.0) + _update_camera_transform() + + +func _create_environment() -> void: + var world_environment := WorldEnvironment.new() + world_environment.name = "WorldEnvironment" + var environment := Environment.new() + environment.background_mode = Environment.BG_COLOR + environment.background_color = COLOR_BG + environment.ambient_light_source = Environment.AMBIENT_SOURCE_COLOR + environment.ambient_light_color = Color("#8bb3bd") + environment.ambient_light_energy = 0.72 + environment.reflected_light_source = Environment.REFLECTION_SOURCE_DISABLED + environment.tonemap_mode = Environment.TONE_MAPPER_FILMIC + world_environment.environment = environment + add_child(world_environment) + + var key_light := DirectionalLight3D.new() + key_light.name = "KeyLight" + key_light.rotation_degrees = Vector3(-52.0, -38.0, 0.0) + key_light.light_color = Color("#d9fff6") + key_light.light_energy = 1.15 + key_light.shadow_enabled = true + key_light.directional_shadow_max_distance = 70.0 + add_child(key_light) + + var fill_light := DirectionalLight3D.new() + fill_light.name = "ManaFillLight" + fill_light.rotation_degrees = Vector3(-35.0, 145.0, 0.0) + fill_light.light_color = Color("#9e7aff") + fill_light.light_energy = 0.32 + fill_light.shadow_enabled = false + add_child(fill_light) + + +func _create_world_geometry() -> void: + world_container = Node3D.new() + world_container.name = "World" + add_child(world_container) + + building_container = Node3D.new() + building_container.name = "Buildings" + world_container.add_child(building_container) + bridge_container = Node3D.new() + bridge_container.name = "MachineBridges" + world_container.add_child(bridge_container) + + decoration_container = Node3D.new() + decoration_container.name = "Decoration" + world_container.add_child(decoration_container) + + var foundation := MeshInstance3D.new() + foundation.name = "FactoryIsland" + var foundation_mesh := BoxMesh.new() + foundation_mesh.size = Vector3( + float(MAP_HALF_WIDTH * 2 + 1) * CELL_SIZE + 1.0, + 0.55, + float(MAP_HALF_HEIGHT * 2 + 1) * CELL_SIZE + 1.0 + ) + foundation.mesh = foundation_mesh + foundation.position.y = -0.33 + var foundation_material := StandardMaterial3D.new() + var ground_texture := load(GROUND_MATERIAL_PATH) as Texture2D + if ground_texture != null: + foundation_material.albedo_texture = ground_texture + foundation_material.uv1_scale = Vector3(6.0, 4.0, 1.0) + else: + foundation_material.albedo_color = COLOR_GROUND + foundation_material.metallic = 0.18 + foundation_material.roughness = 0.82 + foundation.material_override = foundation_material + world_container.add_child(foundation) + + var underglow := MeshInstance3D.new() + var underglow_mesh := BoxMesh.new() + underglow_mesh.size = Vector3( + float(MAP_HALF_WIDTH * 2 + 1) * CELL_SIZE + 1.4, + 0.22, + float(MAP_HALF_HEIGHT * 2 + 1) * CELL_SIZE + 1.4 + ) + underglow.mesh = underglow_mesh + underglow.position.y = -0.72 + var underglow_material := StandardMaterial3D.new() + underglow_material.albedo_color = Color("#16384a") + underglow_material.emission_enabled = true + underglow_material.emission = Color("#17485b") + underglow_material.emission_energy_multiplier = 1.4 + underglow.material_override = underglow_material + world_container.add_child(underglow) + + _create_grid_lines() + _create_preview() + _create_decorations() + + +func _create_grid_lines() -> void: + var grid_mesh := ImmediateMesh.new() + var grid_material := StandardMaterial3D.new() + grid_material.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED + grid_material.albedo_color = COLOR_GRID + grid_material.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA + grid_material.vertex_color_use_as_albedo = true + grid_mesh.surface_begin(Mesh.PRIMITIVE_LINES, grid_material) + var min_x := (-MAP_HALF_WIDTH - 0.5) * CELL_SIZE + var max_x := (MAP_HALF_WIDTH + 0.5) * CELL_SIZE + var min_z := (-MAP_HALF_HEIGHT - 0.5) * CELL_SIZE + var max_z := (MAP_HALF_HEIGHT + 0.5) * CELL_SIZE + for x in range(-MAP_HALF_WIDTH, MAP_HALF_WIDTH + 2): + var world_x := (float(x) - 0.5) * CELL_SIZE + grid_mesh.surface_set_color(Color(COLOR_GRID, 0.58)) + grid_mesh.surface_add_vertex(Vector3(world_x, 0.012, min_z)) + grid_mesh.surface_add_vertex(Vector3(world_x, 0.012, max_z)) + for z in range(-MAP_HALF_HEIGHT, MAP_HALF_HEIGHT + 2): + var world_z := (float(z) - 0.5) * CELL_SIZE + grid_mesh.surface_set_color(Color(COLOR_GRID, 0.58)) + grid_mesh.surface_add_vertex(Vector3(min_x, 0.012, world_z)) + grid_mesh.surface_add_vertex(Vector3(max_x, 0.012, world_z)) + grid_mesh.surface_end() + var grid_instance := MeshInstance3D.new() + grid_instance.name = "ConstructionGrid" + grid_instance.mesh = grid_mesh + world_container.add_child(grid_instance) + + +func _create_preview() -> void: + preview = MeshInstance3D.new() + preview.name = "PlacementPreview" + var preview_mesh := BoxMesh.new() + preview_mesh.size = Vector3(CELL_SIZE * 0.88, 0.12, CELL_SIZE * 0.88) + preview.mesh = preview_mesh + preview_material = StandardMaterial3D.new() + preview_material.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA + preview_material.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED + preview_material.albedo_color = Color(COLOR_CYAN, 0.35) + preview.material_override = preview_material + preview.visible = false + world_container.add_child(preview) + + +func _create_decorations() -> void: + _add_material_plinth(Vector3(-21.0, 0.0, -13.2), GROUND_MATERIAL_PATH) + _add_material_plinth(Vector3(21.0, 0.0, 13.2), "res://assets/generated/materials/aged_brass.png") + _add_material_plinth(Vector3(-20.0, 0.0, 12.5), "res://assets/generated/materials/rune_slate.png") + _add_material_plinth(Vector3(19.0, 0.0, -12.5), "res://assets/generated/materials/mana_glass.png") + + +func _add_material_plinth(position_value: Vector3, texture_path: String) -> void: + var plinth := MeshInstance3D.new() + var mesh := BoxMesh.new() + mesh.size = Vector3(2.4, 2.8, 2.4) + plinth.mesh = mesh + plinth.position = position_value + Vector3(0.0, 1.4, 0.0) + var material := StandardMaterial3D.new() + var texture := load(texture_path) as Texture2D + if texture != null: + material.albedo_texture = texture + else: + material.albedo_color = COLOR_GROUND + material.roughness = 0.74 + plinth.material_override = material + decoration_container.add_child(plinth) + + +func _create_camera() -> void: + camera = Camera3D.new() + camera.name = "FactoryCamera" + camera.projection = Camera3D.PROJECTION_ORTHOGONAL + camera.size = camera_distance + camera.near = 0.1 + camera.far = 180.0 + camera.current = true + add_child(camera) + _update_camera_transform() + + +func _update_camera(delta: float) -> void: + if not simulation_enabled or game_paused: + return + var movement := Vector3.ZERO + if Input.is_physical_key_pressed(KEY_W): + movement.z -= 1.0 + if Input.is_physical_key_pressed(KEY_S): + movement.z += 1.0 + if Input.is_physical_key_pressed(KEY_A): + movement.x -= 1.0 + if Input.is_physical_key_pressed(KEY_D): + movement.x += 1.0 + if movement.length_squared() > 0.0: + movement = movement.normalized() + camera_focus += movement * delta * 12.0 + camera_focus.x = clampf(camera_focus.x, -12.0, 12.0) + camera_focus.z = clampf(camera_focus.z, -7.0, 7.0) + _update_camera_transform() + + +func _update_camera_transform() -> void: + camera.size = camera_distance + var height_scale := camera_distance / 28.0 + camera.position = camera_focus + Vector3(18.0, 22.0, 18.0) * height_scale + camera.look_at(camera_focus, Vector3.UP) + + +func _create_item_renderer() -> void: + item_renderer = MultiMeshInstance3D.new() + item_renderer.name = "CrystalItems" + item_multimesh = MultiMesh.new() + item_multimesh.transform_format = MultiMesh.TRANSFORM_3D + item_multimesh.use_colors = true + item_multimesh.instance_count = item_capacity + item_multimesh.visible_instance_count = 0 + + var crystal_mesh := QuadMesh.new() + crystal_mesh.size = Vector2(0.72, 0.72) + var crystal_material := StandardMaterial3D.new() + var raw_texture := load(String(ITEM_RENDER_PATHS[WorldSimulation.ITEM_RAW])) as Texture2D + if raw_texture != null: + crystal_material.albedo_texture = raw_texture + crystal_material.albedo_color = Color.WHITE + crystal_material.vertex_color_use_as_albedo = true + crystal_material.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA + crystal_material.billboard_mode = BaseMaterial3D.BILLBOARD_ENABLED + crystal_material.cull_mode = BaseMaterial3D.CULL_DISABLED + crystal_material.metallic = 0.08 + crystal_material.roughness = 0.42 + crystal_material.emission_enabled = true + crystal_material.emission = Color("#2ed9c2") + crystal_material.emission_energy_multiplier = 0.55 + crystal_mesh.material = crystal_material + item_multimesh.mesh = crystal_mesh + item_renderer.multimesh = item_multimesh + world_container.add_child(item_renderer) + + +func _capture_item_positions_before_tick() -> void: + previous_item_positions = current_item_positions.duplicate() + + +func _capture_item_positions_after_tick() -> void: + var next_positions: Dictionary = {} + for id_variant in simulation.get_item_ids(): + var id := int(id_variant) + next_positions[id] = simulation.get_item_grid_position(id) + if not previous_item_positions.has(id): + previous_item_positions[id] = next_positions[id] + current_item_positions = next_positions + + +func _update_item_renderer(interpolation: float) -> void: + var ids := simulation.get_item_ids() + var count := ids.size() + if count > item_capacity: + item_capacity = maxi(count, item_capacity * 2) + item_multimesh.instance_count = item_capacity + item_multimesh.visible_instance_count = count + + var elapsed := float(Time.get_ticks_msec()) * 0.001 + for index in range(count): + var id := int(ids[index]) + var current: Vector2 = current_item_positions.get( + id, + simulation.get_item_grid_position(id) + ) + var previous: Vector2 = previous_item_positions.get(id, current) + var position_2d := previous.lerp(current, interpolation) + var position_3d := Vector3( + position_2d.x * CELL_SIZE, + 0.78 + sin(elapsed * 3.0 + float(id)) * 0.06, + position_2d.y * CELL_SIZE + ) + var basis := Basis(Vector3.UP, elapsed * 1.8 + float(id) * 0.37) + item_multimesh.set_instance_transform(index, Transform3D(basis, position_3d)) + var item: Dictionary = simulation.items[id] + var color := COLOR_CYAN + match item["kind"]: + WorldSimulation.ITEM_REFINED: + color = COLOR_VIOLET + WorldSimulation.ITEM_CHARGED: + color = COLOR_AMBER + item_multimesh.set_instance_color(index, color) + + +func _reset_demo() -> void: + simulation.reset() + simulation_accumulator = 0.0 + previous_item_positions.clear() + current_item_positions.clear() + bridge_mode = false + bridge_stage = 0 + bridge_machine_id = -1 + selected_building_id = -1 + victory_shown = false + if victory_overlay != null: + victory_overlay.visible = false + + # Locked landmarks create an immediately understandable goal while leaving + # the actual logistics connection to the player. + simulation.place_building(WorldSimulation.KIND_SOURCE, Vector2i(-6, 0), 0, true) + anchor_machine_id = simulation.place_building(WorldSimulation.KIND_MACHINE, Vector2i(-1, 1), 0, true) + charger_machine_id = simulation.place_building(WorldSimulation.KIND_CHARGER, Vector2i(1, 1), 0, true) + simulation.place_building(WorldSimulation.KIND_SINK, Vector2i(6, 0), 0, true) + simulation.place_building(WorldSimulation.KIND_MANA_SOURCE, Vector2i(0, 5), 1, true) + _sync_building_visuals() + _capture_item_positions_after_tick() + camera_focus = Vector3.ZERO + _update_camera_transform() + _update_objective() + _update_inspect_panel() + + +func _build_showcase_line() -> void: + for x in range(-5, -1): + simulation.place_building(WorldSimulation.KIND_BELT, Vector2i(x, 0), 0) + simulation.place_building(WorldSimulation.KIND_BELT, Vector2i(0, 0), 0) + for x in range(2, 6): + simulation.place_building(WorldSimulation.KIND_BELT, Vector2i(x, 0), 0) + for z in range(1, 5): + simulation.place_building(WorldSimulation.KIND_MANA_PIPE, Vector2i(0, z), 1) + simulation.configure_machine_bridge( + anchor_machine_id, + Vector2i(-2, 0), + Vector2i(0, 0) + ) + simulation.configure_machine_bridge( + charger_machine_id, + Vector2i(0, 0), + Vector2i(2, 0) + ) + _sync_building_visuals() + + +func _capture_demo_frame() -> void: + # Give imported models, fonts, and the first moving crystals time to render. + await get_tree().create_timer(5.0).timeout + var output_path := ProjectSettings.globalize_path("res://artifacts/demo-gameplay.png") + var error := get_viewport().get_texture().get_image().save_png(output_path) + if error == OK: + print("DEMO_CAPTURE_OK %s" % output_path) + else: + push_error("Could not save demo capture: %s" % error_string(error)) + get_tree().quit(0 if error == OK else 1) + + +func _try_place_selected() -> void: + if not hover_is_valid: + return + var existing := simulation.get_building_at(hovered_cell) + if not existing.is_empty(): + selected_building_id = int(existing["id"]) + _update_inspect_panel() + return + if not simulation.can_place(hovered_cell): + return + var id := simulation.place_building( + selected_kind, + hovered_cell, + selected_rotation, + false + ) + if id >= 0: + selected_building_id = id + _sync_building_visuals() + _update_inspect_panel() + + +func _try_remove_hovered() -> void: + if not hover_is_valid: + return + var existing := simulation.get_building_at(hovered_cell) + if simulation.remove_building(hovered_cell): + if not existing.is_empty() and int(existing["id"]) == selected_building_id: + selected_building_id = -1 + _sync_building_visuals() + _update_inspect_panel() + + +func _begin_bridge_config() -> void: + if not simulation_enabled or game_paused: + return + bridge_mode = true + bridge_stage = 0 + bridge_machine_id = -1 + _update_tool_ui() + + +func _cancel_bridge_config() -> void: + bridge_mode = false + bridge_stage = 0 + bridge_machine_id = -1 + _update_tool_ui() + + +func _handle_bridge_click() -> void: + if not hover_is_valid: + return + match bridge_stage: + 0: + var building := simulation.get_building_at(hovered_cell) + if building.is_empty() or not WorldSimulation.is_processor(building["kind"]): + return + bridge_machine_id = int(building["id"]) + bridge_stage = 1 + 1: + if not simulation.can_configure_bridge_endpoint(bridge_machine_id, hovered_cell): + return + bridge_input_cell = hovered_cell + bridge_stage = 2 + 2: + if hovered_cell == bridge_input_cell: + return + if not simulation.can_configure_bridge_endpoint(bridge_machine_id, hovered_cell): + return + if simulation.configure_machine_bridge( + bridge_machine_id, + bridge_input_cell, + hovered_cell + ): + bridge_mode = false + bridge_stage = 0 + _sync_bridge_visuals() + _update_tool_ui() + + +func _sync_building_visuals() -> void: + var live_ids := simulation.get_building_ids() + var live_lookup: Dictionary = {} + for id_variant in live_ids: + live_lookup[int(id_variant)] = true + + for id_variant in building_nodes.keys(): + var id := int(id_variant) + if live_lookup.has(id): + continue + var old_node: Node = building_nodes[id] + old_node.queue_free() + building_nodes.erase(id) + indicator_materials.erase(id) + + for id_variant in live_ids: + var id := int(id_variant) + if building_nodes.has(id): + continue + var building: Dictionary = simulation.buildings[id] + var visual := _create_building_visual(building) + building_container.add_child(visual) + building_nodes[id] = visual + _sync_bridge_visuals() + + +func _create_building_visual(building: Dictionary) -> Node3D: + var holder := Node3D.new() + holder.name = "%s_%d" % [String(building["kind"]), int(building["id"])] + holder.position = _cell_to_world(building["cell"]) + holder.rotation.y = 0.0 + + var sprite := _create_building_sprite(building["kind"]) + if sprite != null: + holder.add_child(sprite) + else: + holder.add_child(_create_fallback_mesh(building["kind"])) + + if building["kind"] == WorldSimulation.KIND_BELT: + _add_belt_direction_marker(holder, int(building["rotation"])) + + if building["kind"] in [ + WorldSimulation.KIND_SOURCE, + WorldSimulation.KIND_MACHINE, + WorldSimulation.KIND_CHARGER, + WorldSimulation.KIND_MANA_SOURCE, + ]: + var indicator := MeshInstance3D.new() + indicator.name = "StatusIndicator" + var indicator_mesh := SphereMesh.new() + indicator_mesh.radius = 0.18 + indicator_mesh.height = 0.36 + indicator.mesh = indicator_mesh + indicator.position = Vector3(0.0, 2.1, 0.0) + var indicator_material := StandardMaterial3D.new() + indicator_material.albedo_color = COLOR_AMBER + indicator_material.emission_enabled = true + indicator_material.emission = COLOR_AMBER + indicator_material.emission_energy_multiplier = 2.0 + indicator.material_override = indicator_material + holder.add_child(indicator) + indicator_materials[int(building["id"])] = indicator_material + + if bool(building.get("locked", false)): + var ring := MeshInstance3D.new() + var ring_mesh := CylinderMesh.new() + ring_mesh.top_radius = 1.02 + ring_mesh.bottom_radius = 1.02 + ring_mesh.height = 0.035 + ring.mesh = ring_mesh + ring.position.y = 0.035 + var ring_material := StandardMaterial3D.new() + ring_material.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA + ring_material.albedo_color = Color(COLOR_CYAN, 0.32) + ring_material.emission_enabled = true + ring_material.emission = Color(COLOR_CYAN, 0.5) + ring.material_override = ring_material + holder.add_child(ring) + + return holder + + +func _sync_bridge_visuals() -> void: + if bridge_container == null: + return + for child in bridge_container.get_children(): + child.queue_free() + for id_variant in simulation.get_building_ids(): + var id := int(id_variant) + var machine: Dictionary = simulation.buildings[id] + if not WorldSimulation.is_processor(machine["kind"]): + continue + if not bool(machine.get("bridge_configured", false)): + continue + bridge_container.add_child(_create_bridge_visual(machine)) + + +func _create_bridge_visual(machine: Dictionary) -> Node3D: + var bridge := Node3D.new() + bridge.name = "MachineBridge_%d" % int(machine["id"]) + var input_ground := _cell_to_world(machine["input_cell"]) + var output_ground := _cell_to_world(machine["output_cell"]) + var machine_ground := _cell_to_world(machine["cell"]) + var input_top := input_ground + Vector3.UP * 2.65 + var output_top := output_ground + Vector3.UP * 2.65 + var machine_top := machine_ground + Vector3.UP * 2.65 + + var brass := StandardMaterial3D.new() + brass.albedo_color = Color("#9e7a45") + brass.metallic = 0.72 + brass.roughness = 0.28 + var mana_glow := StandardMaterial3D.new() + mana_glow.albedo_color = COLOR_VIOLET + mana_glow.emission_enabled = true + mana_glow.emission = COLOR_VIOLET + mana_glow.emission_energy_multiplier = 1.8 + + bridge.add_child(_bridge_post(input_ground, brass, COLOR_CYAN)) + bridge.add_child(_bridge_post(output_ground, brass, COLOR_VIOLET)) + bridge.add_child(_bridge_beam(input_top, output_top, brass, 0.16)) + bridge.add_child(_bridge_beam(machine_top, (input_top + output_top) * 0.5, brass, 0.1)) + + var energy_beam := _bridge_beam( + input_top + Vector3.UP * 0.12, + output_top + Vector3.UP * 0.12, + mana_glow, + 0.045 + ) + bridge.add_child(energy_beam) + + var carriage := _create_textured_sprite( + "res://assets/generated/renders/logistics/bridge_arm.png", + 1.15 + ) + if carriage != null: + carriage.position = (input_top + output_top) * 0.5 + Vector3.DOWN * 0.15 + bridge.add_child(carriage) + return bridge + + +func _bridge_post( + ground_position: Vector3, + material: Material, + marker_color: Color + ) -> Node3D: + var post := Node3D.new() + post.position = ground_position + var column := MeshInstance3D.new() + var column_mesh := BoxMesh.new() + column_mesh.size = Vector3(0.16, 2.5, 0.16) + column.mesh = column_mesh + column.position.y = 1.35 + column.material_override = material + post.add_child(column) + + var marker := MeshInstance3D.new() + var marker_mesh := CylinderMesh.new() + marker_mesh.top_radius = 0.35 + marker_mesh.bottom_radius = 0.35 + marker_mesh.height = 0.055 + marker.mesh = marker_mesh + marker.position.y = 0.34 + var marker_material := StandardMaterial3D.new() + marker_material.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA + marker_material.albedo_color = Color(marker_color, 0.62) + marker_material.emission_enabled = true + marker_material.emission = marker_color + marker_material.emission_energy_multiplier = 1.35 + marker.material_override = marker_material + post.add_child(marker) + return post + + +func _bridge_beam( + start: Vector3, + finish: Vector3, + material: Material, + thickness: float + ) -> Node3D: + var beam := Node3D.new() + var distance := start.distance_to(finish) + beam.position = (start + finish) * 0.5 + if distance > 0.0001: + beam.look_at_from_position(beam.position, finish, Vector3.UP) + var mesh_instance := MeshInstance3D.new() + var beam_mesh := BoxMesh.new() + beam_mesh.size = Vector3(thickness, thickness, distance) + mesh_instance.mesh = beam_mesh + mesh_instance.material_override = material + beam.add_child(mesh_instance) + return beam + + +func _create_building_sprite(kind: StringName) -> Sprite3D: + var pixel_size := 0.00235 + if kind == WorldSimulation.KIND_BELT or kind == WorldSimulation.KIND_MANA_PIPE: + pixel_size = 0.00185 + return _create_textured_sprite(String(RENDER_PATHS.get(kind, "")), pixel_size) + + +func _create_textured_sprite(path: String, pixel_size: float) -> Sprite3D: + if path.is_empty(): + return null + var texture := load(path) as Texture2D + if texture == null: + return null + var sprite := Sprite3D.new() + sprite.texture = texture + sprite.pixel_size = pixel_size + sprite.billboard = BaseMaterial3D.BILLBOARD_ENABLED + sprite.transparent = true + sprite.alpha_cut = SpriteBase3D.ALPHA_CUT_DISCARD + sprite.alpha_scissor_threshold = 0.28 + sprite.shaded = true + sprite.position.y = 1.05 + sprite.texture_filter = BaseMaterial3D.TEXTURE_FILTER_LINEAR + return sprite + + +func _add_belt_direction_marker(holder: Node3D, rotation: int) -> void: + var marker := MeshInstance3D.new() + marker.name = "DirectionMarker" + var mesh := BoxMesh.new() + mesh.size = Vector3(0.18, 0.05, 0.62) + marker.mesh = mesh + marker.position = Vector3(0.0, 0.22, 0.0) + marker.rotation.y = -float(rotation) * PI * 0.5 + var material := StandardMaterial3D.new() + material.albedo_color = COLOR_CYAN + material.emission_enabled = true + material.emission = COLOR_CYAN + material.emission_energy_multiplier = 1.4 + marker.material_override = material + holder.add_child(marker) + + +func _create_fallback_mesh(kind: StringName) -> MeshInstance3D: + var fallback := MeshInstance3D.new() + var box := BoxMesh.new() + box.size = Vector3(1.7, 0.5 if kind == WorldSimulation.KIND_BELT else 1.8, 1.7) + fallback.mesh = box + fallback.position.y = box.size.y * 0.5 + var material := StandardMaterial3D.new() + material.albedo_color = COLOR_AMBER if kind == WorldSimulation.KIND_BELT else COLOR_CYAN + fallback.material_override = material + return fallback + + +func _update_building_indicators() -> void: + for id_variant in indicator_materials.keys(): + var id := int(id_variant) + if not simulation.buildings.has(id): + continue + var status: StringName = simulation.buildings[id]["status"] + var color := COLOR_MUTED + match status: + &"working", &"outputting": + color = COLOR_CYAN + &"online": + color = COLOR_VIOLET + &"blocked_output": + color = COLOR_DANGER + &"waiting_input": + color = COLOR_AMBER + &"no_mana": + color = COLOR_VIOLET + var material: StandardMaterial3D = indicator_materials[id] + material.albedo_color = color + material.emission = color + + +func _update_hover() -> void: + if camera == null or not simulation_enabled or game_paused: + hover_is_valid = false + return + var mouse := get_viewport().get_mouse_position() + var origin := camera.project_ray_origin(mouse) + var direction := camera.project_ray_normal(mouse) + if absf(direction.y) < 0.0001: + hover_is_valid = false + return + var distance := -origin.y / direction.y + if distance < 0.0: + hover_is_valid = false + return + var world_position := origin + direction * distance + hovered_cell = Vector2i( + roundi(world_position.x / CELL_SIZE), + roundi(world_position.z / CELL_SIZE) + ) + hover_is_valid = ( + abs(hovered_cell.x) <= MAP_HALF_WIDTH + and abs(hovered_cell.y) <= MAP_HALF_HEIGHT + ) + + +func _update_preview() -> void: + if preview == null: + return + preview.visible = hover_is_valid and simulation_enabled and not game_paused + if not preview.visible: + return + preview.position = _cell_to_world(hovered_cell) + Vector3(0.0, 0.09, 0.0) + preview.rotation.y = -float(selected_rotation) * PI * 0.5 + var valid := simulation.can_place(hovered_cell) + var preview_color := COLOR_CYAN + if bridge_mode: + preview_color = COLOR_VIOLET + if bridge_stage == 0: + var building := simulation.get_building_at(hovered_cell) + valid = not building.is_empty() and WorldSimulation.is_processor(building["kind"]) + else: + valid = simulation.can_configure_bridge_endpoint(bridge_machine_id, hovered_cell) + if bridge_stage == 2 and hovered_cell == bridge_input_cell: + valid = false + preview_material.albedo_color = Color(preview_color if valid else COLOR_DANGER, 0.36) + + +func _create_ui() -> void: + var canvas := CanvasLayer.new() + canvas.name = "HUD" + add_child(canvas) + + var header_panel := PanelContainer.new() + header_panel.position = Vector2(18.0, 18.0) + header_panel.size = Vector2(410.0, 128.0) + header_panel.add_theme_stylebox_override("panel", _panel_style(COLOR_PANEL, COLOR_CYAN)) + canvas.add_child(header_panel) + var header_box := VBoxContainer.new() + header_box.add_theme_constant_override("separation", 4) + header_panel.add_child(header_box) + var title := _label("MANA FOUNDRY / 魔力工坊", 24, COLOR_TEXT) + header_box.add_child(title) + var subtitle := _label("DEMO SITE 01 · CRYSTAL LINE", 11, COLOR_CYAN) + header_box.add_child(subtitle) + objective_label = _label("", 15, COLOR_TEXT) + objective_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + header_box.add_child(objective_label) + + inspect_panel = PanelContainer.new() + inspect_panel.position = Vector2(18.0, 160.0) + inspect_panel.size = Vector2(410.0, 214.0) + inspect_panel.add_theme_stylebox_override("panel", _panel_style(COLOR_PANEL, COLOR_AMBER)) + canvas.add_child(inspect_panel) + var inspect_row := HBoxContainer.new() + inspect_row.add_theme_constant_override("separation", 12) + inspect_panel.add_child(inspect_row) + inspect_icon = TextureRect.new() + inspect_icon.custom_minimum_size = Vector2(88.0, 88.0) + inspect_icon.expand_mode = TextureRect.EXPAND_IGNORE_SIZE + inspect_icon.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED + inspect_row.add_child(inspect_icon) + inspect_label = _label("", 13, COLOR_TEXT) + inspect_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + inspect_label.size_flags_horizontal = Control.SIZE_EXPAND_FILL + inspect_row.add_child(inspect_label) + + stats_panel = PanelContainer.new() + stats_panel.anchor_left = 1.0 + stats_panel.anchor_right = 1.0 + stats_panel.offset_left = -310.0 + stats_panel.offset_right = -18.0 + stats_panel.offset_top = 18.0 + stats_panel.offset_bottom = 144.0 + stats_panel.add_theme_stylebox_override("panel", _panel_style(COLOR_PANEL_DARK, COLOR_VIOLET)) + canvas.add_child(stats_panel) + stats_label = _label("", 13, COLOR_MUTED) + stats_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_RIGHT + stats_panel.add_child(stats_label) + + var toolbar := PanelContainer.new() + toolbar.anchor_left = 0.5 + toolbar.anchor_right = 0.5 + toolbar.anchor_top = 1.0 + toolbar.anchor_bottom = 1.0 + toolbar.offset_left = -620.0 + toolbar.offset_right = 620.0 + toolbar.offset_top = -104.0 + toolbar.offset_bottom = -18.0 + toolbar.add_theme_stylebox_override("panel", _panel_style(COLOR_PANEL, COLOR_CYAN)) + canvas.add_child(toolbar) + var toolbar_box := VBoxContainer.new() + toolbar_box.add_theme_constant_override("separation", 6) + toolbar.add_child(toolbar_box) + var button_row := HBoxContainer.new() + button_row.alignment = BoxContainer.ALIGNMENT_CENTER + button_row.add_theme_constant_override("separation", 8) + toolbar_box.add_child(button_row) + _add_tool_button(button_row, "1 传送带", WorldSimulation.KIND_BELT) + _add_tool_button(button_row, "2 魔晶料斗", WorldSimulation.KIND_SOURCE) + _add_tool_button(button_row, "3 精炼机", WorldSimulation.KIND_MACHINE) + _add_tool_button(button_row, "7 充能台", WorldSimulation.KIND_CHARGER) + _add_tool_button(button_row, "4 收集仓", WorldSimulation.KIND_SINK) + _add_tool_button(button_row, "5 魔力管", WorldSimulation.KIND_MANA_PIPE) + _add_tool_button(button_row, "6 魔力源", WorldSimulation.KIND_MANA_SOURCE) + bridge_button = Button.new() + bridge_button.text = "B 桥臂配置" + bridge_button.custom_minimum_size = Vector2(120.0, 34.0) + bridge_button.focus_mode = Control.FOCUS_NONE + bridge_button.add_theme_font_size_override("font_size", 13) + bridge_button.pressed.connect(_begin_bridge_config) + button_row.add_child(bridge_button) + selected_label = _label("", 13, COLOR_TEXT) + selected_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + toolbar_box.add_child(selected_label) + var controls := _label( + "左键建造/查看 · 右键拆除 · R 旋转 · B 配置桥臂 · WASD 移动画面 · N 重置", + 11, + COLOR_MUTED + ) + controls.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + toolbar_box.add_child(controls) + + var credit := _label("Godot 4.7.1 · 原创符文工业美术", 11, COLOR_MUTED) + credit.anchor_left = 1.0 + credit.anchor_right = 1.0 + credit.anchor_top = 1.0 + credit.anchor_bottom = 1.0 + credit.offset_left = -360.0 + credit.offset_right = -18.0 + credit.offset_top = -18.0 + credit.offset_bottom = -2.0 + credit.horizontal_alignment = HORIZONTAL_ALIGNMENT_RIGHT + canvas.add_child(credit) + + start_overlay = _create_start_overlay(canvas) + pause_overlay = _create_pause_overlay(canvas) + victory_overlay = _create_victory_overlay(canvas) + + +func _add_tool_button(parent: Control, text: String, kind: StringName) -> void: + var button := Button.new() + button.text = text + button.custom_minimum_size = Vector2(118.0, 34.0) + button.focus_mode = Control.FOCUS_NONE + button.add_theme_font_size_override("font_size", 13) + button.pressed.connect(_select_tool.bind(kind)) + parent.add_child(button) + tool_buttons[kind] = button + + +func _create_start_overlay(canvas: CanvasLayer) -> Control: + var shade := ColorRect.new() + shade.name = "StartOverlay" + shade.set_anchors_preset(Control.PRESET_FULL_RECT) + shade.color = Color("#03090dcc") + shade.mouse_filter = Control.MOUSE_FILTER_STOP + canvas.add_child(shade) + + var center := CenterContainer.new() + center.set_anchors_preset(Control.PRESET_FULL_RECT) + shade.add_child(center) + var panel := PanelContainer.new() + panel.custom_minimum_size = Vector2(600.0, 370.0) + panel.add_theme_stylebox_override("panel", _panel_style(Color("#0d222df2"), COLOR_CYAN, 2)) + center.add_child(panel) + var box := VBoxContainer.new() + box.alignment = BoxContainer.ALIGNMENT_CENTER + box.add_theme_constant_override("separation", 14) + panel.add_child(box) + var eyebrow := _label("A SMALL FACTORY, BUILT FOR A VERY LARGE FUTURE", 12, COLOR_CYAN) + eyebrow.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + box.add_child(eyebrow) + var title := _label("MANA FOUNDRY", 42, COLOR_TEXT) + title.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + box.add_child(title) + var chinese_title := _label("魔 力 工 坊", 23, COLOR_VIOLET) + chinese_title.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + box.add_child(chinese_title) + var description := _label( + "铺设魔力管道,再给精炼机和充能台绑定桥臂,\n把粗晶炼成精炼晶,再充能为稳定产出。", + 16, + COLOR_TEXT + ) + description.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + box.add_child(description) + var start_button := Button.new() + start_button.text = "开始构筑" + start_button.custom_minimum_size = Vector2(220.0, 48.0) + start_button.add_theme_font_size_override("font_size", 18) + start_button.pressed.connect(_start_game) + box.add_child(start_button) + var note := _label("第一目标:接通魔力,再按 B 分别为两台机器指定取货与放货点", 12, COLOR_MUTED) + note.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + box.add_child(note) + return shade + + +func _create_pause_overlay(canvas: CanvasLayer) -> Control: + var shade := ColorRect.new() + shade.name = "PauseOverlay" + shade.set_anchors_preset(Control.PRESET_FULL_RECT) + shade.color = Color("#03090d99") + shade.mouse_filter = Control.MOUSE_FILTER_STOP + shade.visible = false + canvas.add_child(shade) + var center := CenterContainer.new() + center.set_anchors_preset(Control.PRESET_FULL_RECT) + shade.add_child(center) + var panel := PanelContainer.new() + panel.custom_minimum_size = Vector2(360.0, 190.0) + panel.add_theme_stylebox_override("panel", _panel_style(COLOR_PANEL, COLOR_VIOLET, 2)) + center.add_child(panel) + var box := VBoxContainer.new() + box.alignment = BoxContainer.ALIGNMENT_CENTER + box.add_theme_constant_override("separation", 16) + panel.add_child(box) + var title := _label("工坊已暂停", 26, COLOR_TEXT) + title.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + box.add_child(title) + var resume := Button.new() + resume.text = "继续" + resume.custom_minimum_size = Vector2(180.0, 42.0) + resume.pressed.connect(_set_paused.bind(false)) + box.add_child(resume) + return shade + + +func _create_victory_overlay(canvas: CanvasLayer) -> Control: + var shade := ColorRect.new() + shade.name = "VictoryOverlay" + shade.set_anchors_preset(Control.PRESET_FULL_RECT) + shade.color = Color("#07131dbb") + shade.mouse_filter = Control.MOUSE_FILTER_STOP + shade.visible = false + canvas.add_child(shade) + var center := CenterContainer.new() + center.set_anchors_preset(Control.PRESET_FULL_RECT) + shade.add_child(center) + var panel := PanelContainer.new() + panel.custom_minimum_size = Vector2(520.0, 270.0) + panel.add_theme_stylebox_override("panel", _panel_style(Color("#102a34f5"), COLOR_CYAN, 2)) + center.add_child(panel) + var box := VBoxContainer.new() + box.alignment = BoxContainer.ALIGNMENT_CENTER + box.add_theme_constant_override("separation", 14) + panel.add_child(box) + var eyebrow := _label("PRODUCTION STABLE", 12, COLOR_CYAN) + eyebrow.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + box.add_child(eyebrow) + var title := _label("充能晶体产线已稳定", 28, COLOR_TEXT) + title.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + box.add_child(title) + victory_label = _label("", 15, COLOR_MUTED) + victory_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + box.add_child(victory_label) + var continue_button := Button.new() + continue_button.text = "继续扩建" + continue_button.custom_minimum_size = Vector2(190.0, 42.0) + continue_button.pressed.connect(func() -> void: shade.visible = false) + box.add_child(continue_button) + return shade + + +func _start_game() -> void: + start_overlay.visible = false + simulation_enabled = true + game_paused = false + + +func _set_paused(value: bool) -> void: + game_paused = value + pause_overlay.visible = value + + +func _select_tool(kind: StringName) -> void: + bridge_mode = false + bridge_stage = 0 + bridge_machine_id = -1 + selected_kind = kind + _update_tool_ui() + + +func _update_tool_ui() -> void: + if selected_label == null: + return + if bridge_mode: + match bridge_stage: + 0: + selected_label.text = "桥臂配置:点击要绑定的机器" + 1: + selected_label.text = "桥臂配置:点击取货传送带(青色端)" + 2: + selected_label.text = "桥臂配置:点击放货传送带(紫色端)" + else: + var arrow: String = ["→ 东", "↓ 南", "← 西", "↑ 北"][selected_rotation] + selected_label.text = "当前:%s · 朝向:%s" % [DISPLAY_NAMES[selected_kind], arrow] + for kind in tool_buttons: + var button: Button = tool_buttons[kind] + button.modulate = COLOR_CYAN if kind == selected_kind and not bridge_mode else Color.WHITE + if bridge_button != null: + bridge_button.modulate = COLOR_VIOLET if bridge_mode else Color.WHITE + + +func _update_objective() -> void: + if objective_label == null: + return + var charged := simulation.get_charged_count() + var refine: Dictionary = simulation.buildings.get(anchor_machine_id, {}) + var charger: Dictionary = simulation.buildings.get(charger_machine_id, {}) + var refine_powered := not refine.is_empty() and bool(refine.get("mana_powered", false)) + var charger_powered := not charger.is_empty() and bool(charger.get("mana_powered", false)) + if not refine_powered or not charger_powered: + objective_label.text = "目标:按 5 从魔力源铺管道,同时接到精炼机和充能台侧面。" + elif not bool(refine.get("bridge_configured", false)): + objective_label.text = "魔力已接通。按 B 给精炼机指定取货带与放货带。" + elif not bool(charger.get("bridge_configured", false)): + objective_label.text = "精炼机已绑定。按 B 给充能台指定取货带与放货带。" + elif charged <= 0: + objective_label.text = "桥臂已绑定。完成料斗、中段与收集仓的传送带连接。" + elif not simulation.is_demo_complete(): + objective_label.text = "产线已经启动。持续收集充能晶体:%d / %d" % [ + charged, + WorldSimulation.COMPLETION_CHARGED_COUNT, + ] + else: + objective_label.text = "生产稳定:已收集 %d 个充能晶体。可以继续扩建。" % charged + if not victory_shown: + victory_shown = true + victory_label.text = "收集仓已持续接收 %d 个充能晶体。\n粗晶 → 精炼晶 → 充能晶 的两级产线正在运转。" % charged + victory_overlay.visible = true + + +func _update_inspect_panel() -> void: + if inspect_label == null or inspect_panel == null: + return + if selected_building_id < 0 or not simulation.buildings.has(selected_building_id): + selected_building_id = -1 + if inspect_icon != null: + inspect_icon.texture = null + inspect_label.text = "点击已放置的建筑查看配方、进度、库存与停机原因。\n界面只读取模拟状态,不会改写产线。" + return + + var report := simulation.inspect_building(selected_building_id) + if report.is_empty(): + selected_building_id = -1 + if inspect_icon != null: + inspect_icon.texture = null + inspect_label.text = "点击已放置的建筑查看配方、进度、库存与停机原因。" + return + + var kind: StringName = report["kind"] + if inspect_icon != null: + var icon_path := String(RENDER_PATHS.get(kind, "")) + if icon_path.is_empty(): + inspect_icon.texture = null + else: + inspect_icon.texture = load(icon_path) as Texture2D + var title: String = String(DISPLAY_NAMES.get(kind, String(kind))) + var lines: Array[String] = [ + "选中:%s · #%d" % [title, int(report["id"])], + "状态:%s" % String(report["status"]), + ] + var recipe: Dictionary = report["recipe"] + if not recipe.is_empty(): + var recipe_id: StringName = recipe.get("id", &"") + lines.append("配方:%s" % String(RECIPE_DISPLAY.get(recipe_id, String(recipe_id)))) + var progress: Dictionary = report["progress"] + lines.append("进度:%d%% · 剩余 %d tick" % [ + int(round(float(progress.get("ratio", 0.0)) * 100.0)), + int(progress.get("remaining_ticks", 0)), + ]) + var inventory: Dictionary = report["inventory"] + lines.append("库存:入 %d/%d %s · 出缓冲 %d %s" % [ + int(inventory.get("input_count", 0)), + int(inventory.get("input_capacity", 0)), + ITEM_DISPLAY.get(inventory.get("input_kind", &""), String(inventory.get("input_kind", &""))), + int(inventory.get("output_buffer", 0)), + ITEM_DISPLAY.get(inventory.get("output_kind", &""), String(inventory.get("output_kind", &""))), + ]) + var mana: Dictionary = report["mana"] + lines.append("魔力:%s · 管网 %d · 需求 %d" % [ + "已接通" if bool(mana.get("powered", false)) else "未接通", + int(mana.get("network", -1)), + int(mana.get("demand", 0)), + ]) + elif kind == WorldSimulation.KIND_SINK: + var inventory: Dictionary = report["inventory"] + lines.append("库存:粗晶 %d · 精炼 %d · 充能 %d" % [ + int(inventory.get(WorldSimulation.ITEM_RAW, 0)), + int(inventory.get(WorldSimulation.ITEM_REFINED, 0)), + int(inventory.get(WorldSimulation.ITEM_CHARGED, 0)), + ]) + elif kind == WorldSimulation.KIND_SOURCE: + var inventory: Dictionary = report["inventory"] + lines.append("已产出粗晶:%d" % int(inventory.get("produced", 0))) + var reason := String(report.get("reason", "")) + if reason.is_empty(): + lines.append("运行正常。") + else: + lines.append("原因:%s" % reason) + inspect_label.text = "\n".join(lines) + + +func _update_stats() -> void: + if stats_label == null: + return + var metrics := simulation.get_metrics() + stats_label.text = ( + "SIMULATION\n" + + "Tick %d · %.3f ms\n" % [simulation.tick_index, float(last_tick_microseconds) / 1000.0] + + "建筑 %d · 运输物 %d\n" % [simulation.buildings.size(), int(metrics["items"])] + + "机器 %d 工作 / %d 休眠\n" % [ + int(metrics["working_machines"]), + int(metrics["sleeping_machines"]), + ] + + "魔力网 %d · 管道 %d\n" % [ + int(metrics["mana_networks"]), + int(metrics["mana_pipes"]), + ] + + "事件队列 %d · 充能晶 %d" % [ + int(metrics["scheduled_events"]), + simulation.get_charged_count(), + ] + ) + + +func _cell_to_world(cell_variant: Variant) -> Vector3: + var cell := Vector2i(cell_variant) + return Vector3(float(cell.x) * CELL_SIZE, 0.0, float(cell.y) * CELL_SIZE) + + +func _label(text: String, size: int, color: Color) -> Label: + var label := Label.new() + label.text = text + label.add_theme_font_size_override("font_size", size) + label.add_theme_color_override("font_color", color) + return label + + +func _panel_style( + background: Color, + border: Color, + border_width: int = 1 + ) -> StyleBoxFlat: + var style := StyleBoxFlat.new() + style.bg_color = background + style.border_color = border + style.set_border_width_all(border_width) + style.corner_radius_top_left = 8 + style.corner_radius_top_right = 8 + style.corner_radius_bottom_left = 8 + style.corner_radius_bottom_right = 8 + style.content_margin_left = 16.0 + style.content_margin_right = 16.0 + style.content_margin_top = 12.0 + style.content_margin_bottom = 12.0 + return style diff --git a/src/main.gd.uid b/src/main.gd.uid new file mode 100644 index 0000000..d1799de --- /dev/null +++ b/src/main.gd.uid @@ -0,0 +1 @@ +uid://cou2vqp2i1liy diff --git a/src/simulation/world_simulation.gd b/src/simulation/world_simulation.gd new file mode 100644 index 0000000..10a3266 --- /dev/null +++ b/src/simulation/world_simulation.gd @@ -0,0 +1,1004 @@ +class_name WorldSimulation +extends RefCounted + +## Exact, fixed-tick gameplay state for the demo production chain. +## +## Buildings and items are plain data keyed by integer IDs. Producers wake only +## when a scheduled completion fires or when an output cell becomes available; +## blocked machines are therefore not polled every tick. + +const TICKS_PER_SECOND := 20 +const TICK_SECONDS := 1.0 / float(TICKS_PER_SECOND) +const BELT_SPEED_CELLS_PER_SECOND := 2.5 +const SOURCE_INTERVAL_TICKS := 18 +const MACHINE_DURATION_TICKS := 34 +const MACHINE_INPUT_CAPACITY := 2 +const ITEM_CAPACITY_PER_BELT := 1 +const MANA_SOURCE_CAPACITY := 2 +const MACHINE_MANA_DEMAND := 1 +const BRIDGE_MAX_RANGE := 7 +const COMPLETION_CHARGED_COUNT := 8 +const COMPLETION_WINDOW_TICKS := 480 +const COMPLETION_MIN_IN_WINDOW := 3 + +const KIND_BELT: StringName = &"belt" +const KIND_SOURCE: StringName = &"source" +const KIND_MACHINE: StringName = &"machine" +const KIND_CHARGER: StringName = &"charger" +const KIND_SINK: StringName = &"sink" +const KIND_MANA_PIPE: StringName = &"mana_pipe" +const KIND_MANA_SOURCE: StringName = &"mana_source" + +const ITEM_RAW: StringName = &"raw_crystal" +const ITEM_REFINED: StringName = &"refined_crystal" +const ITEM_CHARGED: StringName = &"charged_crystal" + +const RECIPE_REFINE: StringName = &"refine_crystal" +const RECIPE_CHARGE: StringName = &"charge_crystal" + +const DIRECTIONS: Array[Vector2i] = [ + Vector2i(1, 0), + Vector2i(0, 1), + Vector2i(-1, 0), + Vector2i(0, -1), +] + +var tick_index := 0 +var next_building_id := 1 +var next_item_id := 1 + +var buildings: Dictionary = {} +var grid: Dictionary = {} +var items: Dictionary = {} +var item_by_cell: Dictionary = {} +var sink_inventory: Dictionary = { + ITEM_RAW: 0, + ITEM_REFINED: 0, + ITEM_CHARGED: 0, +} + +var _event_heap: Array = [] +var _wake_queue: Dictionary = {} +var _output_watchers: Dictionary = {} +var _input_watchers: Dictionary = {} +var mana_networks: Array[Dictionary] = [] +var _charged_intake_ticks: Array = [] + + +func reset() -> void: + tick_index = 0 + next_building_id = 1 + next_item_id = 1 + buildings.clear() + grid.clear() + items.clear() + item_by_cell.clear() + sink_inventory = {ITEM_RAW: 0, ITEM_REFINED: 0, ITEM_CHARGED: 0} + _event_heap.clear() + _wake_queue.clear() + _output_watchers.clear() + _input_watchers.clear() + mana_networks.clear() + _charged_intake_ticks.clear() + + +func can_place(cell: Vector2i) -> bool: + return not grid.has(cell) + + +func place_building( + kind: StringName, + cell: Vector2i, + rotation: int = 0, + locked: bool = false + ) -> int: + if not can_place(cell): + return -1 + if kind not in [ + KIND_BELT, + KIND_SOURCE, + KIND_MACHINE, + KIND_CHARGER, + KIND_SINK, + KIND_MANA_PIPE, + KIND_MANA_SOURCE, + ]: + return -1 + + var id := next_building_id + next_building_id += 1 + var normalized_rotation := posmod(rotation, 4) + var building := { + "id": id, + "kind": kind, + "cell": cell, + "rotation": normalized_rotation, + "locked": locked, + "status": &"idle", + } + + match kind: + KIND_SOURCE: + building.merge({ + "next_ready_tick": tick_index + 1, + "scheduled_tick": -1, + "produced": 0, + }) + KIND_MACHINE: + building.merge(_processor_fields( + cell, + normalized_rotation, + RECIPE_REFINE, + ITEM_RAW, + ITEM_REFINED + )) + KIND_CHARGER: + building.merge(_processor_fields( + cell, + normalized_rotation, + RECIPE_CHARGE, + ITEM_REFINED, + ITEM_CHARGED + )) + KIND_SINK: + building["accepted"] = 0 + KIND_MANA_SOURCE: + building.merge({ + "capacity": MANA_SOURCE_CAPACITY, + "mana_network": -1, + "status": &"online", + }) + KIND_MANA_PIPE: + building["mana_network"] = -1 + + buildings[id] = building + grid[cell] = id + + if kind == KIND_SOURCE or is_processor(kind): + _register_output_watcher(id) + _wake(id) + if is_processor(kind): + _register_input_watcher(id) + + # A newly placed belt may be the missing output destination for an exact + # producer wake-up. + if kind == KIND_BELT: + _notify_space_available(cell) + if is_processor(kind) or kind == KIND_MANA_PIPE or kind == KIND_MANA_SOURCE: + _rebuild_mana_networks() + return id + + +func remove_building(cell: Vector2i, allow_locked: bool = false) -> bool: + if not grid.has(cell): + return false + var id: int = grid[cell] + var building: Dictionary = buildings[id] + if bool(building.get("locked", false)) and not allow_locked: + return false + + if building["kind"] == KIND_SOURCE or is_processor(building["kind"]): + _unregister_output_watcher(id) + if is_processor(building["kind"]): + _unregister_input_watcher(id) + if item_by_cell.has(cell): + _remove_item(int(item_by_cell[cell])) + + grid.erase(cell) + buildings.erase(id) + _wake_queue.erase(id) + if building["kind"] == KIND_BELT: + _notify_input_changed(cell) + if is_processor(building["kind"]) or building["kind"] == KIND_MANA_PIPE or building["kind"] == KIND_MANA_SOURCE: + _rebuild_mana_networks() + return true + + +func rotate_building(cell: Vector2i, clockwise: bool = true) -> bool: + if not grid.has(cell): + return false + var id: int = grid[cell] + var building: Dictionary = buildings[id] + if bool(building.get("locked", false)): + return false + if building["kind"] == KIND_SOURCE or is_processor(building["kind"]): + _unregister_output_watcher(id) + if is_processor(building["kind"]): + _unregister_input_watcher(id) + building["rotation"] = posmod(int(building["rotation"]) + (1 if clockwise else -1), 4) + if is_processor(building["kind"]) and not bool(building["bridge_configured"]): + var facing := direction_for(int(building["rotation"])) + building["input_cell"] = Vector2i(building["cell"]) - facing + building["output_cell"] = Vector2i(building["cell"]) + facing + if building["kind"] == KIND_SOURCE or is_processor(building["kind"]): + _register_output_watcher(id) + _wake(id) + if is_processor(building["kind"]): + _register_input_watcher(id) + if is_processor(building["kind"]) or building["kind"] == KIND_MANA_PIPE or building["kind"] == KIND_MANA_SOURCE: + _rebuild_mana_networks() + return true + + +func configure_machine_bridge( + machine_id: int, + input_cell: Vector2i, + output_cell: Vector2i + ) -> bool: + if not buildings.has(machine_id): + return false + var machine: Dictionary = buildings[machine_id] + if not is_processor(machine["kind"]): + return false + if input_cell == output_cell or not _is_belt(input_cell) or not _is_belt(output_cell): + return false + var machine_cell: Vector2i = machine["cell"] + if _bridge_distance(machine_cell, input_cell) > BRIDGE_MAX_RANGE: + return false + if _bridge_distance(machine_cell, output_cell) > BRIDGE_MAX_RANGE: + return false + + _unregister_input_watcher(machine_id) + _unregister_output_watcher(machine_id) + machine["input_cell"] = input_cell + machine["output_cell"] = output_cell + machine["bridge_configured"] = true + _register_input_watcher(machine_id) + _register_output_watcher(machine_id) + _wake(machine_id) + if item_by_cell.has(input_cell): + _notify_item_arrived(input_cell) + return true + + +func can_configure_bridge_endpoint(machine_id: int, cell: Vector2i) -> bool: + if not buildings.has(machine_id) or not is_processor(buildings[machine_id]["kind"]): + return false + return ( + _is_belt(cell) + and _bridge_distance(Vector2i(buildings[machine_id]["cell"]), cell) <= BRIDGE_MAX_RANGE + ) + + +func step() -> void: + tick_index += 1 + _process_due_events() + _move_items() + _process_wake_queue() + + +func get_building_at(cell: Vector2i) -> Dictionary: + if not grid.has(cell): + return {} + return buildings[int(grid[cell])] + + +func get_building_ids() -> Array: + var ids := buildings.keys() + ids.sort() + return ids + + +func get_item_ids() -> Array: + var ids := items.keys() + ids.sort() + return ids + + +func get_item_grid_position(item_id: int) -> Vector2: + if not items.has(item_id): + return Vector2.ZERO + var item: Dictionary = items[item_id] + var cell: Vector2i = item["cell"] + var direction := _belt_direction(cell) + return Vector2(cell) + Vector2(direction) * float(item["progress"]) + + +func get_refined_count() -> int: + return int(sink_inventory.get(ITEM_REFINED, 0)) + + +func get_charged_count() -> int: + return int(sink_inventory.get(ITEM_CHARGED, 0)) + + +func is_demo_complete() -> bool: + if get_charged_count() < COMPLETION_CHARGED_COUNT: + return false + var window_start := tick_index - COMPLETION_WINDOW_TICKS + var recent := 0 + for tick_variant in _charged_intake_ticks: + if int(tick_variant) >= window_start: + recent += 1 + return recent >= COMPLETION_MIN_IN_WINDOW + + +func inspect_building(building_id: int) -> Dictionary: + if not buildings.has(building_id): + return {} + var building: Dictionary = buildings[building_id] + var status: StringName = building.get("status", &"idle") + var payload := { + "id": building_id, + "kind": building["kind"], + "cell": building["cell"], + "status": status, + "recipe": {}, + "progress": { + "remaining_ticks": 0, + "completion_tick": -1, + "ratio": 0.0, + }, + "inventory": {}, + "mana": { + "powered": false, + "network": -1, + "demand": 0, + }, + "reason": _status_reason(status), + "reason_code": status, + } + if is_processor(building["kind"]): + var remaining := 0 + var completion_tick := int(building.get("completion_tick", -1)) + if completion_tick >= 0: + remaining = maxi(0, completion_tick - tick_index) + elif int(building.get("remaining_ticks", 0)) > 0: + remaining = int(building["remaining_ticks"]) + var ratio := 0.0 + if remaining > 0 or completion_tick >= 0 or int(building.get("remaining_ticks", 0)) > 0: + ratio = clampf( + 1.0 - float(remaining) / float(MACHINE_DURATION_TICKS), + 0.0, + 1.0 + ) + payload["recipe"] = { + "id": building.get("recipe", RECIPE_REFINE), + "input_kind": building.get("input_kind", ITEM_RAW), + "output_kind": building.get("output_kind", ITEM_REFINED), + "duration_ticks": MACHINE_DURATION_TICKS, + } + payload["progress"] = { + "remaining_ticks": remaining, + "completion_tick": completion_tick, + "ratio": ratio, + } + payload["inventory"] = { + "input_count": int(building.get("input_count", 0)), + "output_buffer": int(building.get("output_buffer", 0)), + "input_kind": building.get("input_kind", ITEM_RAW), + "output_kind": building.get("output_kind", ITEM_REFINED), + "input_capacity": MACHINE_INPUT_CAPACITY, + "completed": int(building.get("completed", 0)), + } + payload["mana"] = { + "powered": bool(building.get("mana_powered", false)), + "network": int(building.get("mana_network", -1)), + "demand": MACHINE_MANA_DEMAND, + } + elif building["kind"] == KIND_SOURCE: + payload["inventory"] = {"produced": int(building.get("produced", 0))} + elif building["kind"] == KIND_SINK: + payload["inventory"] = sink_inventory.duplicate() + elif building["kind"] == KIND_MANA_SOURCE: + payload["mana"] = { + "powered": true, + "network": int(building.get("mana_network", -1)), + "demand": 0, + "capacity": int(building.get("capacity", 0)), + } + return payload + + +func inspect_cell(cell: Vector2i) -> Dictionary: + if not grid.has(cell): + return {} + return inspect_building(int(grid[cell])) + + +func get_metrics() -> Dictionary: + var counts := { + "belts": 0, + "sources": 0, + "machines": 0, + "chargers": 0, + "sinks": 0, + "mana_pipes": 0, + "mana_sources": 0, + "mana_networks": mana_networks.size(), + "working_machines": 0, + "sleeping_machines": 0, + "items": items.size(), + "scheduled_events": _event_heap.size(), + } + for building: Dictionary in buildings.values(): + match building["kind"]: + KIND_BELT: + counts["belts"] += 1 + KIND_SOURCE: + counts["sources"] += 1 + KIND_MACHINE, KIND_CHARGER: + if building["kind"] == KIND_CHARGER: + counts["chargers"] += 1 + else: + counts["machines"] += 1 + if building["status"] == &"working": + counts["working_machines"] += 1 + else: + counts["sleeping_machines"] += 1 + KIND_SINK: + counts["sinks"] += 1 + KIND_MANA_PIPE: + counts["mana_pipes"] += 1 + KIND_MANA_SOURCE: + counts["mana_sources"] += 1 + return counts + + +func state_fingerprint() -> String: + var parts: Array[String] = [] + parts.append("tick=%d" % tick_index) + parts.append("refined=%d" % get_refined_count()) + parts.append("charged=%d" % get_charged_count()) + for id in get_building_ids(): + var building: Dictionary = buildings[id] + parts.append("b:%d:%s:%s:%d:%s:%d:%d" % [ + id, + String(building["kind"]), + str(building["cell"]), + int(building["rotation"]), + String(building.get("status", &"")), + int(building.get("input_count", 0)), + int(building.get("output_buffer", 0)), + ]) + for id in get_item_ids(): + var item: Dictionary = items[id] + parts.append("i:%d:%s:%s:%.6f" % [ + id, + String(item["kind"]), + str(item["cell"]), + float(item["progress"]), + ]) + return str(hash("|".join(parts))) + + +func _move_items() -> void: + var ids := get_item_ids() + for id_variant in ids: + var id := int(id_variant) + if not items.has(id): + continue + var item: Dictionary = items[id] + var cell: Vector2i = item["cell"] + if not _is_belt(cell): + _remove_item(id) + continue + + item["progress"] = float(item["progress"]) + BELT_SPEED_CELLS_PER_SECOND * TICK_SECONDS + if float(item["progress"]) < 1.0: + continue + + var direction := _belt_direction(cell) + var target := cell + direction + if _is_belt(target): + if item_by_cell.has(target): + item["progress"] = 0.82 + continue + item_by_cell.erase(cell) + _notify_space_available(cell) + item["cell"] = target + item["progress"] = minf(float(item["progress"]) - 1.0, 0.25) + item_by_cell[target] = id + _notify_item_arrived(target) + continue + + if _try_deliver_item(id, target, cell, direction): + continue + item["progress"] = 0.82 + + +func _try_deliver_item( + item_id: int, + target: Vector2i, + from_cell: Vector2i, + direction: Vector2i + ) -> bool: + if not grid.has(target): + return false + var building: Dictionary = buildings[int(grid[target])] + var expected_input_cell := target - direction_for(int(building["rotation"])) + if expected_input_cell != from_cell: + return false + + var item: Dictionary = items[item_id] + if is_processor(building["kind"]): + if direction != direction_for(int(building["rotation"])): + return false + if item["kind"] != building["input_kind"]: + return false + if int(building["input_count"]) >= MACHINE_INPUT_CAPACITY: + return false + building["input_count"] = int(building["input_count"]) + 1 + _remove_item(item_id) + _wake(int(building["id"])) + return true + if building["kind"] == KIND_SINK: + if direction != direction_for(int(building["rotation"])): + return false + var kind: StringName = item["kind"] + sink_inventory[kind] = int(sink_inventory.get(kind, 0)) + 1 + building["accepted"] = int(building["accepted"]) + 1 + if kind == ITEM_CHARGED: + _record_charged_intake() + _remove_item(item_id) + return true + return false + + +func _remove_item(item_id: int) -> void: + if not items.has(item_id): + return + var cell: Vector2i = items[item_id]["cell"] + items.erase(item_id) + if item_by_cell.get(cell, -1) == item_id: + item_by_cell.erase(cell) + _notify_space_available(cell) + + +func _spawn_item(kind: StringName, cell: Vector2i) -> bool: + if not _is_belt(cell) or item_by_cell.has(cell): + return false + var id := next_item_id + next_item_id += 1 + items[id] = { + "id": id, + "kind": kind, + "cell": cell, + "progress": 0.0, + } + item_by_cell[cell] = id + _notify_item_arrived(cell) + return true + + +func _process_wake_queue() -> void: + # Wake processing may enqueue another producer, so drain to a bounded fixed + # point. A producer can only add one new wake per successful state change. + var passes := 0 + while not _wake_queue.is_empty() and passes < 8: + passes += 1 + var ids := _wake_queue.keys() + ids.sort() + _wake_queue.clear() + for id_variant in ids: + var id := int(id_variant) + if not buildings.has(id): + continue + var building: Dictionary = buildings[id] + match building["kind"]: + KIND_SOURCE: + _process_source(building) + KIND_MACHINE, KIND_CHARGER: + _process_machine(building) + + +func _process_source(source: Dictionary) -> void: + if int(source["scheduled_tick"]) >= 0: + return + if tick_index < int(source["next_ready_tick"]): + _schedule_source(source, int(source["next_ready_tick"])) + return + + var output_cell := _output_cell(source) + if _spawn_item(ITEM_RAW, output_cell): + source["produced"] = int(source["produced"]) + 1 + source["status"] = &"working" + source["next_ready_tick"] = tick_index + SOURCE_INTERVAL_TICKS + _schedule_source(source, int(source["next_ready_tick"])) + else: + source["status"] = &"blocked_output" + + +func _process_machine(machine: Dictionary) -> void: + if not bool(machine["mana_powered"]): + machine["status"] = &"no_mana" + return + + if int(machine["remaining_ticks"]) > 0 and int(machine["completion_tick"]) < 0: + machine["completion_tick"] = tick_index + int(machine["remaining_ticks"]) + machine["status"] = &"working" + _push_event({ + "tick": int(machine["completion_tick"]), + "type": &"machine_complete", + "id": int(machine["id"]), + }) + return + + if int(machine["completion_tick"]) >= 0: + machine["status"] = &"working" + return + + var emitted := false + if int(machine["output_buffer"]) > 0: + if _spawn_item(machine["output_kind"], _output_cell(machine)): + machine["output_buffer"] = int(machine["output_buffer"]) - 1 + emitted = true + else: + machine["status"] = &"blocked_output" + return + + if int(machine["input_count"]) == 0: + _try_pull_machine_input(machine) + + if int(machine["input_count"]) > 0 and int(machine["output_buffer"]) == 0: + machine["input_count"] = int(machine["input_count"]) - 1 + machine["remaining_ticks"] = MACHINE_DURATION_TICKS + machine["completion_tick"] = tick_index + int(machine["remaining_ticks"]) + machine["status"] = &"working" + _push_event({ + "tick": int(machine["completion_tick"]), + "type": &"machine_complete", + "id": int(machine["id"]), + }) + elif emitted: + machine["status"] = &"outputting" + else: + machine["status"] = &"waiting_input" if _is_belt(_input_cell(machine)) else &"missing_input" + + +func _try_pull_machine_input(machine: Dictionary) -> bool: + var input_cell := _input_cell(machine) + if not item_by_cell.has(input_cell): + return false + var item_id := int(item_by_cell[input_cell]) + if not items.has(item_id): + return false + if items[item_id]["kind"] != machine["input_kind"]: + return false + if int(machine["input_count"]) >= MACHINE_INPUT_CAPACITY: + return false + machine["input_count"] = int(machine["input_count"]) + 1 + _remove_item(item_id) + return true + + +func _process_due_events() -> void: + while not _event_heap.is_empty() and int(_event_heap[0]["tick"]) <= tick_index: + var event: Dictionary = _heap_pop() + var id := int(event["id"]) + if not buildings.has(id): + continue + var building: Dictionary = buildings[id] + match event["type"]: + &"source_ready": + if building["kind"] != KIND_SOURCE or int(building["scheduled_tick"]) != int(event["tick"]): + continue + building["scheduled_tick"] = -1 + _wake(id) + &"machine_complete": + if not is_processor(building["kind"]) or int(building["completion_tick"]) != int(event["tick"]): + continue + building["completion_tick"] = -1 + building["remaining_ticks"] = 0 + building["output_buffer"] = int(building["output_buffer"]) + 1 + building["completed"] = int(building["completed"]) + 1 + _wake(id) + + +func _schedule_source(source: Dictionary, at_tick: int) -> void: + if int(source["scheduled_tick"]) == at_tick: + return + source["scheduled_tick"] = at_tick + _push_event({ + "tick": at_tick, + "type": &"source_ready", + "id": int(source["id"]), + }) + + +func _wake(id: int) -> void: + if buildings.has(id): + _wake_queue[id] = true + + +func _register_output_watcher(id: int) -> void: + if not buildings.has(id): + return + var cell := _output_cell(buildings[id]) + var watchers: Array = _output_watchers.get(cell, []) + if id not in watchers: + watchers.append(id) + watchers.sort() + _output_watchers[cell] = watchers + + +func _unregister_output_watcher(id: int) -> void: + if not buildings.has(id): + return + var cell := _output_cell(buildings[id]) + if not _output_watchers.has(cell): + return + var watchers: Array = _output_watchers[cell] + watchers.erase(id) + if watchers.is_empty(): + _output_watchers.erase(cell) + else: + _output_watchers[cell] = watchers + + +func _notify_space_available(cell: Vector2i) -> void: + if not _output_watchers.has(cell): + return + for id_variant in _output_watchers[cell]: + _wake(int(id_variant)) + + +func _register_input_watcher(machine_id: int) -> void: + if not buildings.has(machine_id) or not is_processor(buildings[machine_id]["kind"]): + return + var cell := _input_cell(buildings[machine_id]) + var watchers: Array = _input_watchers.get(cell, []) + if machine_id not in watchers: + watchers.append(machine_id) + watchers.sort() + _input_watchers[cell] = watchers + + +func _unregister_input_watcher(machine_id: int) -> void: + if not buildings.has(machine_id) or not is_processor(buildings[machine_id]["kind"]): + return + var cell := _input_cell(buildings[machine_id]) + if not _input_watchers.has(cell): + return + var watchers: Array = _input_watchers[cell] + watchers.erase(machine_id) + if watchers.is_empty(): + _input_watchers.erase(cell) + else: + _input_watchers[cell] = watchers + + +func _notify_item_arrived(cell: Vector2i) -> void: + if not _input_watchers.has(cell): + return + for id_variant in _input_watchers[cell]: + _wake(int(id_variant)) + + +func _notify_input_changed(cell: Vector2i) -> void: + if not _input_watchers.has(cell): + return + for id_variant in _input_watchers[cell]: + _wake(int(id_variant)) + + +func _rebuild_mana_networks() -> void: + # Pipe topology changes only during construction, so connected components and + # deterministic capacity allocation never need a per-tick graph traversal. + mana_networks.clear() + var infrastructure_cells: Dictionary = {} + for id_variant in get_building_ids(): + var id := int(id_variant) + var building: Dictionary = buildings[id] + if building["kind"] == KIND_MANA_PIPE or building["kind"] == KIND_MANA_SOURCE: + infrastructure_cells[building["cell"]] = id + building["mana_network"] = -1 + + var visited: Dictionary = {} + var infrastructure_ids := infrastructure_cells.values() + infrastructure_ids.sort() + for start_id_variant in infrastructure_ids: + var start_id := int(start_id_variant) + if visited.has(start_id): + continue + var queue: Array[int] = [start_id] + visited[start_id] = true + var component_ids: Array[int] = [] + var capacity := 0 + while not queue.is_empty(): + var current_id: int = queue.pop_front() + component_ids.append(current_id) + var current: Dictionary = buildings[current_id] + if current["kind"] == KIND_MANA_SOURCE: + capacity += int(current["capacity"]) + var current_cell: Vector2i = current["cell"] + for direction in DIRECTIONS: + var neighbor_cell := current_cell + direction + if not infrastructure_cells.has(neighbor_cell): + continue + var neighbor_id := int(infrastructure_cells[neighbor_cell]) + if visited.has(neighbor_id): + continue + visited[neighbor_id] = true + queue.append(neighbor_id) + + component_ids.sort() + var network_id := mana_networks.size() + var adjacent_machines: Dictionary = {} + for infrastructure_id in component_ids: + var infrastructure: Dictionary = buildings[infrastructure_id] + infrastructure["mana_network"] = network_id + var cell: Vector2i = infrastructure["cell"] + for direction in DIRECTIONS: + var neighbor := cell + direction + if not grid.has(neighbor): + continue + var neighbor_id := int(grid[neighbor]) + if is_processor(buildings[neighbor_id]["kind"]): + adjacent_machines[neighbor_id] = true + + var machine_ids := adjacent_machines.keys() + machine_ids.sort() + mana_networks.append({ + "id": network_id, + "capacity": capacity, + "used": 0, + "infrastructure": component_ids, + "machines": machine_ids, + }) + + # Clear old allocations first, including machines no longer adjacent to any + # valid mana component. + for id_variant in get_building_ids(): + var id := int(id_variant) + if is_processor(buildings[id]["kind"]): + _set_machine_mana(id, false, -1) + + for network: Dictionary in mana_networks: + var remaining := int(network["capacity"]) + for machine_id_variant in network["machines"]: + var machine_id := int(machine_id_variant) + var powered := remaining >= MACHINE_MANA_DEMAND + if powered: + remaining -= MACHINE_MANA_DEMAND + network["used"] = int(network["used"]) + MACHINE_MANA_DEMAND + _set_machine_mana(machine_id, powered, int(network["id"])) + + +func _set_machine_mana(machine_id: int, powered: bool, network_id: int) -> void: + if not buildings.has(machine_id): + return + var machine: Dictionary = buildings[machine_id] + var was_powered := bool(machine.get("mana_powered", false)) + if was_powered and not powered and int(machine.get("completion_tick", -1)) >= 0: + machine["remaining_ticks"] = maxi( + 1, + int(machine["completion_tick"]) - tick_index + ) + machine["completion_tick"] = -1 + machine["mana_powered"] = powered + machine["mana_network"] = network_id + if was_powered != powered: + _wake(machine_id) + + +func _output_cell(building: Dictionary) -> Vector2i: + if is_processor(building["kind"]): + return Vector2i(building["output_cell"]) + return Vector2i(building["cell"]) + direction_for(int(building["rotation"])) + + +func _input_cell(machine: Dictionary) -> Vector2i: + return Vector2i(machine["input_cell"]) + + +func _bridge_distance(a: Vector2i, b: Vector2i) -> int: + return maxi(abs(a.x - b.x), abs(a.y - b.y)) + + +func _is_belt(cell: Vector2i) -> bool: + if not grid.has(cell): + return false + return buildings[int(grid[cell])]["kind"] == KIND_BELT + + +func _belt_direction(cell: Vector2i) -> Vector2i: + if not _is_belt(cell): + return Vector2i.ZERO + return direction_for(int(buildings[int(grid[cell])]["rotation"])) + + +static func direction_for(rotation: int) -> Vector2i: + return DIRECTIONS[posmod(rotation, DIRECTIONS.size())] + + +static func is_processor(kind: StringName) -> bool: + return kind == KIND_MACHINE or kind == KIND_CHARGER + + +func _processor_fields( + cell: Vector2i, + rotation: int, + recipe_id: StringName, + input_kind: StringName, + output_kind: StringName + ) -> Dictionary: + var facing := direction_for(rotation) + return { + "recipe": recipe_id, + "input_kind": input_kind, + "output_kind": output_kind, + "input_count": 0, + "output_buffer": 0, + "completion_tick": -1, + "remaining_ticks": 0, + "completed": 0, + "mana_powered": false, + "mana_network": -1, + "input_cell": cell - facing, + "output_cell": cell + facing, + "bridge_configured": false, + } + + +func _status_reason(status: StringName) -> String: + match status: + &"working": + return "" + &"outputting": + return "正在向放货传送带输出。" + &"waiting_input": + return "等待取货传送带上的原料。" + &"missing_input": + return "取货格没有可用传送带。" + &"blocked_output": + return "放货传送带已满或缺失。" + &"no_mana": + return "未接通有容量的魔力管网。" + &"online": + return "" + &"idle": + return "尚未开始工作。" + return "状态:%s" % String(status) + + +func _record_charged_intake() -> void: + _charged_intake_ticks.append(tick_index) + var cutoff := tick_index - COMPLETION_WINDOW_TICKS + while not _charged_intake_ticks.is_empty() and int(_charged_intake_ticks[0]) < cutoff: + _charged_intake_ticks.pop_front() + + +func _push_event(event: Dictionary) -> void: + _event_heap.append(event) + var index := _event_heap.size() - 1 + while index > 0: + var parent := (index - 1) / 2 + if not _event_less(_event_heap[index], _event_heap[parent]): + break + var temporary: Dictionary = _event_heap[parent] + _event_heap[parent] = _event_heap[index] + _event_heap[index] = temporary + index = parent + + +func _heap_pop() -> Dictionary: + var result: Dictionary = _event_heap[0] + var last: Dictionary = _event_heap.pop_back() + if _event_heap.is_empty(): + return result + _event_heap[0] = last + var index := 0 + while true: + var left := index * 2 + 1 + var right := left + 1 + var smallest := index + if left < _event_heap.size() and _event_less(_event_heap[left], _event_heap[smallest]): + smallest = left + if right < _event_heap.size() and _event_less(_event_heap[right], _event_heap[smallest]): + smallest = right + if smallest == index: + break + var temporary: Dictionary = _event_heap[index] + _event_heap[index] = _event_heap[smallest] + _event_heap[smallest] = temporary + index = smallest + return result + + +func _event_less(a: Dictionary, b: Dictionary) -> bool: + if int(a["tick"]) != int(b["tick"]): + return int(a["tick"]) < int(b["tick"]) + if int(a["id"]) != int(b["id"]): + return int(a["id"]) < int(b["id"]) + return String(a["type"]) < String(b["type"]) diff --git a/src/simulation/world_simulation.gd.uid b/src/simulation/world_simulation.gd.uid new file mode 100644 index 0000000..35e0a91 --- /dev/null +++ b/src/simulation/world_simulation.gd.uid @@ -0,0 +1 @@ +uid://cdkpnd733elfs diff --git a/tasks/plan.md b/tasks/plan.md new file mode 100644 index 0000000..8613b14 --- /dev/null +++ b/tasks/plan.md @@ -0,0 +1,122 @@ +# Implementation Plan: Magic Factory Demo + +## Overview + +Build a small but presentable 2.5D factory game demo in Godot. The player will place belts, machines, mana pipes, and a configurable bridge arm to complete a two-stage magical production chain. The demo uses a coherent CC0 asset pack from the beginning, while all gameplay state remains independent from scene nodes so large-factory performance work is not blocked by the presentation layer. + +## Demo promise + +The first public-facing slice starts on a small floating factory site and ends when the player continuously produces charged crystals. It must feel like a game rather than an engineering benchmark: it has a title screen, readable construction controls, visible production, machine status feedback, a short objective sequence, sound-ready hooks, and a clear completion state. + +## Architecture decisions + +- Godot 4.7.1 stable, standard Windows build, with GDScript for the first playable slice. +- 3D world with an orthographic camera and fixed grid: 2.5D presentation without 2D simulation assumptions leaking into rendering. +- Simulation advances on a fixed integer tick and is stored in plain data keyed by integer IDs. Scene nodes mirror state; they are not authoritative gameplay objects. +- Machines do not poll every rendered frame. They wake for exact state-changing events such as input arrival, output space, recipe completion, and mana-network changes. +- The first logistics route is belt-to-machine. Bridge arms belong to machines and select explicit belt endpoints; there is no independent inserter entity layer. +- Kenney Factory Kit 3.0 is the initial visual base. Its source archive, CC0 license, URL, version, and acquisition date stay in the repository. +- Performance tooling is a developer-only mode inside the demo, not the user-facing premise. + +## Dependency graph + +```text +Godot project + licensed asset pack + | + v +2.5D world + camera + grid + | + v +fixed-tick world data + commands + | + +------+------+ + | | + v v +belt transport build controls + | | + +------+------+ + v +machine production + | + +------+------+ + | | + v v +mana network bridge arm + | | + +------+------+ + v +objective flow + polish + | + v +stress scene + release check +``` + +## Task list + +### Phase 1: Playable foundation + +- [x] Task 1: Register tools and third-party assets +- [x] Task 2: Create a launchable 2.5D world +- [x] Task 3: Add grid construction controls +- [x] Task 4: Run one belt-to-machine production chain + +### Checkpoint: First playable loop + +- [x] Project opens without import errors in Godot 4.7.1 +- [x] Player can place a belt and machine with mouse controls +- [x] A visible item travels into a machine and becomes a visible output item +- [x] Simulation outcome is independent from render frame rate + +### Phase 2: Distinctive game systems + +- [x] Task 5: Add mana supply and pipe connectivity +- [x] Task 6: Add configurable bridge arms +- [x] Task 7: Add status inspection and objective guidance +- [x] Task 8: Add a second recipe and demo completion state + +### Checkpoint: Demo identity + +- [x] Player can diagnose every stopped machine from the UI +- [x] Bridge arms can cross several belt lanes without becoming standalone ticking entities +- [x] Mana shortage visibly stops and later resumes production +- [x] The first complete production chain can be built from a fresh game + +### Phase 3: Presentation and scale guardrails + +- [ ] Task 9: Add menu, save snapshot, audio hooks, and visual polish +- [ ] Task 10: Add deterministic stress generation and metrics +- [ ] Task 11: Package a Windows demo build + +### Checkpoint: Demo ready + +- [x] Fresh player can reach continuous charged-crystal production +- [ ] CC0 assets have traceable license records +- [ ] Fixed-seed automated runs produce identical state hashes +- [ ] Stress mode reports simulation and rendering costs separately +- [ ] Windows build launches on a clean path outside the editor + +## Explicitly deferred + +- Combat, enemies, character control, story campaign, research tree, procedural world generation, multiplayer, mod loading, pressure-based fluid simulation, final commissioned art, and a native C++ simulation extension. +- C++ is reconsidered only after the representative stress workload identifies a measured hot path that the data layout and scheduler cannot solve in GDScript. + +## Risks and mitigations + +| Risk | Impact | Mitigation | +|---|---:|---| +| Free assets make the game look generically industrial | High | Use one coherent pack, recolor materials, and add a small original mana/rune visual layer before adding more packs. | +| Scene-node architecture grows with factory size | High | Keep authoritative simulation in arrays/dictionaries and render only visible state. | +| Bridge-arm setup is tedious | High | Validate source/destination selection in the first production chain and add strong previews and error feedback. | +| Mana pipe rules become a second fluid simulator | Medium | Demo supports capacity and connectivity, but no pressure, temperature, or free-form fluid physics. | +| Early polish hides an unscalable core | High | Ship a stress generator and deterministic counters before expanding the recipe catalog. | + +## Open decisions with safe defaults + +- Reference hardware: use the current development PC until a minimum target specification is chosen. +- Art direction: Kenney industrial forms with dark stone, brass, cyan mana, and violet high-tier energy. +- Input: mouse and keyboard first; controller support deferred. +- Distribution: Windows desktop first. + +## Post-demo progression + +The research tree remains outside the Tasks 1–11 demo scope, but its current full-game design is specified in `docs/tech-tree-v0.2.md`. Data and implementation work is dependency-ordered in `tasks/tech-tree-plan-v0.2.md` and `tasks/tech-tree-todo-v0.2.md`; it starts only after the demo-ready checkpoint unless the project scope is explicitly changed. diff --git a/tasks/recipe-editor-plan.md b/tasks/recipe-editor-plan.md new file mode 100644 index 0000000..e60c1ff --- /dev/null +++ b/tasks/recipe-editor-plan.md @@ -0,0 +1,64 @@ +# Implementation Plan: Planner Recipe Workbench + +## Overview + +Build a local, planner-facing recipe workbench whose JSON book becomes the shared authority for item, machine, and recipe balance. It must make the dependency tree understandable, allow safe edits without touching code, report broken references and loops immediately, and save recoverable revisions back into the project. + +## Architecture decisions + +- `data/recipe-book.json` is the editable authority; the browser interface does not hide a second copy. +- The editor is dependency-free HTML/CSS/JavaScript so the planner can launch it with one Windows shortcut. +- A localhost-only helper saves to the fixed data path and creates a timestamped backup before replacement. +- Import/export remains available when the helper is not running. +- The graph is generated from item-to-recipe and recipe-to-item references; positions are presentation state, not balance data. +- All mutations pass through one command history so undo/redo, validation, autosave draft, and dirty-state reporting stay consistent. + +## Task list + +### Phase 1: Authority data + +- [x] Define the recipe-book schema +- [x] Seed a complete first-warp recipe path and representative postgame exchanges +- [x] Add structural and balance validation rules + +### Checkpoint: Data + +- [x] Every recipe input/output references an existing item +- [x] Every recipe machine, biome, stage, and unlock technology is known +- [x] First-warp production has a traceable upstream route + +### Phase 2: Planner interface + +- [x] Add searchable item/recipe/machine navigation +- [x] Add focus and full-tree graph views with pan, zoom, and selection +- [x] Add editable inspector forms and repeatable input/output rows +- [x] Add route summaries and issue navigation + +### Checkpoint: Editing + +- [x] Changing an amount updates the tree and balance summary immediately +- [x] Adding or deleting a reference cannot fail silently +- [x] Undo/redo restores complete book states + +### Phase 3: Persistence and handoff + +- [x] Add one-click Windows launcher and local save endpoint +- [x] Create backups on every direct save +- [x] Add JSON import/export and draft recovery +- [x] Document the planner workflow + +### Checkpoint: Complete + +- [x] Browser interaction and visual layout verified at desktop and narrow widths +- [x] Direct save followed by reload returns identical data +- [x] Automated tests cover schema, references, cycles, and critical first-warp ingredients + +## Risks and mitigations + +| Risk | Impact | Mitigation | +|---|---:|---| +| Large global graph becomes unreadable | High | Default to selected-node neighborhood; keep full tree as an explicit mode | +| Planner accidentally breaks runtime IDs | High | Warn before ID rename, update references automatically, and validate before save | +| Browser storage is mistaken for a real save | High | Persistent dirty indicator; direct save or exported file is the only committed state | +| Random recipes cannot fit ordinary amount fields | High | Outputs support amount, min/max, chance, and weight in one schema | +| Tool data diverges from the game | High | Runtime integration must consume the same JSON or generated resources from it | diff --git a/tasks/recipe-editor-todo.md b/tasks/recipe-editor-todo.md new file mode 100644 index 0000000..c23f6c5 --- /dev/null +++ b/tasks/recipe-editor-todo.md @@ -0,0 +1,11 @@ +# Planner Recipe Workbench Tasks + +- [x] RE1: Define `recipe-book.json` and its schema. +- [x] RE2: Seed mainline magical-law recipes through first warp. +- [x] RE3: Implement searchable catalogs and graph navigation. +- [x] RE4: Implement item, recipe, and machine inspectors. +- [x] RE5: Implement validation, issue navigation, and dependency-cycle detection. +- [x] RE6: Implement undo, redo, draft recovery, import, export, and direct save. +- [x] RE7: Add a localhost-only launcher with save backups. +- [x] RE8: Verify browser layout, interactions, and save round-trip. +- [ ] RE9: Connect Godot runtime import after the simulation content model is implemented. diff --git a/tasks/tech-tree-plan-v0.2.md b/tasks/tech-tree-plan-v0.2.md new file mode 100644 index 0000000..b759096 --- /dev/null +++ b/tasks/tech-tree-plan-v0.2.md @@ -0,0 +1,104 @@ +# Implementation Plan: Magical-Law Progression v0.2 + +## Overview + +Implement the progression in `docs/tech-tree-v0.2.md` as a sequence of playable magical-law experiments. The highest-risk mechanic—the portal's bounded random matter exchange—is prototyped before large content production. Once that proves fun, each ecology zone adds one distinct simulation law and one automated proof loop, culminating in a player-built dimensional gate and post-victory entropy economy. + +## Architecture decisions + +- Existing belts, mana pipes, bridge endpoints, fixed ticks, and event wakeups remain the physical substrate. +- A biome law changes simulation through explicit data/state contracts; it cannot reach into arbitrary scene nodes. +- Probability uses deterministic seeded result bags over mass batches. Saves preserve the active bag and seed so reload cannot reroll outputs. +- Failure states are recoverable resources or paused machines on standard difficulty, never silent deletion. +- Research proofs are produced by satisfying observable state sequences, not by renaming ordinary assembly recipes. +- Boundary crossings are explicit logistics nodes. The visible map stays continuous while the transport graph remains partitioned. +- First warp is deterministic once its conditions are met. Random exchange begins immediately after victory. + +## Dependency graph + +```text +M1 portal fun prototype ------+ + | +M2 biome-law contract --------+----> M3 catalog + validator ----> M4 proof runtime/UI/save + | + v +M5 runic opening -> M6 life/death -> M7 ember -> M8 mirror -> M9 first warp + | + v + M10 postgame portal loop + | + v + M11 pacing proof +``` + +## Task list + +### Phase 1: Prove the risky fun + +- [ ] M1: Prototype bounded random exchange, sorting, entropy, and recovery +- [ ] M2: Define biome-law and boundary-crossing contracts +- [ ] M3: Load and validate the 80-node v0.2 catalog +- [ ] M4: Implement experiment-driven research proofs, UI, and saving + +### Checkpoint: Core hypothesis + +- [ ] A ten-minute portal toy creates at least two meaningful strategies: stable targeting and high-entropy throughput +- [ ] Reloading cannot reroll a result bag +- [ ] Each planned ecology law has an isolated state model and a recoverable failure path +- [ ] Mainline graph is acyclic and contains all five magical verbs + +### Phase 2: Playable ecology progression + +- [ ] M5: Deliver the old-kingdom runic opening +- [ ] M6: Deliver forest and undead zones in either order +- [ ] M7: Deliver the life/death merge and ember-state loop +- [ ] M8: Deliver mirror folding, visible probability, and identity anchoring + +### Checkpoint: Magic identity + +- [ ] A stripped-art test can distinguish all four external zones by rules alone +- [ ] A starting-zone blueprint cannot run unchanged in another zone +- [ ] Every proof line can be automated and exposes a precise stop reason +- [ ] Life and death routes remain order-independent and converge without duplicate blockers + +### Phase 3: Victory and continuation + +- [ ] M9: Deliver the twelve-segment gate, synchronized ritual, and first-warp achievements +- [ ] M10: Turn the opened gate into the postgame matter-exchange and paradox-research loop + +### Checkpoint: Complete loop + +- [ ] Completing G09 alone does not win; the walker construct must actually cross the aperture +- [ ] First warp has no random failure +- [ ] Continuing after victory immediately exposes useful portal production +- [ ] Portal exchange reduces one resource pressure while measurably increasing sorting, buffering, entropy, or mana work + +### Phase 4: Timing proof + +- [ ] M11: Instrument and tune the expert and normal routes + +### Checkpoint: Release candidate + +- [ ] Expert-route P50 ≤ 7:15 and P90 ≤ 8:00 +- [ ] Experienced first-play P50 is 18–21 hours and P75 ≤ 24:00 +- [ ] The expert route still demonstrates growth, decay, three-state conversion, echo separation, and four-anchor synchronization + +## Risks and mitigations + +| Risk | Impact | Mitigation | +|---|---:|---| +| Random exchange feels punitive or unplannable | Critical | Prototype first; use bounded bags, visible ranges, bias controls, and recyclable outcomes | +| Ecology laws become four unrelated minigames | High | Keep common item tags, mana frequencies, proof records, and boundary-node interfaces | +| Magical layouts become tedious pattern copying | High | Ship fixed 3×3/5×5 templates with snapping and previews | +| Portal becomes strictly better than gathering | High | Cap early usable mass at 90% and exact targeting at 65%; charge entropy and catalysts | +| Eight-hour play skips the interesting systems | Critical | Validate the mandatory closure and time the five explicit mechanic demonstrations | +| Region effects cause per-cell/per-frame cost | High | Recompute zone membership on construction and wake entities only when law state changes | + +## Explicitly deferred + +- Full combat and tower-defense balance +- Procedurally generated infinite biome types +- Multiple full-sized playable dimensions +- Freehand rune drawing +- Irreversible corruption or permanent random destruction on standard difficulty + diff --git a/tasks/tech-tree-plan.md b/tasks/tech-tree-plan.md new file mode 100644 index 0000000..ceb29c3 --- /dev/null +++ b/tasks/tech-tree-plan.md @@ -0,0 +1,114 @@ +# Implementation Plan: Full Technology Progression (superseded) + +> Superseded by `tasks/tech-tree-plan-v0.2.md`. Retained only as a record of the rejected factory-reskin direction. + +## Overview + +Turn the design in `docs/tech-tree-v0.1.md` into a data-driven research and progression system after the current demo loop is stable. The implementation proceeds in playable vertical slices: first load and validate the catalog, then make each era playable from mining through research unlock, and finally add the heart-furnace victory loop and pacing telemetry. This is post-demo scope and does not change the completion bar for Tasks 1–11 in `tasks/plan.md`. + +## Architecture decisions + +- The CSV is a design interchange file, not runtime authority. Runtime content should use a typed Godot `Resource` or equivalent structured data generated from the same identifiers. +- Technologies, recipes, buildings, UI labels, save data, and achievements reference stable IDs; display names remain localizable data. +- Research is fixed-tick and event-driven like the current machine simulation. A lab wakes on input, queue, completion, or unlock changes rather than polling independently each frame. +- Unlock evaluation lives in the simulation layer. UI only displays state and submits commands. +- Every era is delivered as a complete loop: resource access → processing → research material → gate technology → visible objective. +- The 8/24-hour targets are verified by route simulation and instrumented playtests, not inferred from green unit tests. + +## Dependency graph + +```text +TT1 catalog contract + | + +----> TT2 graph/cost validator + | + v +TT3 research runtime ----> TT4 UI + save + | + v +TT5 T0/T1 slice -> TT6 T2 slice -> TT7 T3 slice -> TT8 T4 slice -> TT9 T5 + victory + | | + +------>-------+ + v + TT10 optional/postgame + | + v + TT11 telemetry/tuning +``` + +## Task list + +### Phase 1: Data and rules + +- [ ] TT1: Define stable technology, recipe, building, and unlock IDs +- [ ] TT2: Add dependency validation and route-cost simulation +- [ ] TT3: Implement fixed-tick research runtime +- [ ] TT4: Add research UI, queue commands, and save state + +### Checkpoint: Research foundation + +- [ ] The full catalog loads with no duplicate, missing, cyclic, or role-invalid dependency +- [ ] A headless test researches a node by consuming exact item counts +- [ ] Save/load preserves completed and partial research exactly + +### Phase 2: Early playable progression + +- [ ] TT5: Deliver T0/T1 from repair milestones to automated cyan tablets +- [ ] TT6: Deliver T2 mana-logistics and ether-fluid introduction + +### Checkpoint: Early game + +- [ ] A fresh run reaches crimson-tablet production without debug spawning +- [ ] Existing belt, mana-pipe, and bridge-arm behavior remains deterministic +- [ ] Every stopped lab or production machine exposes a readable reason + +### Phase 3: Midgame scale + +- [ ] TT7: Deliver T3 alchemy, precision construction, and leyline survey +- [ ] TT8: Deliver T4 cross-island shipping, phase metallurgy, and emerald tablets + +### Checkpoint: Midgame + +- [ ] At least one required resource must arrive from another island +- [ ] Violet and emerald recipes exercise the intended multi-stage chains +- [ ] A reference factory meets the normal and expert tablet-rate targets + +### Phase 4: Endgame and continuation + +- [ ] TT9: Deliver T5 source extraction, heart furnace, timed ignition, and achievements +- [ ] TT10: Add comfort, warding, and repeatable postgame branches + +### Checkpoint: Complete progression + +- [ ] Mainline can finish without researching any O-role node +- [ ] Completing G13 alone cannot trigger victory +- [ ] First stable ignition records one authoritative completion time and unlocks postgame research + +### Phase 5: Pacing proof + +- [ ] TT11: Add route telemetry, benchmark saves, and 8/24-hour balance gates + +### Checkpoint: Release candidate + +- [ ] Expert-route P50 is at most 7:15 and P90 at most 8:00 +- [ ] Experienced first-play P50 is 18–21 hours and P75 at most 24:00 +- [ ] No mainline wait exceeds five minutes when the era reference factory meets target throughput + +## Risks and mitigations + +| Risk | Impact | Mitigation | +|---|---:|---| +| Sixty-two technologies create content before the core is fun | High | Implement by era and stop at every checkpoint for a complete playable test | +| Research logic duplicates recipe/building unlock rules | High | One ID-based unlock service is authoritative for simulation, UI, and saving | +| Random map distance determines achievement validity | High | Clamp required-resource distance and ship fixed benchmark seeds | +| Optional automation becomes secretly mandatory for 24 hours | High | Maintain a no-comfort-tech reference route and compare it with the recommended route | +| Speedrun balance removes normal-player breathing room | High | Tune guidance and convenience separately from mainline material cost | +| High-tier factories overload scene nodes | High | Preserve data-oriented simulation, sleeping machines, and batched visible rendering | + +## Open decisions with safe defaults + +- Hostile enemies: default to environmental hazards and optional warding until combat receives its own approved design. +- Campaign map: use a bounded handcrafted resource topology for balance tests; procedural variants must satisfy the same distance envelope. +- Localization names: treat names in v0.1 as Chinese working names while IDs remain stable. +- Achievement clock: count simulation time only, excluding pause/load/non-interactive cutscenes. +- Existing demo: keep its all-tools-available showcase mode even after campaign unlock rules exist. diff --git a/tasks/tech-tree-todo-v0.2.md b/tasks/tech-tree-todo-v0.2.md new file mode 100644 index 0000000..d6dda81 --- /dev/null +++ b/tasks/tech-tree-todo-v0.2.md @@ -0,0 +1,298 @@ +# Magical-Law Progression Tasks v0.2 + +## M1: Prototype portal matter exchange + +**Description:** Build a headless and minimal visual toy where 100 mass units form a seeded result bag, outputs arrive in shuffled order, anchors bias the distribution, and throughput raises entropy. + +**Acceptance criteria:** + +- [ ] The UI shows expected output ranges before a batch starts. +- [ ] Stable, anchored, and high-entropy modes create different useful tradeoffs. +- [ ] Every residue/anomaly has a recovery route; no required item relies on a sub-5% roll. + +**Verification:** + +- [ ] Same seed/input/calibration produces the same bag and state hash. +- [ ] Save/load mid-bag preserves remaining outputs and cannot reroll. +- [ ] One million simulated batches stay inside configured mass and probability bounds. + +**Dependencies:** None + +**Files likely touched:** + +- `src/simulation/result_bag.gd` +- `src/simulation/portal_exchange.gd` +- `tests/portal_exchange_smoke.gd` +- `scenes/labs/portal_exchange_lab.tscn` + +**Estimated scope:** Medium + +## M2: Define biome laws and boundaries + +**Description:** Add data contracts for zone membership, boundary nodes, law state, failure/recovery, and law-specific machine modifiers without coupling them to rendered terrain. + +**Acceptance criteria:** + +- [ ] Forest balance, undead decay, ember temperature, mirror entropy, and rift instability use the same lifecycle interface. +- [ ] Boundary crossings are explicit graph edges that can be opened and closed deterministically. +- [ ] Existing entities outside a special zone retain current behavior. + +**Verification:** + +- [ ] Unit fixtures enter/leave each law and report exact state changes. +- [ ] Closing a crossing never deletes in-flight inventory. +- [ ] Sleeping entities do not wake every tick only because they occupy a special zone. + +**Dependencies:** None + +**Files likely touched:** + +- `src/simulation/biome_law.gd` +- `src/simulation/biome_registry.gd` +- `src/simulation/boundary_network.gd` +- `tests/biome_law_smoke.gd` + +**Estimated scope:** Medium + +## M3: Encode and validate the v0.2 progression + +**Description:** Turn `docs/tech-tree-nodes-v0.2.csv` into typed runtime data and validate prerequisites, roles, proof types, boundary unlocks, experiment requirements, and recovery paths. + +**Acceptance criteria:** + +- [ ] All 80 records load under stable IDs. +- [ ] M nodes never depend on C/POST/INFINITE nodes. +- [ ] Mainline totals equal K 10,780; L 9,580; D 9,580; E 8,150; S 6,200. + +**Verification:** + +- [ ] Invalid fixtures cover duplicate IDs, missing prerequisites, cycles, invalid proof types, and missing recovery. +- [ ] The computed G09 closure contains inscription, life, death, element, dimension, and portal tags. +- [ ] Existing simulation smoke tests remain green. + +**Dependencies:** M2 + +**Files likely touched:** + +- `src/data/technology_definition.gd` +- `src/data/technology_catalog.gd` +- `src/data/technology_catalog.tres` +- `tests/technology_catalog_smoke.gd` + +**Estimated scope:** Medium + +## M4: Implement experiment-driven research + +**Description:** Consume physical proof items only after their experiment state sequence has completed, then support queues, parallel archives, progress inspection, and exact save/load. + +**Acceptance criteria:** + +- [ ] Each proof records which law experiment validated it. +- [ ] Archives consume exact proof sets and never duplicate the final unit under parallel completion. +- [ ] UI explains whether the bottleneck is proof validity, input, archive capacity, or prerequisite state. + +**Verification:** + +- [ ] Disconnect/reconnect preserves partial experiment and research progress. +- [ ] Save/load fingerprints match uninterrupted execution. +- [ ] Invalid hand-spawned blanks cannot satisfy a proof requirement. + +**Dependencies:** M3 + +**Files likely touched:** + +- `src/simulation/research_system.gd` +- `src/simulation/proof_experiment.gd` +- `src/ui/research_screen.gd` +- `tests/research_proof_smoke.gd` + +**Estimated scope:** Medium + +## M5: Deliver the runic opening + +**Description:** Map the current prototype into B00–K11, then add ordered inscription, mana-frequency splitting, rune adjacency, clay constructs, and boundary surveying. + +**Acceptance criteria:** + +- [ ] A fresh run produces K automatically and discovers both external-zone crossings. +- [ ] A wrong inscription order returns a reusable blank with a readable diagnosis. +- [ ] Rune templates change at least one recipe and one efficiency property. + +**Verification:** + +- [ ] Automated flow reaches K11 without debug items. +- [ ] Existing belt/mana/bridge deterministic tests pass. +- [ ] A stripped-art test distinguishes ordinary routing from ordered inscription. + +**Dependencies:** M4 + +**Files likely touched:** + +- `src/data/era_runic_content.tres` +- `src/simulation/rune_array.gd` +- `src/simulation/objective_system.gd` +- `tests/era_runic_flow_smoke.gd` + +**Estimated scope:** Medium + +## M6: Deliver forest and undead zones + +**Description:** Implement regenerative growth/ecology balance and timed decay/memory recovery as two order-independent vertical slices with their own crossings and proof lines. + +**Acceptance criteria:** + +- [ ] Either zone can be completed first from the same K11 save. +- [ ] Overharvest produces recoverable blight; mist decay produces recoverable bone dust. +- [ ] L and D proofs are continuously automatable through their actual law loops. + +**Verification:** + +- [ ] Life-first and death-first runs both reach L08+D08 with matching mainline totals. +- [ ] Ecology and identity conservation tests pass under backpressure. +- [ ] Starting-zone blueprints visibly fail until adapted to each local law. + +**Dependencies:** M5 + +**Files likely touched:** + +- `src/data/era_life_death_content.tres` +- `src/simulation/growth_cycle.gd` +- `src/simulation/decay_identity.gd` +- `tests/era_life_death_flow_smoke.gd` + +**Estimated scope:** Medium + +## M7: Deliver ember-state production + +**Description:** Merge the two anchor laws, open a protected ember crossing, and automate temperature/state cycling through E08. + +**Acceptance criteria:** + +- [ ] Heat can accelerate production but unsafe heat only pauses and yields recoverable slag. +- [ ] One medium completes cold, molten, and charged states to produce E. +- [ ] Dragon glass requires the state loop rather than a conventional one-step furnace recipe. + +**Verification:** + +- [ ] Automated mandatory flow reaches E08 without optional fire spirits. +- [ ] Energy and material conservation hold across state transitions. +- [ ] Cooling loss and reheating wake only affected networks. + +**Dependencies:** M6 + +**Files likely touched:** + +- `src/data/era_ember_content.tres` +- `src/simulation/thermal_network.gd` +- `src/simulation/item_state.gd` +- `tests/era_ember_flow_smoke.gd` + +**Estimated scope:** Medium + +## M8: Deliver mirror folding and identity + +**Description:** Add paired spatial endpoints, echo sampling, bounded probabilistic duplication, shadow-matter separation, and identity anchoring through S08. + +**Acceptance criteria:** + +- [ ] Unnamed paths loop or misroute predictably; named endpoint pairs are deterministic. +- [ ] Probability UI shows batch ranges before S05-dependent processes start. +- [ ] Real and echo items can be sorted and both have useful recovery recipes. + +**Verification:** + +- [ ] Automated flow reaches S08 without optional mirror multiplication. +- [ ] Seeded result bags reproduce exactly across frame rates and reloads. +- [ ] No mainline item depends on a rare random output. + +**Dependencies:** M1, M7 + +**Files likely touched:** + +- `src/data/era_mirror_content.tres` +- `src/simulation/fold_network.gd` +- `src/simulation/item_identity.gd` +- `tests/era_mirror_flow_smoke.gd` + +**Estimated scope:** Medium + +## M9: Deliver the first-warp victory + +**Description:** Build the rift site, twelve ring stones, four anchors, beat-synchronized material batches, four-frequency power window, entropy safety, walker construct, and both time achievements. + +**Acceptance criteria:** + +- [ ] Researching G09 cannot win the game by itself. +- [ ] First warp succeeds deterministically once all displayed ritual conditions hold. +- [ ] The achievement timestamp is the simulation frame on which the walker crosses. + +**Verification:** + +- [ ] Boundary tests cover 07:59:59/08:00:00 and 23:59:59/24:00:00. +- [ ] Save/load during ring construction, batch ritual, power window, and crossing preserves exact state. +- [ ] A full mainline test contains all five law demonstrations and no C dependency. + +**Dependencies:** M8 + +**Files likely touched:** + +- `src/data/era_portal_content.tres` +- `src/simulation/grand_ritual.gd` +- `src/simulation/achievement_clock.gd` +- `tests/first_warp_flow_smoke.gd` + +**Estimated scope:** Medium + +## M10: Deliver the postgame portal economy + +**Description:** Connect the proven exchange toy to the opened campaign gate, add paradox proofs, ecological tuning, destinations, causal locks, relics, exact targeting, multiple gates, and repeatable research. + +**Acceptance criteria:** + +- [ ] Basic random exchange is usable immediately after victory. +- [ ] The player can trade gathering pressure for sorting/entropy work but cannot outperform local basic-resource loops in every dimension. +- [ ] Entropy bands create recoverable opportunities rather than arbitrary destruction. + +**Verification:** + +- [ ] Reference factories demonstrate unfocused, ecological, and true-name strategies. +- [ ] Every X/I node calculates deterministic cost and survives save migration. +- [ ] A portal-only economy cannot remain self-sustaining without external mana/catalyst input. + +**Dependencies:** M9 + +**Files likely touched:** + +- `src/data/postgame_portal_content.tres` +- `src/simulation/portal_exchange.gd` +- `src/simulation/paradox_research.gd` +- `tests/postgame_portal_smoke.gd` + +**Estimated scope:** Medium + +## M11: Prove 8/24-hour pacing and magical identity + +**Description:** Record progression and law-specific failure metrics, run structured expert and first-play tests, and tune without removing the mandatory magical demonstrations. + +**Acceptance criteria:** + +- [ ] Telemetry records first proof, zone entry, anchor, gate stage, failure/recovery, and warp timestamps. +- [ ] Target percentiles meet 8/24 hours on standard topology seeds. +- [ ] At least 80% of testers can explain why one machine stopped in each ecology zone. + +**Verification:** + +- [ ] Report includes at least three rehearsed expert runs and eight experienced first-play runs. +- [ ] Cost simulator matches actual consumed proofs and final inventories. +- [ ] Stripped-art test distinguishes every ecology zone by rules alone. + +**Dependencies:** M9, M10 + +**Files likely touched:** + +- `src/telemetry/progression_metrics.gd` +- `tools/progression_report.gd` +- `tests/progression_benchmark_smoke.gd` +- `artifacts/progression-benchmark-v0.2.md` + +**Estimated scope:** Medium diff --git a/tasks/tech-tree-todo.md b/tasks/tech-tree-todo.md new file mode 100644 index 0000000..d85717b --- /dev/null +++ b/tasks/tech-tree-todo.md @@ -0,0 +1,300 @@ +# Full Technology Progression Tasks (superseded) + +> Superseded by `tasks/tech-tree-todo-v0.2.md`. Retained only as a record of the rejected factory-reskin direction. + +## TT1: Define the progression data contract + +**Description:** Create stable IDs and typed records for technologies, research costs, prerequisites, recipes, buildings, unlocks, and postgame formulas. Import the v0.1 catalog without putting unlock conditions in UI code. + +**Acceptance criteria:** + +- [ ] Every row in `docs/tech-tree-nodes-v0.1.csv` maps to one runtime record. +- [ ] Display names can change without changing save-compatible IDs. +- [ ] Mainline, comfort, optional, and postgame roles are explicit data. + +**Verification:** + +- [ ] Headless catalog-load test reports 76 records. +- [ ] Unknown pack, technology, recipe, or unlock IDs fail with an actionable message. +- [ ] Existing simulation smoke tests still pass. + +**Dependencies:** None + +**Files likely touched:** + +- `src/data/technology_definition.gd` +- `src/data/technology_catalog.gd` +- `src/data/technology_catalog.tres` +- `tests/technology_catalog_smoke.gd` + +**Estimated scope:** Medium + +## TT2: Validate the graph and simulate route costs + +**Description:** Add tooling that validates the dependency DAG and computes a selected route's tablet totals, lab-seconds, earliest unlocks, and final heart-furnace materials. + +**Acceptance criteria:** + +- [ ] Validator rejects duplicates, missing prerequisites, cycles, and any M node that transitively depends on O. +- [ ] Mainline totals equal Q 11,220; A 10,920; R 9,990; V 8,400; G 5,300. +- [ ] Simulator can compare mainline, recommended-normal, and custom routes. + +**Verification:** + +- [ ] Fixture tests cover each invalid-graph class. +- [ ] Golden output records per-era cost and theoretical lab bottlenecks. +- [ ] CI exits nonzero if catalog validation fails. + +**Dependencies:** TT1 + +**Files likely touched:** + +- `src/data/technology_graph.gd` +- `tools/progression_calculator.gd` +- `tests/technology_graph_smoke.gd` +- `tests/fixtures/technology_graphs.tres` + +**Estimated scope:** Medium + +## TT3: Implement the fixed-tick research runtime + +**Description:** Add research queues, lab input consumption, partial progress, completion events, and unlock commands while preserving the simulation's event-driven scheduling. + +**Acceptance criteria:** + +- [ ] Labs consume one exact tablet set per completed unit and never duplicate or lose items. +- [ ] Loss of an input pauses exact progress and input restoration wakes the lab. +- [ ] Completing a technology emits one idempotent unlock event. + +**Verification:** + +- [ ] Fixed-seed runs produce identical research fingerprints. +- [ ] Disconnect/reconnect tests preserve partial unit progress exactly. +- [ ] Parallel labs complete the same technology without over-consuming the final unit. + +**Dependencies:** TT1, TT2 + +**Files likely touched:** + +- `src/simulation/research_system.gd` +- `src/simulation/world_simulation.gd` +- `tests/research_simulation_smoke.gd` +- `tests/simulation_smoke.gd` + +**Estimated scope:** Medium + +## TT4: Add research UI and persistence + +**Description:** Let players inspect the graph, understand missing prerequisites and materials, manage the queue, and resume exact progress after save/load. + +**Acceptance criteria:** + +- [ ] Locked, available, queued, active, and complete states are visually distinct. +- [ ] Selecting a node shows prerequisites, exact cost, unlocks, and current bottleneck. +- [ ] Save/load preserves completion, queue order, invested tablets, timer, and achievement eligibility. + +**Verification:** + +- [ ] UI only submits research commands and never grants unlocks directly. +- [ ] Save-then-run and uninterrupted-run fingerprints match. +- [ ] Keyboard/mouse navigation works at 1280×720 and 1920×1080. + +**Dependencies:** TT3 + +**Files likely touched:** + +- `src/ui/research_screen.gd` +- `scenes/ui/research_screen.tscn` +- `src/persistence/world_snapshot.gd` +- `tests/research_save_smoke.gd` + +**Estimated scope:** Medium + +## TT5: Deliver the T0/T1 vertical slice + +**Description:** Build the campaign opening from repair milestones through automated mining, refinement, bridge arms, and continuous cyan-tablet production. + +**Acceptance criteria:** + +- [ ] A fresh player can reach C11 using only produced resources and objective guidance. +- [ ] Existing demo entities map to progression IDs without changing their deterministic behavior. +- [ ] Cyan production at 15/min is achievable with a clearly readable small factory. + +**Verification:** + +- [ ] Fresh-start headless scenario completes all six milestones and C11. +- [ ] Manual walkthrough needs no developer controls or hidden starter stock. +- [ ] Regression suite for belts, mana, and bridge endpoints passes. + +**Dependencies:** TT4 + +**Files likely touched:** + +- `src/data/era_t0_t1_content.tres` +- `src/simulation/objective_system.gd` +- `src/main.gd` +- `tests/era_t1_flow_smoke.gd` + +**Estimated scope:** Medium + +## TT6: Deliver the T2 mana-logistics slice + +**Description:** Add second-tier belts and bridge arms, mana stabilization, spirit-sand glasswork, ether-fluid handling, and the crimson-tablet gate. + +**Acceptance criteria:** + +- [ ] The first fluid recipe requires pumps and storage but has no unrecoverable deadlock. +- [ ] Disconnecting mana or fluid produces a precise stop reason and resumes safely. +- [ ] The reference build sustains 15 crimson tablets per minute. + +**Verification:** + +- [ ] Automated flow covers A01 through A12 from a T1-complete save. +- [ ] Fluid and mana conservation tests pass under backpressure. +- [ ] Bridge II range and filters match catalog data. + +**Dependencies:** TT5 + +**Files likely touched:** + +- `src/data/era_t2_content.tres` +- `src/simulation/fluid_network.gd` +- `src/simulation/world_simulation.gd` +- `tests/era_t2_flow_smoke.gd` + +**Estimated scope:** Medium + +## TT7: Deliver the T3 alchemy slice + +**Description:** Add elemental separation, alchemical synthesis, thermal mana, precision construction, leyline survey, and violet-tablet production. + +**Acceptance criteria:** + +- [ ] R13 can be reached without any C or O technology. +- [ ] Byproducts back up visibly and can be routed or voided through an explicit recipe. +- [ ] The reference build sustains 20 violet tablets per minute for normal pacing. + +**Verification:** + +- [ ] Automated flow covers the mandatory T3 route from a T2-complete save. +- [ ] Conservation and deterministic allocation tests include solid, fluid, and mana networks. +- [ ] Optional construction golems do not appear in the mandatory dependency closure. + +**Dependencies:** TT6 + +**Files likely touched:** + +- `src/data/era_t3_content.tres` +- `src/simulation/recipe_system.gd` +- `src/simulation/resource_survey.gd` +- `tests/era_t3_flow_smoke.gd` + +**Estimated scope:** Medium + +## TT8: Deliver the T4 cross-island slice + +**Description:** Add bounded floating-island expansion, bulk shipping, deep leyline mining, phase metallurgy, spirit processors, and emerald-tablet production. + +**Acceptance criteria:** + +- [ ] A mandatory late resource is obtained from another island and moved by an automated route. +- [ ] Required-resource distances stay inside the achievement-safe generation envelope. +- [ ] The reference build sustains 20 emerald tablets per minute for normal pacing. + +**Verification:** + +- [ ] Fixed benchmark seeds expose all critical resources in allowed distance bands. +- [ ] Cross-island transport preserves item counts across save/load. +- [ ] Automated flow reaches V13 without comfort or warding nodes. + +**Dependencies:** TT7 + +**Files likely touched:** + +- `src/data/era_t4_content.tres` +- `src/simulation/island_logistics.gd` +- `src/world/resource_topology.gd` +- `tests/era_t4_flow_smoke.gd` + +**Estimated scope:** Medium + +## TT9: Deliver T5 and the heart-furnace victory loop + +**Description:** Add source extraction, perpetual mana, warp logistics, heart components, furnace assembly, 300-second ignition, authoritative victory timing, and both limit achievements. + +**Acceptance criteria:** + +- [ ] G13 unlocks the ignition process but does not itself win the game. +- [ ] The furnace consumes exact structure and component totals and pauses safely on mana loss. +- [ ] Completion at 8 hours grants both achievements; completion after 8 but by 24 grants only the 24-hour achievement. + +**Verification:** + +- [ ] Accelerated deterministic test runs the entire final sequence without debug item injection. +- [ ] Boundary tests cover 07:59:59, 08:00:00, 23:59:59, and 24:00:00. +- [ ] Save/load during component assembly and ignition preserves exact progress and clock state. + +**Dependencies:** TT8 + +**Files likely touched:** + +- `src/data/era_t5_content.tres` +- `src/simulation/victory_system.gd` +- `src/simulation/achievement_clock.gd` +- `tests/victory_flow_smoke.gd` + +**Estimated scope:** Medium + +## TT10: Add optional and postgame branches + +**Description:** Implement comfort automation, modules, construction/logistics golems, warding, sky tablets, and seven repeatable technology lines without altering the mainline closure. + +**Acceptance criteria:** + +- [ ] Every C technology has a measurable convenience or payback claim. +- [ ] Standard campaign can finish with every O technology locked. +- [ ] Repeatable costs follow catalog formulas and cannot overflow save or UI values. + +**Verification:** + +- [ ] Dependency validator still reports no M-to-O path. +- [ ] Mainline route totals remain unchanged after optional content loads. +- [ ] Repeatable levels 1, 10, and 50 calculate deterministically. + +**Dependencies:** TT9 + +**Files likely touched:** + +- `src/data/optional_technology_content.tres` +- `src/data/postgame_technology_content.tres` +- `src/simulation/research_system.gd` +- `tests/postgame_research_smoke.gd` + +**Estimated scope:** Medium + +## TT11: Prove and tune 8/24-hour pacing + +**Description:** Instrument progression timestamps and bottlenecks, create reference saves/routes, run structured expert and normal playtests, then tune against percentile targets. + +**Acceptance criteria:** + +- [ ] Telemetry records every metric listed in the design without collecting personal data. +- [ ] Expert P50/P90 and normal P50/P75 meet the agreed limits on standard maps. +- [ ] Each tuning change names the observed bottleneck and preserves route identity. + +**Verification:** + +- [ ] Benchmark report compares at least three expert runs and eight first-play runs. +- [ ] Automated route simulation agrees with catalog costs and benchmark save inventories. +- [ ] Final release checklist contains no unexplained wait above five minutes. + +**Dependencies:** TT9, TT10 + +**Files likely touched:** + +- `src/telemetry/progression_metrics.gd` +- `tools/progression_report.gd` +- `tests/progression_benchmark_smoke.gd` +- `artifacts/progression-benchmark.md` + +**Estimated scope:** Medium diff --git a/tasks/todo.md b/tasks/todo.md new file mode 100644 index 0000000..2969c8e --- /dev/null +++ b/tasks/todo.md @@ -0,0 +1,193 @@ +# Magic Factory Demo Tasks + +## Task 1: Register tools and third-party assets + +**Description:** Add the portable Godot version record, import Kenney Factory Kit 3.0, and preserve provenance so every external file remains auditable and replaceable. + +**Acceptance criteria:** +- [x] Godot 4.7.1 can run from a workspace-local tool directory. +- [x] Factory Kit source archive and extracted game-ready models are separated. +- [x] Author, source URL, version, license, and acquisition date are documented. + +**Verification:** +- [x] Godot reports version 4.7.1 stable. +- [x] Asset archive contains its original CC0 license. +- [x] No unlicensed third-party file is present. + +**Dependencies:** None + +**Estimated scope:** Medium + +## Task 2: Create a launchable 2.5D world + +**Description:** Build the project shell, orthographic camera, lit ground, environment, and a minimal HUD using the imported visual language. + +**Acceptance criteria:** +- [x] Project starts directly into a readable isometric-like factory site. +- [x] Camera pans and zooms within bounded limits. +- [x] Resolution changes do not break the HUD. + +**Verification:** +- [x] Headless project import completes without script errors. +- [x] Graphical capture confirms camera composition and HUD layout. + +**Dependencies:** Task 1 + +**Estimated scope:** Medium + +## Task 3: Add grid construction controls + +**Description:** Let the player choose a building type, preview its footprint, place it on the grid, rotate it, and remove it. + +**Acceptance criteria:** +- [x] Valid and invalid placement previews are visibly different. +- [x] Occupied cells cannot overlap. +- [x] Rotation and removal update both world data and visuals. + +**Verification:** +- [x] Automated grid occupancy and removal checks pass. +- [x] Full player-flow smoke test builds the required routes through the construction API. + +**Dependencies:** Task 2 + +**Estimated scope:** Medium + +## Task 4: Run one belt-to-machine production chain + +**Description:** Implement a source, straight and corner belts, one processing machine, and a sink so an item visibly becomes another item. + +**Acceptance criteria:** +- [x] Items advance on fixed simulation ticks and render smoothly between them. +- [x] Machine consumes the correct input and emits exactly one configured output. +- [x] Backpressure stops the machine without losing or duplicating items. + +**Verification:** +- [x] Identical fixed-tick runs produce matching counts and state fingerprints. +- [x] Player-flow test remains correct after build, rejected overlap, removal, and replacement. + +**Dependencies:** Task 3 + +**Estimated scope:** Medium + +## Task 5: Add mana supply and pipe connectivity + +**Description:** Add mana sources, pipes, and capacity-limited consumers; network topology is recalculated only when construction changes it. + +**Acceptance criteria:** +- [x] Connected powered machines run and disconnected machines stop. +- [x] Shared demand above source capacity produces deterministic allocation. +- [x] Reconnecting a pipe wakes affected machines immediately. + +**Verification:** +- [x] Connectivity and deterministic allocation tests pass. +- [x] Disconnect/reconnect regression preserves unfinished recipe time exactly. + +**Dependencies:** Task 4 + +**Estimated scope:** Medium + +## Task 6: Add configurable bridge arms + +**Description:** Bind an overhead arm to a machine and let the player select explicit pickup and drop cells across multiple belt lanes. + +**Acceptance criteria:** +- [x] Endpoint preview clearly shows valid and invalid target cells. +- [x] The arm transfers through the owning machine without an independent polling loop. +- [x] Removing an endpoint leaves the machine safely waiting for a valid belt. + +**Verification:** +- [x] Transfer count remains deterministic under input and output blockage. +- [x] Full player-flow test binds explicit pickup and drop cells across a broken belt route. + +**Dependencies:** Task 4 + +**Estimated scope:** Medium + +## Task 7: Add status inspection and objective guidance + +**Description:** Add a selection panel, machine stop reasons, throughput counters, construction hints, and a short objective sequence. + +**Acceptance criteria:** +- [x] Selected machines expose recipe, progress, inventory, mana, and stop reason. +- [x] Objectives lead from first belt placement to first processed item. +- [x] UI never becomes authoritative simulation state. + +**Verification:** +- [x] Every machine state maps to a readable UI message. +- [x] Fresh-start walkthrough can be completed without debug controls. + +**Dependencies:** Tasks 5 and 6 + +**Estimated scope:** Medium + +## Task 8: Add a second recipe and demo completion state + +**Description:** Extend the chain to raw crystal, refined crystal, and charged crystal, then detect sustained final output as completion. + +**Acceptance criteria:** +- [x] Two machine stages can operate continuously with belt backpressure. +- [x] Increasing a real bottleneck increases measured final throughput. +- [x] Completion is based on sustained production, not one debug-spawned item. + +**Verification:** +- [x] End-to-end count conservation test passes. +- [x] Fresh-game manual completion path succeeds. + +**Dependencies:** Task 7 + +**Estimated scope:** Medium + +## Task 9: Add demo presentation and snapshot saving + +**Description:** Add title/pause screens, coherent materials and mana effects, audio hooks, and one-slot world snapshot persistence. + +**Acceptance criteria:** +- [ ] New game, continue, pause, restart, and quit flows work. +- [ ] Snapshot restores construction, transport, production, and objectives. +- [ ] Industrial assets read as magical machinery through a unified material pass. + +**Verification:** +- [ ] Save-then-run and run-from-save produce matching state hashes. +- [ ] Manual UI flow works at 1080p and a smaller window. + +**Dependencies:** Task 8 + +**Estimated scope:** Medium + +## Task 10: Add deterministic stress generation and metrics + +**Description:** Add a developer-only scene that generates representative active, blocked, and offscreen factories and reports separate simulation/render costs. + +**Acceptance criteria:** +- [ ] Presets create 1k visible, 10k active, and 100k blocked entity workloads. +- [ ] Metrics show tick time, frame time, active/sleeping machines, and transported items. +- [ ] Blocked-machine per-tick cost does not grow linearly with their count. + +**Verification:** +- [ ] Fixed presets produce repeatable state hashes and entity counts. +- [ ] A saved benchmark report identifies the first measured bottleneck. + +**Dependencies:** Task 8 + +**Estimated scope:** Medium + +## Task 11: Package a Windows demo build + +**Description:** Configure export settings, build the playable Windows package, and verify it outside the editor. + +**Acceptance criteria:** +- [ ] Export contains required assets and third-party notices. +- [ ] Demo starts without the editor or workspace-local source tree. +- [ ] Release README explains controls and current scope. + +**Verification:** +- [ ] Clean-path smoke test reaches the first playable objective. +- [ ] Packaged file list contains no source archives or development-only tools. + +**Dependencies:** Tasks 9 and 10 + +**Estimated scope:** Medium + +## Post-demo progression work + +The 8/24-hour full technology progression is intentionally tracked separately in `tasks/tech-tree-plan-v0.2.md` and `tasks/tech-tree-todo-v0.2.md`. It does not add hidden completion requirements to the current demo tasks. diff --git a/tests/art_catalog_smoke.gd b/tests/art_catalog_smoke.gd new file mode 100644 index 0000000..957cc2f --- /dev/null +++ b/tests/art_catalog_smoke.gd @@ -0,0 +1,114 @@ +extends SceneTree + +const RECIPE_PATH := "res://data/recipe-book.json" +const CATALOG_PATH := "res://data/art-catalog.json" +const MAIN_SCRIPT_PATH := "res://src/main.gd" + + +func _initialize() -> void: + var failures: Array[String] = [] + var recipe := _read_json(RECIPE_PATH) + var catalog := _read_json(CATALOG_PATH) + if recipe.is_empty(): + failures.append("Could not read recipe book.") + if catalog.is_empty(): + failures.append("Could not read art catalog.") + + if failures.is_empty(): + failures.append_array(_check_items(recipe, catalog)) + failures.append_array(_check_machines(recipe, catalog)) + failures.append_array(_check_files(catalog)) + failures.append_array(_check_main_uses_generated_art()) + + if failures.is_empty(): + print("ART_CATALOG_SMOKE_OK items=%d machines=%d logistics=%d materials=%d" % [ + (catalog.get("items", []) as Array).size(), + (catalog.get("machines", []) as Array).size(), + (catalog.get("logistics", []) as Array).size(), + (catalog.get("materials", []) as Array).size(), + ]) + quit(0) + else: + for failure in failures: + push_error(failure) + quit(1) + + +func _check_items(recipe: Dictionary, catalog: Dictionary) -> Array[String]: + var failures: Array[String] = [] + var by_id := _index_by_id(catalog.get("items", [])) + for item_variant in recipe.get("items", []): + var item: Dictionary = item_variant + var item_id := String(item.get("id", "")) + if not by_id.has(item_id): + failures.append("Recipe item %s has no art catalog entry." % item_id) + continue + var entry: Dictionary = by_id[item_id] + if String(entry.get("icon", "")).is_empty() or String(entry.get("render", "")).is_empty(): + failures.append("Art catalog item %s is missing icon or render." % item_id) + return failures + + +func _check_machines(recipe: Dictionary, catalog: Dictionary) -> Array[String]: + var failures: Array[String] = [] + var by_id := _index_by_id(catalog.get("machines", [])) + for machine_variant in recipe.get("machines", []): + var machine: Dictionary = machine_variant + var machine_id := String(machine.get("id", "")) + if not by_id.has(machine_id): + failures.append("Recipe machine %s has no art catalog entry." % machine_id) + continue + if String(by_id[machine_id].get("render", "")).is_empty(): + failures.append("Art catalog machine %s is missing a render." % machine_id) + return failures + + +func _check_files(catalog: Dictionary) -> Array[String]: + var failures: Array[String] = [] + var paths: Array[String] = [] + for item_variant in catalog.get("items", []): + var item: Dictionary = item_variant + paths.append(String(item.get("icon", ""))) + paths.append(String(item.get("render", ""))) + for machine_variant in catalog.get("machines", []): + paths.append(String((machine_variant as Dictionary).get("render", ""))) + for logistics_variant in catalog.get("logistics", []): + paths.append(String((logistics_variant as Dictionary).get("render", ""))) + for material_variant in catalog.get("materials", []): + paths.append(String((material_variant as Dictionary).get("albedo", ""))) + for path in paths: + if path.is_empty() or not FileAccess.file_exists("res://" + path.trim_prefix("res://")): + failures.append("Missing generated art file: %s" % path) + return failures + + +func _check_main_uses_generated_art() -> Array[String]: + var failures: Array[String] = [] + var file := FileAccess.open(MAIN_SCRIPT_PATH, FileAccess.READ) + if file == null: + failures.append("Could not read main scene script.") + return failures + var source := file.get_as_text() + if source.find("kenney_factory_kit") >= 0: + failures.append("Playable scene still references Kenney Factory Kit models.") + if source.find("assets/generated/renders/") < 0: + failures.append("Playable scene does not load generated renders.") + return failures + + +func _index_by_id(rows: Array) -> Dictionary: + var lookup := {} + for row_variant in rows: + var row: Dictionary = row_variant + lookup[String(row.get("id", ""))] = row + return lookup + + +func _read_json(path: String) -> Dictionary: + var file := FileAccess.open(path, FileAccess.READ) + if file == null: + return {} + var parsed: Variant = JSON.parse_string(file.get_as_text()) + if typeof(parsed) != TYPE_DICTIONARY: + return {} + return parsed diff --git a/tests/art_catalog_smoke.gd.uid b/tests/art_catalog_smoke.gd.uid new file mode 100644 index 0000000..c18cbb5 --- /dev/null +++ b/tests/art_catalog_smoke.gd.uid @@ -0,0 +1 @@ +uid://b4fydcbgsr7v7 diff --git a/tests/demo_flow_smoke.gd b/tests/demo_flow_smoke.gd new file mode 100644 index 0000000..f6fc0de --- /dev/null +++ b/tests/demo_flow_smoke.gd @@ -0,0 +1,120 @@ +extends SceneTree + +const WorldSimulation = preload("res://src/simulation/world_simulation.gd") + + +func _initialize() -> void: + var packed := load("res://scenes/main.tscn") as PackedScene + var demo := packed.instantiate() + root.add_child.call_deferred(demo) + await process_frame + await process_frame + + demo.call("_start_game") + _build_cells(demo, WorldSimulation.KIND_BELT, [ + Vector2i(-5, 0), + Vector2i(-4, 0), + Vector2i(-3, 0), + Vector2i(-2, 0), + Vector2i(0, 0), + Vector2i(2, 0), + Vector2i(3, 0), + Vector2i(4, 0), + Vector2i(5, 0), + ]) + _build_cells(demo, WorldSimulation.KIND_MANA_PIPE, [ + Vector2i(0, 4), + Vector2i(0, 3), + Vector2i(0, 2), + Vector2i(0, 1), + ]) + var simulation: WorldSimulation = demo.get("simulation") + var building_count_before_overlap := simulation.buildings.size() + demo.set("hovered_cell", Vector2i(-5, 0)) + demo.set("hover_is_valid", true) + demo.call("_try_place_selected") + var overlap_was_rejected := simulation.buildings.size() == building_count_before_overlap + demo.call("_try_remove_hovered") + var removal_succeeded := simulation.get_building_at(Vector2i(-5, 0)).is_empty() + _build_cells(demo, WorldSimulation.KIND_BELT, [Vector2i(-5, 0)]) + + demo.call("_begin_bridge_config") + _click_bridge_cell(demo, Vector2i(-1, 1)) + _click_bridge_cell(demo, Vector2i(-2, 0)) + _click_bridge_cell(demo, Vector2i(0, 0)) + demo.call("_begin_bridge_config") + _click_bridge_cell(demo, Vector2i(1, 1)) + _click_bridge_cell(demo, Vector2i(0, 0)) + _click_bridge_cell(demo, Vector2i(2, 0)) + + # Selecting a locked processor must expose inspection fields without + # mutating the running factory. + demo.set("hovered_cell", Vector2i(-1, 1)) + demo.set("hover_is_valid", true) + demo.call("_try_place_selected") + var selected_id := int(demo.get("selected_building_id")) + var inspect_before := simulation.state_fingerprint() + var inspect_report: Dictionary = simulation.inspect_building(selected_id) + var inspect_mutated := inspect_before != simulation.state_fingerprint() + + for _tick in range(1800): + simulation.step() + + var anchor_machine_id := int(demo.get("anchor_machine_id")) + var charger_machine_id := int(demo.get("charger_machine_id")) + var machine: Dictionary = simulation.buildings[anchor_machine_id] + var charger: Dictionary = simulation.buildings[charger_machine_id] + var failures: Array[String] = [] + if bool(demo.get("bridge_mode")): + failures.append("Bridge setup did not leave configuration mode.") + if not overlap_was_rejected: + failures.append("Grid placement allowed an overlapping building.") + if not removal_succeeded: + failures.append("Player removal did not clear grid occupancy.") + if not bool(machine["bridge_configured"]): + failures.append("Anchor machine did not retain bridge endpoints.") + if not bool(charger["bridge_configured"]): + failures.append("Charger did not retain bridge endpoints.") + if not bool(machine["mana_powered"]): + failures.append("Player-built mana pipe route did not power the refinery.") + if not bool(charger["mana_powered"]): + failures.append("Player-built mana pipe route did not power the charger.") + if selected_id != anchor_machine_id: + failures.append("Clicking the refinery did not select it for inspection.") + if inspect_report.is_empty() or inspect_report.get("recipe", {}).is_empty(): + failures.append("Selection inspection did not return a recipe payload.") + if inspect_mutated: + failures.append("Inspection mutated simulation state.") + if simulation.get_charged_count() < 15: + failures.append("Completed player flow did not sustain charged-crystal output.") + if not simulation.is_demo_complete(): + failures.append("Sustained charged-crystal intake did not mark the demo complete.") + + if failures.is_empty(): + print("DEMO_FLOW_OK charged=%d refine_bridge=%s->%s charger_bridge=%s->%s mana_network=%d" % [ + simulation.get_charged_count(), + str(machine["input_cell"]), + str(machine["output_cell"]), + str(charger["input_cell"]), + str(charger["output_cell"]), + int(machine["mana_network"]), + ]) + quit(0) + else: + for failure in failures: + push_error(failure) + quit(1) + + +func _build_cells(demo: Node, kind: StringName, cells: Array[Vector2i]) -> void: + demo.call("_select_tool", kind) + for cell in cells: + demo.set("hovered_cell", cell) + demo.set("hover_is_valid", true) + demo.call("_try_place_selected") + + +func _click_bridge_cell(demo: Node, cell: Vector2i) -> void: + demo.set("hovered_cell", cell) + demo.set("hover_is_valid", true) + demo.call("_handle_bridge_click") diff --git a/tests/demo_flow_smoke.gd.uid b/tests/demo_flow_smoke.gd.uid new file mode 100644 index 0000000..0d1744d --- /dev/null +++ b/tests/demo_flow_smoke.gd.uid @@ -0,0 +1 @@ +uid://dtptpsgl6k5vb diff --git a/tests/inspection_smoke.gd b/tests/inspection_smoke.gd new file mode 100644 index 0000000..3471311 --- /dev/null +++ b/tests/inspection_smoke.gd @@ -0,0 +1,231 @@ +extends SceneTree + +const WorldSimulation = preload("res://src/simulation/world_simulation.gd") + + +func _initialize() -> void: + var failures: Array[String] = [] + var reports: Dictionary = {} + + reports["no_mana"] = _capture_no_mana() + reports["missing_input"] = _capture_missing_input() + reports["waiting_input"] = _capture_waiting_input() + reports["working"] = _capture_working() + reports["outputting"] = _capture_outputting() + reports["blocked_output"] = _capture_blocked_output() + reports["charger_no_mana"] = _capture_charger_no_mana() + + for status in [ + &"no_mana", + &"missing_input", + &"waiting_input", + &"working", + &"outputting", + &"blocked_output", + ]: + if not reports.has(status): + failures.append("Missing inspection capture for %s." % String(status)) + continue + var capture: Dictionary = reports[status] + if not bool(capture.get("ok", false)): + failures.append( + "Could not reach status %s (got %s)." % [ + String(status), + String(capture.get("status", &"")), + ] + ) + continue + failures.append_array(_validate_payload(status, capture["report"], capture["unchanged"])) + + var charger_capture: Dictionary = reports["charger_no_mana"] + if not bool(charger_capture.get("ok", false)): + failures.append("Charger did not emit a second-stage no_mana status.") + else: + var charger_report: Dictionary = charger_capture["report"] + var recipe: Dictionary = charger_report.get("recipe", {}) + if recipe.get("id", &"") != WorldSimulation.RECIPE_CHARGE: + failures.append("Charger inspection did not expose the charge recipe.") + if recipe.get("input_kind", &"") != WorldSimulation.ITEM_REFINED: + failures.append("Charger recipe input was not refined crystal.") + if recipe.get("output_kind", &"") != WorldSimulation.ITEM_CHARGED: + failures.append("Charger recipe output was not charged crystal.") + failures.append_array( + _validate_payload(&"no_mana", charger_report, charger_capture["unchanged"]) + ) + + if failures.is_empty(): + print("INSPECTION_SMOKE_OK statuses=%s" % ",".join([ + "no_mana", + "missing_input", + "waiting_input", + "working", + "outputting", + "blocked_output", + "charger_no_mana", + ])) + quit(0) + else: + for failure in failures: + push_error(failure) + quit(1) + + +func _validate_payload(status: StringName, report: Dictionary, unchanged: bool) -> Array[String]: + var failures: Array[String] = [] + if report.is_empty(): + failures.append("Inspection returned an empty payload for %s." % String(status)) + return failures + for key in ["recipe", "progress", "inventory", "mana", "reason"]: + if not report.has(key): + failures.append("Inspection for %s missing field %s." % [String(status), key]) + var recipe: Dictionary = report.get("recipe", {}) + if recipe.is_empty() or not recipe.has("id"): + failures.append("Inspection for %s missing recipe id." % String(status)) + var progress: Dictionary = report.get("progress", {}) + if not progress.has("ratio") or not progress.has("remaining_ticks"): + failures.append("Inspection for %s missing progress fields." % String(status)) + var inventory: Dictionary = report.get("inventory", {}) + if not inventory.has("input_count") or not inventory.has("output_buffer"): + failures.append("Inspection for %s missing inventory fields." % String(status)) + var mana: Dictionary = report.get("mana", {}) + if not mana.has("powered") or not mana.has("network"): + failures.append("Inspection for %s missing mana fields." % String(status)) + if status != &"working" and String(report.get("reason", "")).is_empty(): + failures.append("Inspection for %s had an empty stop reason." % String(status)) + if not unchanged: + failures.append("Inspection for %s mutated tick, inventory, or fingerprint." % String(status)) + return failures + + +func _inspect_without_mutation(simulation: WorldSimulation, building_id: int) -> Dictionary: + var before := { + "tick": simulation.tick_index, + "fingerprint": simulation.state_fingerprint(), + "sink": simulation.sink_inventory.duplicate(), + } + var input_count := -1 + if simulation.buildings.has(building_id): + input_count = int(simulation.buildings[building_id].get("input_count", -1)) + var report := simulation.inspect_building(building_id) + var unchanged: bool = ( + int(before["tick"]) == simulation.tick_index + and String(before["fingerprint"]) == simulation.state_fingerprint() + and before["sink"] == simulation.sink_inventory + and ( + input_count < 0 + or input_count == int(simulation.buildings[building_id].get("input_count", -2)) + ) + ) + return { + "report": report, + "unchanged": unchanged, + "status": report.get("status", &""), + "ok": not report.is_empty(), + } + + +func _capture_no_mana() -> Dictionary: + var simulation := WorldSimulation.new() + var machine_id := simulation.place_building(WorldSimulation.KIND_MACHINE, Vector2i(0, 0), 0) + simulation.step() + var capture := _inspect_without_mutation(simulation, machine_id) + capture["ok"] = String(capture["status"]) == "no_mana" + return capture + + +func _capture_missing_input() -> Dictionary: + var simulation := WorldSimulation.new() + var machine_id := simulation.place_building(WorldSimulation.KIND_MACHINE, Vector2i(0, 0), 0) + simulation.place_building(WorldSimulation.KIND_MANA_SOURCE, Vector2i(0, 1), 0) + simulation.step() + var capture := _inspect_without_mutation(simulation, machine_id) + capture["ok"] = String(capture["status"]) == "missing_input" + return capture + + +func _capture_waiting_input() -> Dictionary: + var simulation := WorldSimulation.new() + var machine_id := simulation.place_building(WorldSimulation.KIND_MACHINE, Vector2i(0, 0), 0) + simulation.place_building(WorldSimulation.KIND_MANA_SOURCE, Vector2i(0, 1), 0) + simulation.place_building(WorldSimulation.KIND_BELT, Vector2i(-1, 0), 0) + simulation.step() + var capture := _inspect_without_mutation(simulation, machine_id) + capture["ok"] = String(capture["status"]) == "waiting_input" + return capture + + +func _capture_working() -> Dictionary: + var simulation := _powered_line() + var machine_id := _find_kind(simulation, WorldSimulation.KIND_MACHINE) + for _tick in range(400): + simulation.step() + if String(simulation.buildings[machine_id]["status"]) == "working": + var capture := _inspect_without_mutation(simulation, machine_id) + capture["ok"] = String(capture["status"]) == "working" + return capture + return {"ok": false, "status": simulation.buildings[machine_id]["status"], "report": {}, "unchanged": true} + + +func _capture_outputting() -> Dictionary: + var simulation := _powered_line() + var machine_id := _find_kind(simulation, WorldSimulation.KIND_MACHINE) + var source_cell := Vector2i(-3, 0) + for _tick in range(400): + simulation.step() + if int(simulation.buildings[_find_kind(simulation, WorldSimulation.KIND_SOURCE)].get("produced", 0)) >= 1: + break + simulation.remove_building(source_cell) + for _tick in range(400): + simulation.step() + if String(simulation.buildings[machine_id]["status"]) == "outputting": + var capture := _inspect_without_mutation(simulation, machine_id) + capture["ok"] = String(capture["status"]) == "outputting" + return capture + return {"ok": false, "status": simulation.buildings[machine_id]["status"], "report": {}, "unchanged": true} + + +func _capture_blocked_output() -> Dictionary: + var simulation := WorldSimulation.new() + simulation.place_building(WorldSimulation.KIND_SOURCE, Vector2i(-3, 0), 0) + simulation.place_building(WorldSimulation.KIND_BELT, Vector2i(-2, 0), 0) + simulation.place_building(WorldSimulation.KIND_BELT, Vector2i(-1, 0), 0) + var machine_id := simulation.place_building(WorldSimulation.KIND_MACHINE, Vector2i(0, 0), 0) + simulation.place_building(WorldSimulation.KIND_MANA_SOURCE, Vector2i(0, 1), 0) + for _tick in range(400): + simulation.step() + if String(simulation.buildings[machine_id]["status"]) == "blocked_output": + var capture := _inspect_without_mutation(simulation, machine_id) + capture["ok"] = String(capture["status"]) == "blocked_output" + return capture + return {"ok": false, "status": simulation.buildings[machine_id]["status"], "report": {}, "unchanged": true} + + +func _capture_charger_no_mana() -> Dictionary: + var simulation := WorldSimulation.new() + var charger_id := simulation.place_building(WorldSimulation.KIND_CHARGER, Vector2i(2, 0), 0) + simulation.step() + var capture := _inspect_without_mutation(simulation, charger_id) + capture["ok"] = String(capture["status"]) == "no_mana" + return capture + + +func _powered_line() -> WorldSimulation: + var simulation := WorldSimulation.new() + simulation.place_building(WorldSimulation.KIND_SOURCE, Vector2i(-3, 0), 0) + simulation.place_building(WorldSimulation.KIND_BELT, Vector2i(-2, 0), 0) + simulation.place_building(WorldSimulation.KIND_BELT, Vector2i(-1, 0), 0) + simulation.place_building(WorldSimulation.KIND_MACHINE, Vector2i(0, 0), 0) + simulation.place_building(WorldSimulation.KIND_MANA_SOURCE, Vector2i(0, 2), 0) + simulation.place_building(WorldSimulation.KIND_MANA_PIPE, Vector2i(0, 1), 0) + simulation.place_building(WorldSimulation.KIND_BELT, Vector2i(1, 0), 0) + simulation.place_building(WorldSimulation.KIND_BELT, Vector2i(2, 0), 0) + simulation.place_building(WorldSimulation.KIND_SINK, Vector2i(3, 0), 0) + return simulation + + +func _find_kind(simulation: WorldSimulation, kind: StringName) -> int: + for id_variant in simulation.get_building_ids(): + var id := int(id_variant) + if simulation.buildings[id]["kind"] == kind: + return id + return -1 diff --git a/tests/inspection_smoke.gd.uid b/tests/inspection_smoke.gd.uid new file mode 100644 index 0000000..edcf037 --- /dev/null +++ b/tests/inspection_smoke.gd.uid @@ -0,0 +1 @@ +uid://bemwej038tpgp diff --git a/tests/simulation_smoke.gd b/tests/simulation_smoke.gd new file mode 100644 index 0000000..a2b76aa --- /dev/null +++ b/tests/simulation_smoke.gd @@ -0,0 +1,125 @@ +extends SceneTree + +const WorldSimulation = preload("res://src/simulation/world_simulation.gd") + + +func _initialize() -> void: + var first := _run_factory() + var second := _run_factory() + var mana_pause := _run_mana_pause_resume() + var bridge_result := _run_bridge_factory() + var failures: Array[String] = [] + + if int(first["refined"]) < 20: + failures.append("Expected at least 20 refined crystals, got %d." % int(first["refined"])) + if first["fingerprint"] != second["fingerprint"]: + failures.append("Identical fixed-tick runs produced different fingerprints.") + if int(first["items"]) != int(second["items"]): + failures.append("Identical runs produced different in-flight item counts.") + if not bool(mana_pause["stopped_without_mana"]): + failures.append("Machine produced output without a connected mana network.") + if not bool(mana_pause["paused_exactly"]): + failures.append("Disconnecting mana did not preserve the unfinished recipe.") + if not bool(mana_pause["resumed"]): + failures.append("Machine did not resume its unfinished recipe after mana reconnection.") + if int(bridge_result["refined"]) < 20: + failures.append("Bridge-bound machine did not sustain production.") + + if failures.is_empty(): + print("SIMULATION_SMOKE_OK refined=%d fingerprint=%s items=%d" % [ + int(first["refined"]), + String(first["fingerprint"]), + int(first["items"]), + ]) + quit(0) + else: + for failure in failures: + push_error(failure) + quit(1) + + +func _run_factory() -> Dictionary: + var simulation := WorldSimulation.new() + simulation.place_building(WorldSimulation.KIND_SOURCE, Vector2i(-3, 0), 0) + simulation.place_building(WorldSimulation.KIND_BELT, Vector2i(-2, 0), 0) + simulation.place_building(WorldSimulation.KIND_BELT, Vector2i(-1, 0), 0) + simulation.place_building(WorldSimulation.KIND_MACHINE, Vector2i(0, 0), 0) + simulation.place_building(WorldSimulation.KIND_MANA_SOURCE, Vector2i(0, 2), 0) + simulation.place_building(WorldSimulation.KIND_MANA_PIPE, Vector2i(0, 1), 0) + simulation.place_building(WorldSimulation.KIND_BELT, Vector2i(1, 0), 0) + simulation.place_building(WorldSimulation.KIND_BELT, Vector2i(2, 0), 0) + simulation.place_building(WorldSimulation.KIND_SINK, Vector2i(3, 0), 0) + + for _tick in range(1800): + simulation.step() + + return { + "refined": simulation.get_refined_count(), + "fingerprint": simulation.state_fingerprint(), + "items": simulation.items.size(), + } + + +func _run_mana_pause_resume() -> Dictionary: + var simulation := WorldSimulation.new() + simulation.place_building(WorldSimulation.KIND_SOURCE, Vector2i(-3, 0), 0) + simulation.place_building(WorldSimulation.KIND_BELT, Vector2i(-2, 0), 0) + simulation.place_building(WorldSimulation.KIND_BELT, Vector2i(-1, 0), 0) + var machine_id := simulation.place_building(WorldSimulation.KIND_MACHINE, Vector2i(0, 0), 0) + simulation.place_building(WorldSimulation.KIND_BELT, Vector2i(1, 0), 0) + simulation.place_building(WorldSimulation.KIND_BELT, Vector2i(2, 0), 0) + simulation.place_building(WorldSimulation.KIND_SINK, Vector2i(3, 0), 0) + + for _tick in range(200): + simulation.step() + var stopped_without_mana: bool = ( + simulation.get_refined_count() == 0 + and simulation.buildings[machine_id]["status"] == &"no_mana" + ) + + simulation.place_building(WorldSimulation.KIND_MANA_SOURCE, Vector2i(0, 2), 0) + simulation.place_building(WorldSimulation.KIND_MANA_PIPE, Vector2i(0, 1), 0) + for _tick in range(10): + simulation.step() + var remaining_before_disconnect: int = int(simulation.buildings[machine_id]["completion_tick"]) - simulation.tick_index + simulation.remove_building(Vector2i(0, 1)) + var paused_remaining: int = int(simulation.buildings[machine_id]["remaining_ticks"]) + for _tick in range(100): + simulation.step() + var paused_exactly: bool = ( + simulation.get_refined_count() == 0 + and paused_remaining == remaining_before_disconnect + and int(simulation.buildings[machine_id]["completion_tick"]) == -1 + ) + + simulation.place_building(WorldSimulation.KIND_MANA_PIPE, Vector2i(0, 1), 0) + for _tick in range(120): + simulation.step() + return { + "stopped_without_mana": stopped_without_mana, + "paused_exactly": paused_exactly, + "resumed": simulation.get_refined_count() > 0, + } + + +func _run_bridge_factory() -> Dictionary: + var simulation := WorldSimulation.new() + simulation.place_building(WorldSimulation.KIND_SOURCE, Vector2i(-3, 0), 0) + simulation.place_building(WorldSimulation.KIND_BELT, Vector2i(-2, 0), 0) + simulation.place_building(WorldSimulation.KIND_BELT, Vector2i(-1, 0), 0) + var machine_id := simulation.place_building(WorldSimulation.KIND_MACHINE, Vector2i(0, 1), 0) + simulation.place_building(WorldSimulation.KIND_BELT, Vector2i(1, 0), 0) + simulation.place_building(WorldSimulation.KIND_BELT, Vector2i(2, 0), 0) + simulation.place_building(WorldSimulation.KIND_SINK, Vector2i(3, 0), 0) + simulation.place_building(WorldSimulation.KIND_MANA_SOURCE, Vector2i(0, 3), 0) + simulation.place_building(WorldSimulation.KIND_MANA_PIPE, Vector2i(0, 2), 0) + var configured := simulation.configure_machine_bridge( + machine_id, + Vector2i(-1, 0), + Vector2i(1, 0) + ) + if not configured: + return {"refined": 0} + for _tick in range(1800): + simulation.step() + return {"refined": simulation.get_refined_count()} diff --git a/tests/simulation_smoke.gd.uid b/tests/simulation_smoke.gd.uid new file mode 100644 index 0000000..59b31d0 --- /dev/null +++ b/tests/simulation_smoke.gd.uid @@ -0,0 +1 @@ +uid://c0ik3wd2ycn1h diff --git a/tests/two_stage_smoke.gd b/tests/two_stage_smoke.gd new file mode 100644 index 0000000..8c0b33c --- /dev/null +++ b/tests/two_stage_smoke.gd @@ -0,0 +1,182 @@ +extends SceneTree + +const WorldSimulation = preload("res://src/simulation/world_simulation.gd") + +const RUN_TICKS := 2000 + + +func _initialize() -> void: + var first := _run_two_stage(RUN_TICKS) + var second := _run_two_stage(RUN_TICKS) + var first_item := _run_until_first_charged() + var blocked := _run_blocked_output() + var failures: Array[String] = [] + + if int(first["charged"]) <= 0: + failures.append("Two-stage factory produced no charged crystals.") + if int(first["charged"]) != int(second["charged"]): + failures.append("Identical two-stage runs produced different charged counts.") + if String(first["fingerprint"]) != String(second["fingerprint"]): + failures.append("Identical two-stage runs produced different fingerprints.") + if int(first["mass"]) != int(first["produced"]): + failures.append( + "Mass was not conserved: produced=%d mass=%d." % [ + int(first["produced"]), + int(first["mass"]), + ] + ) + if int(second["mass"]) != int(second["produced"]): + failures.append("Second two-stage run did not conserve mass.") + if bool(first_item["saw_item"]) == false: + failures.append("Factory never delivered the first charged crystal.") + if bool(first_item["complete_after_one"]): + failures.append("Demo completed after a single charged crystal.") + if not bool(first["complete"]): + failures.append("Sustained charged-crystal intake did not complete the demo.") + if bool(first_item["complete_before_any"]): + failures.append("Demo reported complete before any charged crystal arrived.") + if not bool(blocked["stopped_upstream"]): + failures.append("Blocked charger output did not stop the upstream refinery.") + if int(blocked["mass"]) != int(blocked["produced"]): + failures.append( + "Blocked-output mass was not conserved: produced=%d mass=%d." % [ + int(blocked["produced"]), + int(blocked["mass"]), + ] + ) + if int(blocked["mass_after"]) != int(blocked["mass"]): + failures.append("Blocked factory lost or duplicated items while idle.") + if int(blocked["produced_after"]) != int(blocked["produced"]): + failures.append("Blocked factory kept spawning items after belts filled.") + if int(blocked["charged"]) != 0: + failures.append("Blocked charger leaked charged crystals into the sink.") + if int(first["charged"]) <= int(blocked["charged"]): + failures.append("Clearing the output-belt bottleneck did not increase charged throughput.") + + if failures.is_empty(): + print("TWO_STAGE_SMOKE_OK charged=%d fingerprint=%s produced=%d mass=%d" % [ + int(first["charged"]), + String(first["fingerprint"]), + int(first["produced"]), + int(first["mass"]), + ]) + quit(0) + else: + for failure in failures: + push_error(failure) + quit(1) + + +func _run_two_stage(ticks: int) -> Dictionary: + var simulation := _make_two_stage_factory(true) + for _tick in range(ticks): + simulation.step() + return { + "charged": simulation.get_charged_count(), + "refined": simulation.get_refined_count(), + "fingerprint": simulation.state_fingerprint(), + "produced": _count_produced(simulation), + "mass": _count_mass(simulation), + "complete": simulation.is_demo_complete(), + } + + +func _run_until_first_charged() -> Dictionary: + var simulation := _make_two_stage_factory(true) + var complete_before_any := simulation.is_demo_complete() + var saw_item := false + var complete_after_one := false + for _tick in range(RUN_TICKS): + simulation.step() + if simulation.get_charged_count() >= 1: + saw_item = true + complete_after_one = simulation.is_demo_complete() + break + return { + "saw_item": saw_item, + "complete_after_one": complete_after_one, + "complete_before_any": complete_before_any, + } + + +func _run_blocked_output() -> Dictionary: + var simulation := _make_two_stage_factory(false) + for _tick in range(RUN_TICKS): + simulation.step() + var charger_id := _find_kind(simulation, WorldSimulation.KIND_CHARGER) + var refine_id := _find_kind(simulation, WorldSimulation.KIND_MACHINE) + var charger: Dictionary = simulation.buildings[charger_id] + var refine: Dictionary = simulation.buildings[refine_id] + var stopped_upstream := ( + String(charger["status"]) == "blocked_output" + and String(refine["status"]) in ["blocked_output", "working", "outputting"] + ) + # After the mid belt and charger buffers fill, further ticks must not + # create or destroy crystals. + var mass := _count_mass(simulation) + var produced := _count_produced(simulation) + for _tick in range(200): + simulation.step() + return { + "stopped_upstream": stopped_upstream, + "mass": mass, + "produced": produced, + "mass_after": _count_mass(simulation), + "produced_after": _count_produced(simulation), + "charged": simulation.get_charged_count(), + "charger_status": charger["status"], + "refine_status": refine["status"], + } + + +func _make_two_stage_factory(with_output_belts: bool) -> WorldSimulation: + var simulation := WorldSimulation.new() + simulation.place_building(WorldSimulation.KIND_SOURCE, Vector2i(-6, 0), 0) + for x in range(-5, -1): + simulation.place_building(WorldSimulation.KIND_BELT, Vector2i(x, 0), 0) + simulation.place_building(WorldSimulation.KIND_BELT, Vector2i(0, 0), 0) + # A single drop belt with no sink creates real backpressure: the charger + # can emit one charged crystal, then the cell stays occupied. + simulation.place_building(WorldSimulation.KIND_BELT, Vector2i(2, 0), 0) + if with_output_belts: + for x in range(3, 6): + simulation.place_building(WorldSimulation.KIND_BELT, Vector2i(x, 0), 0) + simulation.place_building(WorldSimulation.KIND_SINK, Vector2i(6, 0), 0) + var refine_id := simulation.place_building(WorldSimulation.KIND_MACHINE, Vector2i(-1, 1), 0) + var charger_id := simulation.place_building(WorldSimulation.KIND_CHARGER, Vector2i(1, 1), 0) + simulation.place_building(WorldSimulation.KIND_MANA_SOURCE, Vector2i(0, 5), 1) + for z in range(1, 5): + simulation.place_building(WorldSimulation.KIND_MANA_PIPE, Vector2i(0, z), 1) + simulation.configure_machine_bridge(refine_id, Vector2i(-2, 0), Vector2i(0, 0)) + simulation.configure_machine_bridge(charger_id, Vector2i(0, 0), Vector2i(2, 0)) + return simulation + + +func _count_produced(simulation: WorldSimulation) -> int: + var produced := 0 + for building: Dictionary in simulation.buildings.values(): + if building["kind"] == WorldSimulation.KIND_SOURCE: + produced += int(building.get("produced", 0)) + return produced + + +func _count_mass(simulation: WorldSimulation) -> int: + var mass := simulation.items.size() + for kind in simulation.sink_inventory.keys(): + mass += int(simulation.sink_inventory[kind]) + for building: Dictionary in simulation.buildings.values(): + if not WorldSimulation.is_processor(building["kind"]): + continue + mass += int(building.get("input_count", 0)) + mass += int(building.get("output_buffer", 0)) + if int(building.get("completion_tick", -1)) >= 0 or int(building.get("remaining_ticks", 0)) > 0: + mass += 1 + return mass + + +func _find_kind(simulation: WorldSimulation, kind: StringName) -> int: + for id_variant in simulation.get_building_ids(): + var id := int(id_variant) + if simulation.buildings[id]["kind"] == kind: + return id + return -1 diff --git a/tests/two_stage_smoke.gd.uid b/tests/two_stage_smoke.gd.uid new file mode 100644 index 0000000..67c490f --- /dev/null +++ b/tests/two_stage_smoke.gd.uid @@ -0,0 +1 @@ +uid://bpl287yrytxky diff --git a/third_party/.gdignore b/third_party/.gdignore new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/third_party/.gdignore @@ -0,0 +1 @@ + diff --git a/third_party/kenney_factory_kit_3.0/LICENSE.txt b/third_party/kenney_factory_kit_3.0/LICENSE.txt new file mode 100644 index 0000000..d643ee5 --- /dev/null +++ b/third_party/kenney_factory_kit_3.0/LICENSE.txt @@ -0,0 +1,28 @@ + + + Factory Kit (3.0) + + Created/distributed by Kenney (www.kenney.nl) + Creation date: 01-05-2026 14:45 + + ------------------------------ + + License: (Creative Commons Zero, CC0) + http://creativecommons.org/publicdomain/zero/1.0/ + + You can use this content for personal, educational, and commercial purposes. + + Support by crediting 'Kenney' or 'www.kenney.nl' (this is not a requirement) + + ------------------------------ + + • Website : www.kenney.nl + • Donate : www.kenney.nl/donate + + • Patreon : patreon.com/kenney + + Follow on social media for updates: + + • Twitter: twitter.com/KenneyNL + • BlueSky: kenney.bsky.social + • Instagram: instagram.com/kenney_nl \ No newline at end of file diff --git a/third_party/kenney_factory_kit_3.0/source/kenney_factory-kit_3.0.zip b/third_party/kenney_factory_kit_3.0/source/kenney_factory-kit_3.0.zip new file mode 100644 index 0000000..66c9c18 Binary files /dev/null and b/third_party/kenney_factory_kit_3.0/source/kenney_factory-kit_3.0.zip differ diff --git a/tools/punch_render_alpha.py b/tools/punch_render_alpha.py new file mode 100644 index 0000000..d00a865 --- /dev/null +++ b/tools/punch_render_alpha.py @@ -0,0 +1,72 @@ +"""Knock a flat charcoal field out of generated renders so they can be sprites.""" + +from __future__ import annotations + +import sys +from pathlib import Path + +from PIL import Image + + +def sample_background(image: Image.Image) -> tuple[float, float, float]: + pixels = image.load() + width, height = image.size + samples: list[tuple[int, int, int]] = [] + for x, y in ( + (2, 2), + (width - 3, 2), + (2, height - 3), + (width - 3, height - 3), + (width // 2, 2), + (width // 2, height - 3), + ): + pixel = pixels[x, y] + samples.append((pixel[0], pixel[1], pixel[2])) + count = float(len(samples)) + return ( + sum(sample[0] for sample in samples) / count, + sum(sample[1] for sample in samples) / count, + sum(sample[2] for sample in samples) / count, + ) + + +def punch(path: Path) -> None: + image = Image.open(path).convert("RGBA") + background = sample_background(image) + pixels = image.load() + width, height = image.size + for y in range(height): + for x in range(width): + red, green, blue, _alpha = pixels[x, y] + distance = ( + (red - background[0]) ** 2 + + (green - background[1]) ** 2 + + (blue - background[2]) ** 2 + ) ** 0.5 + if distance < 18: + alpha = 0 + elif distance < 34: + alpha = int((distance - 18) * (255.0 / 16.0)) + else: + alpha = 255 + pixels[x, y] = (red, green, blue, alpha) + image.save(path) + + +def main() -> int: + roots = [ + Path("assets/generated/renders/machines"), + Path("assets/generated/renders/logistics"), + Path("assets/generated/renders/items"), + ] + count = 0 + for root in roots: + for path in sorted(root.glob("*.png")): + punch(path) + count += 1 + print("PUNCHED %d" % count) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tools/recipe-tree-editor/README.md b/tools/recipe-tree-editor/README.md new file mode 100644 index 0000000..ad3fb20 --- /dev/null +++ b/tools/recipe-tree-editor/README.md @@ -0,0 +1,49 @@ +# 配方树工作台 + +这是给策划直接使用的本地数据工具。它编辑的不是一份演示副本,而是项目中的权威配方书:`data/recipe-book.json`。 + +## 打开 + +在 Windows 资源管理器中双击 `start-editor.cmd`。启动器会在本机打开浏览器页面,保存服务只监听 `127.0.0.1`,不会对局域网或互联网开放。 + +如果浏览器没有自动打开,也可以在本目录运行: + +```powershell +node server.mjs +``` + +随后访问 `http://127.0.0.1:8765/tools/recipe-tree-editor/`。 + +## 日常使用 + +1. 从左侧切换配方、物品或设施,并用阶段、生态区和搜索缩小范围。 +2. 中央默认显示选中条目的上下游;“全局”模式用于检查整条阶段结构。 +3. 在右侧修改数值。所有修改会立即反映到图谱和校验结果,并自动保留一份浏览器草稿。 +4. 先处理顶部的错误,再点“保存数据”。直接保存会写回 `data/recipe-book.json`,并在 `data/backups/` 生成时间戳备份。 +5. `Ctrl+Z` / `Ctrl+Y` 撤销和重做,`Ctrl+S` 保存,`/` 聚焦搜索。 + +## 魔法配方字段 + +- 输入方式“消耗”:每批永久扣除。 +- “催化”:参与仪式但不扣除,例如锚核和边界石。 +- “流体”:来自魔力或物质管网的批次输入。 +- “状态”:要求物品携带某种法则状态。 +- `min` / `max`:随机数量的安全上下界,`amount` 是策划估算用期望值。 +- `weight`:传送门结果袋权重,同一配方的权重总和必须为 100。 +- `chance`:独立概率;当所有产出都是概率项时,总和必须为 1。 +- `entropy`:每批给仪式网络或传送门增加的熵压力。 + +## 保存安全 + +- 有结构错误时,界面和服务端都会拒绝写入。 +- 修改 ID 会自动更新配方引用;仍被引用的物品或设施不能直接删除。 +- 浏览器草稿不是项目文件,顶部会一直显示“未保存”,直到直接保存成功。 +- 本地服务不可用时,“保存数据”会退化为下载 JSON;此时需要手动替换项目数据文件。 + +## 校验 + +```powershell +node tests.mjs +``` + +测试覆盖引用完整性、科技 ID、结果袋权重、依赖图构建和首次折跃关键上游。当前 Godot 原型尚未消费这份数据;等内容运行时建立后,应直接读取这份 JSON 或由它生成 Godot Resource,避免维护第二套数值。 diff --git a/tools/recipe-tree-editor/app.mjs b/tools/recipe-tree-editor/app.mjs new file mode 100644 index 0000000..c153bb8 --- /dev/null +++ b/tools/recipe-tree-editor/app.mjs @@ -0,0 +1,1092 @@ +import { + buildGraph, + cloneBook, + makeIndex, + primaryRatePerMinute, + summarizeBook, + traceIngredientClosure, + validateBook, +} from "./core.mjs"; + +const $ = (selector) => document.querySelector(selector); +const elements = { + app: $("#app"), + statRecipes: $("#statRecipes"), + statItems: $("#statItems"), + statMachines: $("#statMachines"), + tabRecipes: $("#tabRecipes"), + tabItems: $("#tabItems"), + tabMachines: $("#tabMachines"), + saveState: $("#saveState"), + undoButton: $("#undoButton"), + redoButton: $("#redoButton"), + importButton: $("#importButton"), + exportButton: $("#exportButton"), + issuesButton: $("#issuesButton"), + issueCount: $("#issueCount"), + saveButton: $("#saveButton"), + addEntityButton: $("#addEntityButton"), + typeTabs: $("#typeTabs"), + catalogSearch: $("#catalogSearch"), + stageFilter: $("#stageFilter"), + biomeFilter: $("#biomeFilter"), + catalogSummary: $("#catalogSummary"), + entityList: $("#entityList"), + graphTitle: $("#graphTitle"), + graphSubtitle: $("#graphSubtitle"), + graphMode: $("#graphMode"), + depthControl: $("#depthControl"), + graphDepth: $("#graphDepth"), + fitGraphButton: $("#fitGraphButton"), + graphStage: $("#graphStage"), + graph: $("#recipeGraph"), + graphViewport: $("#graphViewport"), + graphBackdrop: $("#graphBackdrop"), + graphEdges: $("#graphEdges"), + graphNodes: $("#graphNodes"), + graphEmpty: $("#graphEmpty"), + zoomOutButton: $("#zoomOutButton"), + zoomInButton: $("#zoomInButton"), + zoomOutput: $("#zoomOutput"), + routeSummary: $("#routeSummary"), + inspectorTitle: $("#inspectorTitle"), + inspectorKind: $("#inspectorKind"), + inspectorContent: $("#inspectorContent"), + issuesDialog: $("#issuesDialog"), + issuesSummary: $("#issuesSummary"), + issueFilter: $("#issueFilter"), + issueList: $("#issueList"), + helpDialog: $("#helpDialog"), + importFile: $("#importFile"), + toastStack: $("#toastStack"), +}; + +const TYPE_META = { + recipes: { label: "配方", glyph: "✦", singular: "recipe" }, + items: { label: "物品", glyph: "◆", singular: "item" }, + machines: { label: "设施", glyph: "▣", singular: "machine" }, +}; + +const RECIPE_KINDS = [ + ["craft", "制造"], ["inscription", "刻印"], ["growth", "生长"], + ["decay", "腐朽"], ["state", "状态转化"], ["separation", "分离"], + ["ritual", "仪式"], ["result_bag", "结果袋"], ["recovery", "回收"], +]; +const INPUT_MODES = [["consumed", "消耗"], ["catalyst", "催化"], ["fluid", "流体"], ["state", "状态"]]; +const ITEM_CATEGORIES = ["raw", "material", "component", "fluid", "proof", "state", "anchor", "offering", "construct", "record", "relic", "waste"]; +const DRAFT_KEY = "magic-foundry-recipe-book-draft-v1"; +const MAX_HISTORY = 100; + +const state = { + book: null, + selected: { type: "recipes", id: "perform_first_warp" }, + activeType: "recipes", + search: "", + stage: "all", + biome: "all", + graphMode: "focus", + graphDepth: 1, + graphTransform: { x: 0, y: 0, scale: 1 }, + graphBounds: null, + graphNeedsFit: true, + issues: [], + issueSeverity: "all", + history: [], + future: [], + dirty: false, + serverOnline: false, + saving: false, + savedBookJson: "", + technologyIds: null, + draftTimer: null, + pendingEdit: null, +}; + +function escapeHtml(value) { + return String(value ?? "") + .replaceAll("&", "&") + .replaceAll("<", "<") + .replaceAll(">", ">") + .replaceAll('"', """) + .replaceAll("'", "'"); +} + +function short(value, length = 22) { + const text = String(value ?? ""); + return text.length > length ? `${text.slice(0, length - 1)}…` : text; +} + +function slugTime() { + return new Date().toISOString().replaceAll(":", "-").replace("T", "_").slice(0, 19); +} + +function parseLines(value) { + return String(value || "").split(/[\n,,]/).map((entry) => entry.trim()).filter(Boolean); +} + +function numberFromInput(input, nullable = false) { + if (nullable && input.value.trim() === "") return null; + const value = Number(input.value); + return Number.isFinite(value) ? value : 0; +} + +function selectedEntity() { + return state.book?.[state.selected.type]?.find((entry) => entry.id === state.selected.id) || null; +} + +function ensureSelection() { + if (selectedEntity()) return; + const list = state.book?.[state.activeType] || []; + if (list.length) state.selected = { type: state.activeType, id: list[0].id }; +} + +function optionHtml(entries, selected, getId = (entry) => entry.id, getLabel = (entry) => entry.name) { + return entries.map((entry) => { + const id = getId(entry); + return ``; + }).join(""); +} + +function toast(message, severity = "success", timeout = 2800) { + const node = document.createElement("div"); + node.className = `toast ${severity}`; + node.textContent = message; + elements.toastStack.append(node); + window.setTimeout(() => node.remove(), timeout); +} + +function scheduleDraft() { + window.clearTimeout(state.draftTimer); + state.draftTimer = window.setTimeout(() => { + try { + localStorage.setItem(DRAFT_KEY, JSON.stringify({ savedAt: new Date().toISOString(), book: state.book })); + } catch { + toast("浏览器草稿空间不足,请尽快保存或导出。", "warning", 5000); + } + }, 500); +} + +function updateDirty() { + state.dirty = JSON.stringify(state.book) !== state.savedBookJson; + if (state.dirty) scheduleDraft(); + else localStorage.removeItem(DRAFT_KEY); +} + +function mutate(label, operation, { fitGraph = false } = {}) { + state.pendingEdit = null; + state.history.push({ label, book: cloneBook(state.book), selected: { ...state.selected } }); + if (state.history.length > MAX_HISTORY) state.history.shift(); + state.future.length = 0; + operation(state.book); + state.book.metadata ||= {}; + state.book.metadata.updatedAt = new Date().toISOString(); + updateDirty(); + state.graphNeedsFit ||= fitGraph; + refreshAll(); +} + +function undo() { + state.pendingEdit = null; + const snapshot = state.history.pop(); + if (!snapshot) return; + state.future.push({ label: snapshot.label, book: cloneBook(state.book), selected: { ...state.selected } }); + state.book = snapshot.book; + state.selected = snapshot.selected; + updateDirty(); + state.graphNeedsFit = true; + refreshAll(); + toast(`已撤销:${snapshot.label}`); +} + +function redo() { + state.pendingEdit = null; + const snapshot = state.future.pop(); + if (!snapshot) return; + state.history.push({ label: snapshot.label, book: cloneBook(state.book), selected: { ...state.selected } }); + state.book = snapshot.book; + state.selected = snapshot.selected; + updateDirty(); + state.graphNeedsFit = true; + refreshAll(); + toast(`已重做:${snapshot.label}`); +} + +function validate() { + state.issues = validateBook(state.book, { technologyIds: state.technologyIds }); + return state.issues; +} + +function renderStatus() { + const summary = summarizeBook(state.book, state.issues); + elements.statRecipes.textContent = summary.recipes; + elements.statItems.textContent = summary.items; + elements.statMachines.textContent = summary.machines; + elements.tabRecipes.textContent = summary.recipes; + elements.tabItems.textContent = summary.items; + elements.tabMachines.textContent = summary.machines; + elements.undoButton.disabled = state.history.length === 0; + elements.undoButton.dataset.history = String(state.history.length); + elements.undoButton.dataset.pendingEdit = state.pendingEdit?.key || ""; + elements.redoButton.disabled = state.future.length === 0; + elements.saveButton.disabled = state.saving; + elements.saveButton.textContent = state.saving ? "保存中…" : "保存数据"; + + const errors = state.issues.filter((entry) => entry.severity === "error").length; + const warnings = state.issues.filter((entry) => entry.severity === "warning").length; + elements.issueCount.textContent = errors ? `${errors} 个错误` : warnings ? `${warnings} 个警告` : "校验通过"; + elements.issuesButton.classList.toggle("has-errors", errors > 0); + elements.issuesButton.classList.toggle("has-warnings", warnings > 0); + + let className = "save-state "; + let text; + if (state.saving) { + className += "loading"; + text = "正在写入"; + } else if (state.dirty) { + className += state.serverOnline ? "dirty" : "offline"; + text = state.serverOnline ? "有未保存修改" : "草稿尚未写回"; + } else if (state.serverOnline) { + className += "saved"; + text = "已保存到项目"; + } else { + className += "offline"; + text = "仅导入导出模式"; + } + elements.saveState.className = className; + elements.saveState.querySelector("span").textContent = text; +} + +function renderFilters() { + const currentStage = state.stage; + const currentBiome = state.biome; + elements.stageFilter.innerHTML = `${optionHtml(state.book.stages, currentStage)}`; + elements.biomeFilter.innerHTML = `${optionHtml(state.book.biomes, currentBiome)}`; + elements.stageFilter.value = state.book.stages.some((entry) => entry.id === currentStage) ? currentStage : "all"; + elements.biomeFilter.value = state.book.biomes.some((entry) => entry.id === currentBiome) ? currentBiome : "all"; +} + +function renderCatalog() { + const query = state.search.trim().toLocaleLowerCase("zh-CN"); + const stageOrder = new Map(state.book.stages.map((entry) => [entry.id, entry.order])); + const list = (state.book[state.activeType] || []).filter((entity) => { + if (state.stage !== "all" && entity.stage !== state.stage) return false; + if (state.biome !== "all" && entity.biome !== state.biome) return false; + if (!query) return true; + const haystack = [entity.name, entity.id, entity.category, entity.kind, entity.description, entity.notes, ...(entity.tags || [])].join(" ").toLocaleLowerCase("zh-CN"); + return haystack.includes(query); + }).sort((a, b) => (stageOrder.get(a.stage) ?? 99) - (stageOrder.get(b.stage) ?? 99) || a.name.localeCompare(b.name, "zh-CN")); + + elements.typeTabs.querySelectorAll("button").forEach((button) => button.classList.toggle("active", button.dataset.type === state.activeType)); + elements.catalogSummary.textContent = `显示 ${list.length} / ${state.book[state.activeType].length} 个${TYPE_META[state.activeType].label}`; + if (!list.length) { + elements.entityList.innerHTML = `
没有符合条件的条目。
可以清除搜索或筛选。
`; + return; + } + + let lastStage = null; + const stageNames = new Map(state.book.stages.map((entry) => [entry.id, entry.name])); + elements.entityList.innerHTML = list.map((entity) => { + const stageLabel = entity.stage !== lastStage ? `
${escapeHtml(stageNames.get(entity.stage) || entity.stage)}
` : ""; + lastStage = entity.stage; + const meta = state.activeType === "recipes" ? `${entity.duration}s · ${entity.kind}` : state.activeType === "items" ? entity.category : `速度 ×${entity.baseSpeed}`; + return `${stageLabel}`; + }).join(""); +} + +function commonFields(entity) { + return `
+

基本信息

+
+ + + + +
+
`; +} + +function linkButtons(type, entities) { + if (!entities.length) return `暂无`; + return ``; +} + +function renderItemInspector(item) { + const index = makeIndex(state.book); + const producers = index.producers.get(item.id) || []; + const consumers = index.consumers.get(item.id) || []; + const categories = [...new Set([...ITEM_CATEGORIES, ...state.book.items.map((entry) => entry.category).filter(Boolean)])]; + return `${commonFields(item)} +
+

物料属性

+
+ + + + + + +
+
+
+

依赖关系

+
${producers.length}生产配方
${consumers.length}消费配方
${item.mass}质量
+
由这些配方产出${linkButtons("recipes", producers)}
+
用于这些配方${linkButtons("recipes", consumers)}
+
+ ${entityActions("items")}`; +} + +function renderInputRows(recipe) { + const itemOptions = [...state.book.items].sort((a, b) => a.name.localeCompare(b.name, "zh-CN")); + return (recipe.inputs || []).map((entry, index) => `
+
+ + + + +
+
`).join("") || `

没有物品输入;这通常表示世界采集或环境生成。

`; +} + +function renderOutputRows(recipe) { + const itemOptions = [...state.book.items].sort((a, b) => a.name.localeCompare(b.name, "zh-CN")); + return (recipe.outputs || []).map((entry, index) => `
+
+ + + +
+
+ + + + +
+
`).join("") || `

至少需要一项产出,校验会阻止空产出配方被保存。

`; +} + +function renderRecipeInspector(recipe) { + const machine = state.book.machines.find((entry) => entry.id === recipe.machineId); + const rate = primaryRatePerMinute(recipe, machine); + const consumed = (recipe.inputs || []).filter((entry) => entry.mode !== "catalyst").reduce((sum, entry) => sum + Number(entry.amount || 0), 0); + return `${commonFields(recipe)} +
+

制作规则

+
+ + + + + + + +
+
+
+

输入 (${(recipe.inputs || []).length})

+ ${renderInputRows(recipe)} +
+
+

产出 (${(recipe.outputs || []).length})

+ ${renderOutputRows(recipe)} +
+
+

仪式与策划说明

+
+ + + +
+
+
+

即时估算

+
${rate.toFixed(1)}主产物 / 分
${consumed.toFixed(1)}每批消耗量
${Number(recipe.entropy || 0).toFixed(1)}每批熵增
+
+ + ${entityActions("recipes", true)}`; +} + +function renderMachineInspector(machine) { + const recipes = state.book.recipes.filter((entry) => entry.machineId === machine.id); + return `${commonFields(machine)} +
+

设施属性

+
+ + + +
+
+
+

承载配方 (${recipes.length})

+ ${linkButtons("recipes", recipes)} +
+ ${entityActions("machines")}`; +} + +function entityActions(type, canDuplicate = false) { + return `
+ ${canDuplicate ? `` : ""} + +
`; +} + +function renderInspector() { + const entity = selectedEntity(); + if (!entity) { + elements.inspectorTitle.textContent = "选择一个条目"; + elements.inspectorKind.textContent = "—"; + elements.inspectorContent.innerHTML = `

从左侧目录或中央配方树选择一个条目。

`; + return; + } + elements.inspectorTitle.textContent = entity.name; + elements.inspectorKind.textContent = TYPE_META[state.selected.type].label; + if (state.selected.type === "items") elements.inspectorContent.innerHTML = renderItemInspector(entity); + else if (state.selected.type === "recipes") elements.inspectorContent.innerHTML = renderRecipeInspector(entity); + else elements.inspectorContent.innerHTML = renderMachineInspector(entity); +} + +function focusGraphLayout(graph) { + const nodeMap = new Map(graph.nodes.map((node) => [node.key, node])); + const adjacency = new Map(graph.nodes.map((node) => [node.key, []])); + for (const edge of graph.edges) { + adjacency.get(edge.source)?.push({ key: edge.target, delta: 1 }); + adjacency.get(edge.target)?.push({ key: edge.source, delta: -1 }); + } + const selectedKey = `${state.selected.type}:${state.selected.id}`; + const ranks = new Map([[selectedKey, 0]]); + const queue = [selectedKey]; + while (queue.length) { + const key = queue.shift(); + for (const neighbor of adjacency.get(key) || []) { + if (!ranks.has(neighbor.key)) { + ranks.set(neighbor.key, ranks.get(key) + neighbor.delta); + queue.push(neighbor.key); + } + } + } + for (const node of graph.nodes) if (!ranks.has(node.key)) ranks.set(node.key, 0); + const rankValues = [...new Set(ranks.values())].sort((a, b) => a - b); + const columns = new Map(rankValues.map((rank) => [rank, graph.nodes.filter((node) => ranks.get(node.key) === rank)])); + const stageOrder = new Map(state.book.stages.map((entry) => [entry.id, entry.order])); + for (const column of columns.values()) column.sort((a, b) => (stageOrder.get(a.stage) ?? 99) - (stageOrder.get(b.stage) ?? 99) || a.label.localeCompare(b.label, "zh-CN")); + const maxRows = Math.max(1, ...[...columns.values()].map((column) => column.length)); + const columnWidth = 236; + const rowHeight = 76; + const positions = new Map(); + const bands = []; + rankValues.forEach((rank, columnIndex) => { + const column = columns.get(rank); + const x = columnIndex * columnWidth; + const yOffset = (maxRows - column.length) * rowHeight / 2; + column.forEach((node, rowIndex) => { + const isRecipe = node.type === "recipes"; + positions.set(node.key, { x: x + 22, y: 54 + yOffset + rowIndex * rowHeight, width: isRecipe ? 188 : 174, height: isRecipe ? 62 : 54 }); + }); + bands.push({ + x, + width: columnWidth - 10, + height: maxRows * rowHeight + 100, + label: rank < 0 ? `上游 ${Math.abs(rank)}` : rank > 0 ? `下游 ${rank}` : "当前选择", + }); + }); + return { positions, bands, width: Math.max(rankValues.length * columnWidth, 400), height: maxRows * rowHeight + 100 }; +} + +function stagedGraphLayout(graph) { + const stages = new Map(state.book.stages.map((entry) => [entry.id, entry])); + const stageIds = [...new Set(graph.nodes.map((node) => node.stage))].sort((a, b) => (stages.get(a)?.order ?? 99) - (stages.get(b)?.order ?? 99)); + const positions = new Map(); + const bands = []; + const bandWidth = 670; + let maxHeight = 280; + + stageIds.forEach((stageId, stageIndex) => { + const stageNodes = graph.nodes.filter((node) => node.stage === stageId); + const recipes = stageNodes.filter((node) => node.type === "recipes"); + const machines = stageNodes.filter((node) => node.type === "machines"); + const items = stageNodes.filter((node) => node.type === "items"); + const itemConnections = new Map(items.map((item) => [item.key, { in: 0, out: 0 }])); + graph.edges.forEach((edge) => { + if (itemConnections.has(edge.source)) itemConnections.get(edge.source).out += 1; + if (itemConnections.has(edge.target)) itemConnections.get(edge.target).in += 1; + }); + const leftItems = items.filter((item) => itemConnections.get(item.key)?.out > 0); + const rightItems = items.filter((item) => !leftItems.includes(item)); + const x = stageIndex * bandWidth; + leftItems.forEach((node, index) => positions.set(node.key, { x: x + 28, y: 60 + index * 72, width: 174, height: 54 })); + recipes.forEach((node, index) => positions.set(node.key, { x: x + 240, y: 60 + index * 82, width: 188, height: 62 })); + rightItems.forEach((node, index) => positions.set(node.key, { x: x + 466, y: 60 + index * 72, width: 174, height: 54 })); + machines.forEach((node, index) => positions.set(node.key, { x: x + 240, y: 74 + recipes.length * 82 + index * 70, width: 188, height: 54 })); + const rows = Math.max(leftItems.length * 72, recipes.length * 82 + machines.length * 70, rightItems.length * 72, 190); + const height = rows + 110; + maxHeight = Math.max(maxHeight, height); + bands.push({ x, width: bandWidth - 16, height, label: stages.get(stageId)?.name || stageId }); + }); + return { positions, bands, width: Math.max(stageIds.length * bandWidth, 400), height: maxHeight }; +} + +function graphLayout(graph) { + return state.graphMode === "focus" ? focusGraphLayout(graph) : stagedGraphLayout(graph); +} + +function edgePath(source, target) { + const sourceCenter = source.x + source.width / 2; + const targetCenter = target.x + target.width / 2; + const forward = sourceCenter <= targetCenter; + const sx = forward ? source.x + source.width : source.x; + const tx = forward ? target.x : target.x + target.width; + const sy = source.y + source.height / 2; + const ty = target.y + target.height / 2; + const bend = Math.max(55, Math.abs(tx - sx) * .44); + const c1 = forward ? sx + bend : sx - bend; + const c2 = forward ? tx - bend : tx + bend; + return { d: `M ${sx} ${sy} C ${c1} ${sy}, ${c2} ${ty}, ${tx} ${ty}`, mx: (sx + tx) / 2, my: (sy + ty) / 2 }; +} + +function renderGraph() { + const entity = selectedEntity(); + const graph = buildGraph(state.book, { + mode: state.graphMode, + depth: state.graphDepth, + selection: state.selected, + stage: state.stage, + biome: state.biome, + }); + const layout = graphLayout(graph); + state.graphBounds = { x: 0, y: 0, width: layout.width, height: layout.height }; + elements.graphEmpty.hidden = graph.nodes.length > 0; + elements.depthControl.classList.toggle("is-disabled", state.graphMode === "full"); + elements.graphMode.querySelectorAll("button").forEach((button) => button.classList.toggle("active", button.dataset.mode === state.graphMode)); + elements.graphTitle.textContent = entity ? entity.name : "配方树"; + elements.graphSubtitle.textContent = state.graphMode === "focus" ? `显示选中条目前后 ${state.graphDepth} 层关系` : `显示当前筛选下的全部关系(${graph.nodes.length} 个节点)`; + + elements.graphBackdrop.innerHTML = layout.bands.map((band) => `${escapeHtml(band.label)}`).join(""); + elements.graphEdges.innerHTML = graph.edges.map((edge) => { + const source = layout.positions.get(edge.source); + const target = layout.positions.get(edge.target); + if (!source || !target) return ""; + const path = edgePath(source, target); + const amount = Number(edge.amount); + return `${Number.isFinite(amount) ? `×${amount}` : ""}`; + }).join(""); + elements.graphNodes.innerHTML = graph.nodes.map((node) => { + const position = layout.positions.get(node.key); + if (!position) return ""; + const singular = TYPE_META[node.type]?.singular || "item"; + const selected = state.selected.type === node.type && state.selected.id === node.id; + return ` + + ${TYPE_META[node.type]?.glyph || "◆"} + ${escapeHtml(short(node.label, 20))} + ${escapeHtml(short(node.subtitle, 29))} + `; + }).join(""); + + const critical = traceIngredientClosure(state.book, "first_warp_record"); + const selectedSummary = entity ? `${TYPE_META[state.selected.type].label}“${entity.name}”` : "未选择条目"; + elements.routeSummary.textContent = `${selectedSummary} · 首次折跃主线 ${critical.items.length} 种物品 / ${critical.recipes.length} 道配方 / ${critical.missing.length} 处断点`; + updateGraphTransform(); + if (state.graphNeedsFit) { + state.graphNeedsFit = false; + requestAnimationFrame(fitGraph); + } +} + +function updateGraphTransform() { + const { x, y, scale } = state.graphTransform; + elements.graphViewport.setAttribute("transform", `translate(${x} ${y}) scale(${scale})`); + elements.zoomOutput.value = `${Math.round(scale * 100)}%`; + elements.zoomOutput.textContent = `${Math.round(scale * 100)}%`; +} + +function fitGraph() { + const bounds = state.graphBounds; + const rect = elements.graph.getBoundingClientRect(); + if (!bounds || rect.width < 20 || rect.height < 20) return; + const padding = 44; + const scale = Math.min(1.1, Math.max(.12, Math.min((rect.width - padding * 2) / bounds.width, (rect.height - padding * 2) / bounds.height))); + state.graphTransform = { + scale, + x: (rect.width - bounds.width * scale) / 2 - bounds.x * scale, + y: (rect.height - bounds.height * scale) / 2 - bounds.y * scale, + }; + updateGraphTransform(); +} + +function zoomGraph(factor, clientX, clientY) { + const rect = elements.graph.getBoundingClientRect(); + const px = clientX == null ? rect.width / 2 : clientX - rect.left; + const py = clientY == null ? rect.height / 2 : clientY - rect.top; + const previous = state.graphTransform.scale; + const next = Math.min(2.2, Math.max(.12, previous * factor)); + const worldX = (px - state.graphTransform.x) / previous; + const worldY = (py - state.graphTransform.y) / previous; + state.graphTransform.x = px - worldX * next; + state.graphTransform.y = py - worldY * next; + state.graphTransform.scale = next; + updateGraphTransform(); +} + +function renderIssues() { + const errors = state.issues.filter((entry) => entry.severity === "error").length; + const warnings = state.issues.filter((entry) => entry.severity === "warning").length; + const info = state.issues.filter((entry) => entry.severity === "info").length; + elements.issuesSummary.textContent = `${errors} 个错误 · ${warnings} 个警告 · ${info} 条提示`; + elements.issueFilter.querySelectorAll("button").forEach((button) => button.classList.toggle("active", button.dataset.severity === state.issueSeverity)); + const issues = state.issues.filter((entry) => state.issueSeverity === "all" || entry.severity === state.issueSeverity); + elements.issueList.innerHTML = issues.length ? issues.map((entry) => ``).join("") : `
✓ 当前筛选下没有问题
`; +} + +function refreshAll() { + ensureSelection(); + validate(); + renderStatus(); + renderCatalog(); + renderInspector(); + renderGraph(); + renderIssues(); +} + +function selectEntity(type, id, { switchTab = false, fitGraph = true } = {}) { + if (!state.book?.[type]?.some((entry) => entry.id === id)) return; + state.selected = { type, id }; + if (switchTab) state.activeType = type; + state.graphNeedsFit ||= fitGraph; + renderCatalog(); + renderInspector(); + renderGraph(); +} + +function uniqueId(prefix, collection) { + let suffix = 1; + let candidate = `${prefix}_${suffix}`; + const ids = new Set(collection.map((entry) => entry.id)); + while (ids.has(candidate)) candidate = `${prefix}_${++suffix}`; + return candidate; +} + +function addEntity() { + const type = state.activeType; + const stage = state.stage !== "all" ? state.stage : state.book.stages[0]?.id; + const biome = state.biome !== "all" ? state.biome : state.book.biomes[0]?.id; + let entity; + if (type === "items") { + entity = { id: uniqueId("new_item", state.book.items), name: "新物品", category: "material", stage, biome, mass: 1, stackSize: 100, isRaw: false, tags: [], notes: "" }; + } else if (type === "machines") { + entity = { id: uniqueId("new_machine", state.book.machines), name: "新设施", stage, biome, baseSpeed: 1, tags: [], description: "" }; + } else { + entity = { id: uniqueId("new_recipe", state.book.recipes), name: "新配方", stage, biome, machineId: state.book.machines[0]?.id || "", kind: "craft", duration: 1, unlockedBy: "", inputs: [], outputs: state.book.items[0] ? [{ itemId: state.book.items[0].id, amount: 1 }] : [], manaPerSecond: 0, entropy: 0, conditions: [], tags: [], notes: "", enabled: true }; + } + mutate(`新增${TYPE_META[type].label}`, (book) => book[type].push(entity), { fitGraph: true }); + selectEntity(type, entity.id, { switchTab: true }); + toast(`已新增${TYPE_META[type].label},请填写右侧属性。`); +} + +function renameSelected(nextId) { + const entity = selectedEntity(); + const type = state.selected.type; + const previousId = entity.id; + const clean = nextId.trim(); + if (clean === previousId) return; + if (!/^[a-z][a-z0-9_]*$/.test(clean)) { + toast("ID 只能使用小写字母、数字和下划线,并以字母开头。", "error", 4500); + renderInspector(); + return; + } + if (state.book[type].some((entry) => entry.id === clean)) { + toast(`ID “${clean}” 已存在。`, "error"); + renderInspector(); + return; + } + const affected = type === "items" + ? state.book.recipes.reduce((count, recipe) => count + [...(recipe.inputs || []), ...(recipe.outputs || [])].filter((entry) => entry.itemId === previousId).length, 0) + : type === "machines" ? state.book.recipes.filter((recipe) => recipe.machineId === previousId).length : 0; + if (affected && !window.confirm(`这会同步修改 ${affected} 处配方引用。继续将 ${previousId} 改为 ${clean}?`)) { + renderInspector(); + return; + } + mutate(`重命名 ${previousId}`, (book) => { + book[type].find((entry) => entry.id === previousId).id = clean; + if (type === "items") { + for (const recipe of book.recipes) for (const entry of [...(recipe.inputs || []), ...(recipe.outputs || [])]) if (entry.itemId === previousId) entry.itemId = clean; + } + if (type === "machines") for (const recipe of book.recipes) if (recipe.machineId === previousId) recipe.machineId = clean; + state.selected.id = clean; + }, { fitGraph: true }); + toast(`已更新 ID,并同步 ${affected} 处引用。`); +} + +function duplicateRecipe() { + const recipe = selectedEntity(); + if (!recipe || state.selected.type !== "recipes") return; + const copy = cloneBook(recipe); + copy.id = uniqueId(`${recipe.id}_copy`, state.book.recipes); + copy.name = `${recipe.name}(副本)`; + mutate(`复制配方 ${recipe.name}`, (book) => book.recipes.push(copy), { fitGraph: true }); + selectEntity("recipes", copy.id, { switchTab: true }); +} + +function deleteSelected() { + const entity = selectedEntity(); + const type = state.selected.type; + if (!entity) return; + const index = makeIndex(state.book); + if (type === "items") { + const references = (index.producers.get(entity.id)?.length || 0) + (index.consumers.get(entity.id)?.length || 0); + if (references) return toast(`不能删除:仍有 ${references} 道配方引用这个物品。请先改接配方。`, "error", 5000); + } + if (type === "machines") { + const references = state.book.recipes.filter((recipe) => recipe.machineId === entity.id).length; + if (references) return toast(`不能删除:仍有 ${references} 道配方使用这个设施。请先更换设施。`, "error", 5000); + } + if (!window.confirm(`确认删除${TYPE_META[type].label}“${entity.name}”?可以用撤销恢复。`)) return; + mutate(`删除${TYPE_META[type].label} ${entity.name}`, (book) => { + const position = book[type].findIndex((entry) => entry.id === entity.id); + book[type].splice(position, 1); + const fallback = book[type][Math.min(position, book[type].length - 1)]; + state.selected = fallback ? { type, id: fallback.id } : { type: "recipes", id: book.recipes[0]?.id || "" }; + }, { fitGraph: true }); +} + +function changeEntityField(target) { + const entity = selectedEntity(); + if (!entity) return; + const field = target.dataset.field; + let value; + if (target.type === "checkbox") value = target.checked; + else if (target.dataset.array) value = parseLines(target.value); + else if (target.type === "number") value = numberFromInput(target); + else value = target.value; + if (JSON.stringify(entity[field]) === JSON.stringify(value)) return; + mutate(`修改 ${entity.name} / ${field}`, () => { selectedEntity()[field] = value; }); +} + +function changeIoField(target) { + const recipe = selectedEntity(); + if (!recipe || state.selected.type !== "recipes") return; + const side = target.dataset.io; + const index = Number(target.dataset.index); + const key = target.dataset.key; + const entry = recipe[side]?.[index]; + if (!entry) return; + let value = target.type === "number" ? numberFromInput(target, target.hasAttribute("data-nullable")) : target.value; + mutate(`修改 ${recipe.name} / ${side}`, () => { + const current = selectedEntity()[side][index]; + if (value == null) delete current[key]; + else current[key] = value; + }); +} + +function isLiveInput(target) { + return target.matches('input[type="text"], input[type="number"], textarea') && !target.matches('[data-action="rename-id"]'); +} + +function beginLiveEdit(target) { + if (!isLiveInput(target)) return; + const editKey = [state.selected.type, state.selected.id, target.dataset.field, target.dataset.io, target.dataset.index, target.dataset.key].join(":"); + if (state.pendingEdit?.key === editKey) return; + state.pendingEdit = null; + const entity = selectedEntity(); + if (!entity) return; + const label = `修改 ${entity.name} / ${target.dataset.field || target.dataset.io || "字段"}`; + state.history.push({ label, book: cloneBook(state.book), selected: { ...state.selected } }); + if (state.history.length > MAX_HISTORY) state.history.shift(); + state.future.length = 0; + state.pendingEdit = { key: editKey, label }; +} + +function applyLiveInput(target) { + if (!isLiveInput(target)) return; + const entity = selectedEntity(); + if (!entity) return; + if (target.dataset.io) { + const entry = entity[target.dataset.io]?.[Number(target.dataset.index)]; + if (!entry) return; + const value = target.type === "number" ? numberFromInput(target, target.hasAttribute("data-nullable")) : target.value; + if ((value == null && entry[target.dataset.key] == null) || JSON.stringify(entry[target.dataset.key]) === JSON.stringify(value)) return; + beginLiveEdit(target); + if (value == null) delete entry[target.dataset.key]; + else entry[target.dataset.key] = value; + } else if (target.dataset.field) { + let value; + if (target.dataset.array) value = parseLines(target.value); + else if (target.type === "number") value = numberFromInput(target); + else value = target.value; + if (JSON.stringify(entity[target.dataset.field]) === JSON.stringify(value)) return; + beginLiveEdit(target); + entity[target.dataset.field] = value; + } + state.book.metadata ||= {}; + state.book.metadata.updatedAt = new Date().toISOString(); + updateDirty(); + validate(); + renderStatus(); + if (["name", "tags"].includes(target.dataset.field)) renderCatalog(); + renderGraph(); + renderIssues(); +} + +function finalizeLiveEdit() { + if (!state.pendingEdit) return; + state.pendingEdit = null; + renderStatus(); +} + +function addIo(side) { + const recipe = selectedEntity(); + const firstItem = state.book.items[0]; + if (!recipe || state.selected.type !== "recipes" || !firstItem) return; + mutate(`为 ${recipe.name} 添加${side === "inputs" ? "输入" : "产出"}`, () => { + if (side === "inputs") selectedEntity().inputs.push({ itemId: firstItem.id, amount: 1, mode: "consumed" }); + else selectedEntity().outputs.push({ itemId: firstItem.id, amount: 1 }); + }, { fitGraph: true }); +} + +function deleteIo(side, index) { + const recipe = selectedEntity(); + if (!recipe || state.selected.type !== "recipes") return; + mutate(`删除 ${recipe.name} 的${side === "inputs" ? "输入" : "产出"}`, () => selectedEntity()[side].splice(index, 1), { fitGraph: true }); +} + +function downloadBook() { + const blob = new Blob([`${JSON.stringify(state.book, null, 2)}\n`], { type: "application/json" }); + const url = URL.createObjectURL(blob); + const anchor = document.createElement("a"); + anchor.href = url; + anchor.download = `recipe-book_${slugTime()}.json`; + anchor.click(); + URL.revokeObjectURL(url); + toast("已导出 JSON;导出不会清除“未保存”状态。", "success", 4000); +} + +async function saveBook() { + finalizeLiveEdit(); + const issues = validate(); + const errors = issues.filter((entry) => entry.severity === "error"); + if (errors.length) { + renderIssues(); + elements.issuesDialog.showModal(); + return toast(`有 ${errors.length} 个错误,修复后才能保存。`, "error", 5000); + } + if (!state.serverOnline) { + downloadBook(); + return toast("本地保存服务未连接,已改为导出。请用启动器打开工具以直接写回项目。", "warning", 6500); + } + state.saving = true; + renderStatus(); + try { + const response = await fetch("/api/book", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(state.book) }); + const result = await response.json().catch(() => ({})); + if (!response.ok) throw new Error(result.message || `保存失败(HTTP ${response.status})`); + state.savedBookJson = JSON.stringify(state.book); + state.dirty = false; + state.history.length = 0; + state.future.length = 0; + localStorage.removeItem(DRAFT_KEY); + toast(`已写回项目,并生成备份 ${result.backup || ""}`.trim(), "success", 4500); + } catch (error) { + state.serverOnline = false; + toast(`${error.message}。数据仍保留在浏览器草稿中。`, "error", 6000); + } finally { + state.saving = false; + renderStatus(); + } +} + +async function importBook(file) { + try { + const imported = JSON.parse(await file.text()); + const issues = validateBook(imported, { technologyIds: state.technologyIds }); + const errors = issues.filter((entry) => entry.severity === "error"); + if (errors.length) throw new Error(`文件有 ${errors.length} 个结构错误:${errors[0].message}`); + state.history.push({ label: "导入数据", book: cloneBook(state.book), selected: { ...state.selected } }); + state.future.length = 0; + state.book = imported; + updateDirty(); + state.selected = imported.recipes.some((entry) => entry.id === "perform_first_warp") ? { type: "recipes", id: "perform_first_warp" } : { type: "recipes", id: imported.recipes[0]?.id || "" }; + state.activeType = state.selected.type; + state.graphNeedsFit = true; + renderFilters(); + refreshAll(); + toast(`已导入 ${file.name},请确认后点击“保存数据”。`, "success", 4500); + } catch (error) { + toast(`导入失败:${error.message}`, "error", 6500); + } finally { + elements.importFile.value = ""; + } +} + +async function loadTechnologyIds() { + try { + const response = await fetch("../../docs/tech-tree-nodes-v0.2.csv", { cache: "no-store" }); + if (!response.ok) return; + const text = await response.text(); + state.technologyIds = new Set(text.split(/\r?\n/).slice(1).map((line) => line.split(",", 1)[0].trim()).filter(Boolean)); + } catch { + state.technologyIds = null; + } +} + +async function loadInitialBook() { + let book; + try { + const response = await fetch("/api/book", { cache: "no-store" }); + if (!response.ok) throw new Error("API unavailable"); + book = await response.json(); + state.serverOnline = true; + } catch { + try { + const response = await fetch("../../data/recipe-book.json", { cache: "no-store" }); + if (!response.ok) throw new Error("file unavailable"); + book = await response.json(); + } catch { + elements.app.setAttribute("aria-busy", "false"); + elements.saveState.className = "save-state offline"; + elements.saveState.querySelector("span").textContent = "等待导入数据"; + elements.importFile.click(); + toast("无法自动读取配方书。请选择 data/recipe-book.json。", "warning", 8000); + return; + } + } + + await loadTechnologyIds(); + state.book = book; + state.savedBookJson = JSON.stringify(book); + try { + const draft = JSON.parse(localStorage.getItem(DRAFT_KEY) || "null"); + const draftTime = Date.parse(draft?.book?.metadata?.updatedAt || draft?.savedAt || 0); + const bookTime = Date.parse(book?.metadata?.updatedAt || 0); + if (draft?.book && draftTime > bookTime && window.confirm("检测到比项目文件更新的浏览器草稿。要恢复尚未保存的修改吗?")) { + state.book = draft.book; + updateDirty(); + toast("已恢复浏览器草稿;确认无误后请保存到项目。", "warning", 5500); + } + } catch { + localStorage.removeItem(DRAFT_KEY); + } + renderFilters(); + refreshAll(); + elements.app.setAttribute("aria-busy", "false"); +} + +elements.typeTabs.addEventListener("click", (event) => { + const button = event.target.closest("button[data-type]"); + if (!button) return; + state.activeType = button.dataset.type; + const current = state.book[state.activeType].find((entry) => entry.id === state.selected.id); + if (!current) { + const first = state.book[state.activeType][0]; + if (first) state.selected = { type: state.activeType, id: first.id }; + } + state.graphNeedsFit = true; + refreshAll(); +}); + +elements.entityList.addEventListener("click", (event) => { + const row = event.target.closest(".entity-row"); + if (row) selectEntity(row.dataset.type, row.dataset.id); +}); + +elements.catalogSearch.addEventListener("input", (event) => { state.search = event.target.value; renderCatalog(); }); +elements.stageFilter.addEventListener("change", (event) => { state.stage = event.target.value; state.graphNeedsFit = true; renderCatalog(); renderGraph(); }); +elements.biomeFilter.addEventListener("change", (event) => { state.biome = event.target.value; state.graphNeedsFit = true; renderCatalog(); renderGraph(); }); +elements.addEntityButton.addEventListener("click", addEntity); + +elements.inspectorContent.addEventListener("change", (event) => { + const target = event.target; + if (target.matches('[data-action="rename-id"]')) renameSelected(target.value); + else if (isLiveInput(target)) finalizeLiveEdit(); + else if (target.dataset.io) changeIoField(target); + else if (target.dataset.field) changeEntityField(target); +}); +elements.inspectorContent.addEventListener("input", (event) => applyLiveInput(event.target)); +elements.inspectorContent.addEventListener("focusout", (event) => { if (isLiveInput(event.target)) finalizeLiveEdit(); }); + +elements.inspectorContent.addEventListener("click", (event) => { + const button = event.target.closest("button[data-action]"); + if (!button) return; + const action = button.dataset.action; + if (action === "navigate") selectEntity(button.dataset.type, button.dataset.id, { switchTab: true }); + else if (action === "add-io") addIo(button.dataset.side); + else if (action === "delete-io") deleteIo(button.dataset.side, Number(button.dataset.index)); + else if (action === "duplicate") duplicateRecipe(); + else if (action === "delete-entity") deleteSelected(); + else if (action === "help") elements.helpDialog.showModal(); +}); + +elements.graphMode.addEventListener("click", (event) => { + const button = event.target.closest("button[data-mode]"); + if (!button) return; + state.graphMode = button.dataset.mode; + state.graphNeedsFit = true; + renderGraph(); +}); +elements.graphDepth.addEventListener("change", (event) => { state.graphDepth = Number(event.target.value); state.graphNeedsFit = true; renderGraph(); }); +elements.fitGraphButton.addEventListener("click", fitGraph); +elements.zoomInButton.addEventListener("click", () => zoomGraph(1.2)); +elements.zoomOutButton.addEventListener("click", () => zoomGraph(1 / 1.2)); + +let drag = null; +elements.graph.addEventListener("pointerdown", (event) => { + if (event.button !== 0) return; + drag = { pointerId: event.pointerId, startX: event.clientX, startY: event.clientY, originX: state.graphTransform.x, originY: state.graphTransform.y, moved: false, target: event.target.closest(".graph-node") }; + elements.graph.setPointerCapture(event.pointerId); + elements.graph.classList.add("dragging"); +}); +elements.graph.addEventListener("pointermove", (event) => { + if (!drag || drag.pointerId !== event.pointerId) return; + const dx = event.clientX - drag.startX; + const dy = event.clientY - drag.startY; + if (Math.abs(dx) + Math.abs(dy) > 5) drag.moved = true; + if (drag.moved) { + state.graphTransform.x = drag.originX + dx; + state.graphTransform.y = drag.originY + dy; + updateGraphTransform(); + } +}); +elements.graph.addEventListener("pointerup", (event) => { + if (!drag || drag.pointerId !== event.pointerId) return; + if (!drag.moved && drag.target) selectEntity(drag.target.dataset.type, drag.target.dataset.id, { switchTab: true, fitGraph: false }); + drag = null; + elements.graph.classList.remove("dragging"); +}); +elements.graph.addEventListener("wheel", (event) => { event.preventDefault(); zoomGraph(event.deltaY < 0 ? 1.12 : 1 / 1.12, event.clientX, event.clientY); }, { passive: false }); + +elements.undoButton.addEventListener("click", () => { finalizeLiveEdit(); undo(); }); +elements.redoButton.addEventListener("click", () => { finalizeLiveEdit(); redo(); }); +elements.importButton.addEventListener("click", () => elements.importFile.click()); +elements.importFile.addEventListener("change", () => { if (elements.importFile.files[0]) importBook(elements.importFile.files[0]); }); +elements.exportButton.addEventListener("click", downloadBook); +elements.saveButton.addEventListener("click", saveBook); +elements.issuesButton.addEventListener("click", () => { renderIssues(); elements.issuesDialog.showModal(); }); +elements.issueFilter.addEventListener("click", (event) => { + const button = event.target.closest("button[data-severity]"); + if (!button) return; + state.issueSeverity = button.dataset.severity; + renderIssues(); +}); +elements.issueList.addEventListener("click", (event) => { + const row = event.target.closest(".issue-row"); + if (!row || !TYPE_META[row.dataset.type] || !row.dataset.id) return; + elements.issuesDialog.close(); + selectEntity(row.dataset.type, row.dataset.id, { switchTab: true }); +}); + +window.addEventListener("keydown", (event) => { + const modifier = event.ctrlKey || event.metaKey; + if (modifier && event.key.toLowerCase() === "s") { event.preventDefault(); finalizeLiveEdit(); saveBook(); } + else if (modifier && event.key.toLowerCase() === "z" && !event.shiftKey) { event.preventDefault(); finalizeLiveEdit(); undo(); } + else if (modifier && (event.key.toLowerCase() === "y" || (event.key.toLowerCase() === "z" && event.shiftKey))) { event.preventDefault(); finalizeLiveEdit(); redo(); } + else if (!modifier && event.key === "/" && !["INPUT", "TEXTAREA", "SELECT"].includes(document.activeElement?.tagName)) { event.preventDefault(); elements.catalogSearch.focus(); } +}); +window.addEventListener("beforeunload", (event) => { if (state.dirty) { event.preventDefault(); event.returnValue = ""; } }); +window.addEventListener("resize", () => { if (state.graphBounds) fitGraph(); }); + +loadInitialBook(); diff --git a/tools/recipe-tree-editor/core.mjs b/tools/recipe-tree-editor/core.mjs new file mode 100644 index 0000000..eec7fb7 --- /dev/null +++ b/tools/recipe-tree-editor/core.mjs @@ -0,0 +1,367 @@ +export const ENTITY_TYPES = ["recipes", "items", "machines"]; + +export function cloneBook(value) { + return JSON.parse(JSON.stringify(value)); +} + +export function makeIndex(book) { + const index = { + stages: new Map(), + biomes: new Map(), + machines: new Map(), + items: new Map(), + recipes: new Map(), + producers: new Map(), + consumers: new Map(), + }; + for (const stage of book.stages || []) index.stages.set(stage.id, stage); + for (const biome of book.biomes || []) index.biomes.set(biome.id, biome); + for (const machine of book.machines || []) index.machines.set(machine.id, machine); + for (const item of book.items || []) index.items.set(item.id, item); + for (const recipe of book.recipes || []) { + index.recipes.set(recipe.id, recipe); + for (const input of recipe.inputs || []) { + if (!index.consumers.has(input.itemId)) index.consumers.set(input.itemId, []); + index.consumers.get(input.itemId).push(recipe); + } + for (const output of recipe.outputs || []) { + if (!index.producers.has(output.itemId)) index.producers.set(output.itemId, []); + index.producers.get(output.itemId).push(recipe); + } + } + return index; +} + +function issue(severity, code, message, entityType = "book", entityId = "") { + return { severity, code, message, entityType, entityId }; +} + +function duplicateIssues(collection, entityType) { + const seen = new Set(); + const issues = []; + for (const entity of collection || []) { + if (!entity.id) { + issues.push(issue("error", "missing_id", `${entityType} 中存在空 ID。`, entityType)); + } else if (seen.has(entity.id)) { + issues.push(issue("error", "duplicate_id", `ID “${entity.id}” 重复。`, entityType, entity.id)); + } + seen.add(entity.id); + } + return issues; +} + +function dependencyCycles(book) { + const adjacency = new Map(); + const recipesByPair = new Map(); + for (const item of book.items || []) adjacency.set(item.id, new Set()); + for (const recipe of (book.recipes || []).filter((entry) => entry.enabled !== false)) { + for (const input of recipe.inputs || []) { + for (const output of recipe.outputs || []) { + if (!adjacency.has(input.itemId)) adjacency.set(input.itemId, new Set()); + adjacency.get(input.itemId).add(output.itemId); + recipesByPair.set(`${input.itemId}>${output.itemId}`, recipe); + } + } + } + + let nextIndex = 0; + const stack = []; + const indices = new Map(); + const lowLinks = new Map(); + const onStack = new Set(); + const components = []; + + function visit(id) { + indices.set(id, nextIndex); + lowLinks.set(id, nextIndex); + nextIndex += 1; + stack.push(id); + onStack.add(id); + + for (const neighbor of adjacency.get(id) || []) { + if (!indices.has(neighbor)) { + visit(neighbor); + lowLinks.set(id, Math.min(lowLinks.get(id), lowLinks.get(neighbor))); + } else if (onStack.has(neighbor)) { + lowLinks.set(id, Math.min(lowLinks.get(id), indices.get(neighbor))); + } + } + + if (lowLinks.get(id) === indices.get(id)) { + const component = []; + let member; + do { + member = stack.pop(); + onStack.delete(member); + component.push(member); + } while (member !== id); + const selfLoop = component.length === 1 && (adjacency.get(component[0]) || new Set()).has(component[0]); + if (component.length > 1 || selfLoop) components.push(component); + } + } + + for (const id of adjacency.keys()) if (!indices.has(id)) visit(id); + + return components.map((items) => { + const recipes = new Set(); + for (const from of items) { + for (const to of adjacency.get(from) || []) { + if (items.includes(to)) recipes.add(recipesByPair.get(`${from}>${to}`)); + } + } + return { items, recipes: [...recipes].filter(Boolean) }; + }); +} + +export function validateBook(book, context = {}) { + const issues = []; + if (!book || typeof book !== "object") return [issue("error", "invalid_book", "数据不是有效对象。")]; + if (book.schemaVersion !== 1) issues.push(issue("error", "schema_version", "schemaVersion 必须为 1。")); + for (const [type, collection] of [["stages", book.stages], ["biomes", book.biomes], ["machines", book.machines], ["items", book.items], ["recipes", book.recipes]]) { + if (!Array.isArray(collection)) issues.push(issue("error", "missing_collection", `缺少 ${type} 数组。`)); + else issues.push(...duplicateIssues(collection, type)); + } + if (issues.some((entry) => entry.code === "missing_collection")) return issues; + + const index = makeIndex(book); + const idPattern = /^[a-z][a-z0-9_]*$/; + for (const type of ["machines", "items", "recipes"]) { + for (const entity of book[type]) { + if (entity.id && !idPattern.test(entity.id)) { + issues.push(issue("error", "invalid_id", `ID “${entity.id}” 只能使用小写字母、数字和下划线。`, type, entity.id)); + } + if (!String(entity.name || "").trim()) issues.push(issue("error", "missing_name", "名称不能为空。", type, entity.id)); + } + } + + for (const item of book.items) { + if (!index.stages.has(item.stage)) issues.push(issue("error", "missing_stage", `物品引用未知阶段 “${item.stage}”。`, "items", item.id)); + if (!index.biomes.has(item.biome)) issues.push(issue("error", "missing_biome", `物品引用未知生态区 “${item.biome}”。`, "items", item.id)); + if (!(Number(item.mass) > 0)) issues.push(issue("error", "invalid_mass", "物品质量必须大于 0。", "items", item.id)); + if (!(Number(item.stackSize) >= 1)) issues.push(issue("error", "invalid_stack", "堆叠数量必须至少为 1。", "items", item.id)); + } + + for (const machine of book.machines) { + if (!index.stages.has(machine.stage)) issues.push(issue("error", "missing_stage", `机器引用未知阶段 “${machine.stage}”。`, "machines", machine.id)); + if (!index.biomes.has(machine.biome)) issues.push(issue("error", "missing_biome", `机器引用未知生态区 “${machine.biome}”。`, "machines", machine.id)); + if (!(Number(machine.baseSpeed) > 0)) issues.push(issue("error", "invalid_speed", "机器速度必须大于 0。", "machines", machine.id)); + } + + const technologyIds = context.technologyIds || null; + for (const recipe of book.recipes) { + if (!index.stages.has(recipe.stage)) issues.push(issue("error", "missing_stage", `配方引用未知阶段 “${recipe.stage}”。`, "recipes", recipe.id)); + if (!index.biomes.has(recipe.biome)) issues.push(issue("error", "missing_biome", `配方引用未知生态区 “${recipe.biome}”。`, "recipes", recipe.id)); + if (!index.machines.has(recipe.machineId)) issues.push(issue("error", "missing_machine", `配方引用未知机器 “${recipe.machineId}”。`, "recipes", recipe.id)); + if (!(Number(recipe.duration) > 0)) issues.push(issue("error", "invalid_duration", "制作时间必须大于 0。", "recipes", recipe.id)); + if (!Array.isArray(recipe.outputs) || recipe.outputs.length === 0) issues.push(issue("error", "no_outputs", "配方至少需要一个产出。", "recipes", recipe.id)); + if (technologyIds && recipe.unlockedBy && !technologyIds.has(recipe.unlockedBy) && recipe.unlockedBy !== "X00") { + issues.push(issue("warning", "unknown_technology", `解锁科技 “${recipe.unlockedBy}” 不在科技表中。`, "recipes", recipe.id)); + } + for (const [side, entries] of [["输入", recipe.inputs || []], ["输出", recipe.outputs || []]]) { + entries.forEach((entry, entryIndex) => { + if (!index.items.has(entry.itemId)) issues.push(issue("error", "missing_item", `${side} #${entryIndex + 1} 引用未知物品 “${entry.itemId}”。`, "recipes", recipe.id)); + if (side === "输入" && !(Number(entry.amount) > 0)) issues.push(issue("error", "invalid_amount", `${side} #${entryIndex + 1} 数量必须大于 0。`, "recipes", recipe.id)); + if (side === "输出" && !(Number(entry.amount) >= 0)) issues.push(issue("error", "invalid_amount", `${side} #${entryIndex + 1} 数量不能小于 0。`, "recipes", recipe.id)); + if (side === "输出" && entry.min != null && entry.max != null) { + if (Number(entry.min) > Number(entry.max)) issues.push(issue("error", "invalid_range", `${side} #${entryIndex + 1} 最小值大于最大值。`, "recipes", recipe.id)); + if (Number(entry.amount) < Number(entry.min) || Number(entry.amount) > Number(entry.max)) issues.push(issue("warning", "amount_outside_range", `${side} #${entryIndex + 1} 期望数量不在最小/最大范围内。`, "recipes", recipe.id)); + } + }); + } + + if (recipe.kind === "result_bag") { + const weighted = (recipe.outputs || []).filter((output) => output.weight != null); + if (weighted.length) { + const total = weighted.reduce((sum, output) => sum + Number(output.weight || 0), 0); + if (Math.abs(total - 100) > 0.001) issues.push(issue("error", "bag_weight", `结果袋权重合计为 ${total},必须等于 100。`, "recipes", recipe.id)); + } + const chanceOutputs = (recipe.outputs || []).filter((output) => output.chance != null); + if (chanceOutputs.length === (recipe.outputs || []).length && chanceOutputs.length) { + const total = chanceOutputs.reduce((sum, output) => sum + Number(output.chance || 0), 0); + if (Math.abs(total - 1) > 0.001) issues.push(issue("error", "chance_total", `概率产出合计为 ${total},必须等于 1。`, "recipes", recipe.id)); + } + } + } + + const stageOrder = new Map((book.stages || []).map((stage) => [stage.id, Number(stage.order)])); + for (const recipe of book.recipes) { + const recipeOrder = stageOrder.get(recipe.stage); + for (const input of recipe.inputs || []) { + const item = index.items.get(input.itemId); + if (item && recipeOrder != null && stageOrder.get(item.stage) > recipeOrder) { + issues.push(issue("warning", "future_input", `输入“${item.name}”来自更晚阶段。`, "recipes", recipe.id)); + } + } + } + + for (const item of book.items) { + const producers = index.producers.get(item.id) || []; + if (!item.isRaw && producers.length === 0 && !(item.tags || []).includes("system_generated")) { + issues.push(issue("warning", "no_producer", `非原料物品“${item.name}”没有生产配方。`, "items", item.id)); + } + const consumers = index.consumers.get(item.id) || []; + if (consumers.length === 0 && !(item.tags || []).some((tag) => ["victory", "relic", "record"].includes(tag))) { + issues.push(issue("info", "no_consumer", `物品“${item.name}”目前没有下游用途。`, "items", item.id)); + } + } + + for (const cycle of dependencyCycles(book)) { + const intentional = cycle.recipes.some((recipe) => (recipe.tags || []).includes("cycle")); + const names = cycle.items.map((id) => index.items.get(id)?.name || id).join(" → "); + issues.push(issue(intentional ? "info" : "warning", intentional ? "intentional_cycle" : "dependency_cycle", `${intentional ? "已标记循环" : "未标记依赖循环"}:${names}`, "recipes", cycle.recipes[0]?.id || "")); + } + + const critical = traceIngredientClosure(book, "first_warp_record"); + if (!index.items.has("first_warp_record")) { + issues.push(issue("error", "missing_victory_item", "缺少首次折跃记录物品。")); + } else if (!critical.producers.length) { + issues.push(issue("error", "missing_victory_recipe", "首次折跃记录没有生产配方。", "items", "first_warp_record")); + } + for (const missing of critical.missing) { + issues.push(issue("error", "critical_missing_producer", `首次折跃上游“${missing.name}”没有生产配方或原料来源。`, "items", missing.id)); + } + + const rank = { error: 0, warning: 1, info: 2 }; + return issues.sort((a, b) => rank[a.severity] - rank[b.severity] || a.message.localeCompare(b.message, "zh-CN")); +} + +export function traceIngredientClosure(book, targetItemId) { + const index = makeIndex(book); + const visitedItems = new Set(); + const visitedRecipes = new Set(); + const missing = []; + + function visitItem(itemId) { + if (visitedItems.has(itemId)) return; + visitedItems.add(itemId); + const item = index.items.get(itemId); + if (!item) { + missing.push({ id: itemId, name: itemId }); + return; + } + if (item.isRaw || (item.tags || []).includes("system_generated")) return; + const producers = (index.producers.get(itemId) || []).filter((recipe) => recipe.enabled !== false); + if (!producers.length) { + missing.push(item); + return; + } + const producer = producers[0]; + if (visitedRecipes.has(producer.id)) return; + visitedRecipes.add(producer.id); + for (const input of producer.inputs || []) visitItem(input.itemId); + } + + visitItem(targetItemId); + return { + items: [...visitedItems], + recipes: [...visitedRecipes], + producers: index.producers.get(targetItemId) || [], + missing, + }; +} + +function entityNode(book, type, entity) { + return { + key: `${type}:${entity.id}`, + type, + id: entity.id, + label: entity.name, + stage: entity.stage, + biome: entity.biome, + subtitle: type === "recipes" ? `${entity.duration}s · ${entity.kind}` : type === "machines" ? `×${entity.baseSpeed}` : entity.category, + }; +} + +export function buildGraph(book, options = {}) { + const index = makeIndex(book); + const mode = options.mode || "focus"; + const depth = Math.max(1, Math.min(5, Number(options.depth) || 2)); + const nodes = new Map(); + const edges = new Map(); + + function addEntity(type, entity) { + if (!entity) return; + nodes.set(`${type}:${entity.id}`, entityNode(book, type, entity)); + } + function addRecipe(recipe) { + if (!recipe || recipe.enabled === false) return; + addEntity("recipes", recipe); + for (const input of recipe.inputs || []) { + const item = index.items.get(input.itemId); + addEntity("items", item); + if (item) edges.set(`items:${item.id}>recipes:${recipe.id}`, { source: `items:${item.id}`, target: `recipes:${recipe.id}`, kind: input.mode || "input", amount: input.amount }); + } + for (const output of recipe.outputs || []) { + const item = index.items.get(output.itemId); + addEntity("items", item); + if (item) edges.set(`recipes:${recipe.id}>items:${item.id}`, { source: `recipes:${recipe.id}`, target: `items:${item.id}`, kind: "output", amount: output.amount }); + } + } + + if (mode === "full") { + for (const recipe of book.recipes || []) { + if (options.stage && options.stage !== "all" && recipe.stage !== options.stage) continue; + if (options.biome && options.biome !== "all" && recipe.biome !== options.biome) continue; + addRecipe(recipe); + } + } else { + const selection = options.selection || { type: "items", id: "first_warp_record" }; + const queue = [{ type: selection.type, id: selection.id, distance: selection.type === "recipes" ? 1 : 0, direction: "both" }]; + const seen = new Set(); + while (queue.length) { + const current = queue.shift(); + const key = `${current.type}:${current.id}:${current.direction}`; + if (seen.has(key) || current.distance > depth) continue; + seen.add(key); + if (current.type === "recipes") { + const recipe = index.recipes.get(current.id); + addRecipe(recipe); + if (current.direction === "both" || current.direction === "upstream") { + for (const entry of recipe?.inputs || []) queue.push({ type: "items", id: entry.itemId, distance: current.distance, direction: "upstream" }); + } + if (current.direction === "both" || current.direction === "downstream") { + for (const entry of recipe?.outputs || []) queue.push({ type: "items", id: entry.itemId, distance: current.distance, direction: "downstream" }); + } + } else if (current.type === "items") { + const item = index.items.get(current.id); + addEntity("items", item); + if (current.distance >= depth) continue; + const recipes = current.direction === "upstream" + ? index.producers.get(current.id) || [] + : current.direction === "downstream" + ? index.consumers.get(current.id) || [] + : [...(index.producers.get(current.id) || []), ...(index.consumers.get(current.id) || [])]; + for (const recipe of recipes) { + addRecipe(recipe); + queue.push({ type: "recipes", id: recipe.id, distance: current.distance + 1, direction: current.direction }); + } + } else if (current.type === "machines") { + const machine = index.machines.get(current.id); + addEntity("machines", machine); + if (current.distance >= depth) continue; + for (const recipe of (book.recipes || []).filter((entry) => entry.machineId === current.id)) { + addRecipe(recipe); + edges.set(`machines:${machine.id}>recipes:${recipe.id}`, { source: `machines:${machine.id}`, target: `recipes:${recipe.id}`, kind: "machine" }); + queue.push({ type: "recipes", id: recipe.id, distance: current.distance + 1, direction: "both" }); + } + } + } + } + return { nodes: [...nodes.values()], edges: [...edges.values()] }; +} + +export function primaryRatePerMinute(recipe, machine) { + const output = recipe?.outputs?.[0]; + if (!output || !(recipe.duration > 0)) return 0; + return Number(output.amount || 0) * 60 * Number(machine?.baseSpeed || 1) / Number(recipe.duration); +} + +export function summarizeBook(book, issues = []) { + return { + items: book.items?.length || 0, + recipes: book.recipes?.length || 0, + machines: book.machines?.length || 0, + errors: issues.filter((entry) => entry.severity === "error").length, + warnings: issues.filter((entry) => entry.severity === "warning").length, + }; +} diff --git a/tools/recipe-tree-editor/index.html b/tools/recipe-tree-editor/index.html new file mode 100644 index 0000000..801c1f1 --- /dev/null +++ b/tools/recipe-tree-editor/index.html @@ -0,0 +1,207 @@ + + + + + + + 魔力工坊 · 配方树工作台 + + + +
+
+
+ +
+ 配方树工作台 + 魔力工坊 / 策划数据 +
+
+ +
+ 配方 + 物品 + 设施 +
+ + +
+ +
+ + +
+
+
+ 依赖视图 +

配方树

+

选择左侧条目以查看上下游。

+
+
+
+ + +
+ + +
+
+ +
+ + + + + + + + + + + + + + + + +
+ + 100% + +
+
+ 物品 + 配方 + 催化/状态 +
+
+ +
+
+
滚轮缩放 · 拖拽平移 · 单击节点编辑
+
+
+ + +
+
+ + +
+
+
+ 实时校验 +

数据健康检查

+

+
+ +
+
+ + + + +
+
+ +
+
+ + +
+
+
字段速查

魔法配方怎么填

+ +
+
+
+
消耗
每次制作永久扣除,例如木材、供物。
+
催化
参与法则但不扣除,例如生命锚核、边界石。
+
流体
按配方批次统计的管网输入。
+
状态
物品必须带入某种状态,完成后可由产出表达状态变化。
+
权重
用于传送门结果袋;同一配方所有权重应合计 100。
+
概率
用于独立概率结果;全部产出都是概率项时应合计 1。
+
一次制作给传送门或仪式网络增加的复杂度压力。
+
+
+ +
+
+ + +
+ + + + diff --git a/tools/recipe-tree-editor/server.mjs b/tools/recipe-tree-editor/server.mjs new file mode 100644 index 0000000..7baf632 --- /dev/null +++ b/tools/recipe-tree-editor/server.mjs @@ -0,0 +1,166 @@ +import http from "node:http"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import { copyFile, mkdir, readFile, rename, stat, unlink, writeFile } from "node:fs/promises"; +import { validateBook } from "./core.mjs"; + +const ROOT = path.resolve(fileURLToPath(new URL("../../", import.meta.url))); +const BOOK_PATH = path.join(ROOT, "data", "recipe-book.json"); +const BACKUP_DIR = path.join(ROOT, "data", "backups"); +const TECH_PATH = path.join(ROOT, "docs", "tech-tree-nodes-v0.2.csv"); +const DEFAULT_PORT = 8765; +const MAX_BODY_BYTES = 5 * 1024 * 1024; + +const MIME = { + ".html": "text/html; charset=utf-8", + ".css": "text/css; charset=utf-8", + ".js": "text/javascript; charset=utf-8", + ".mjs": "text/javascript; charset=utf-8", + ".json": "application/json; charset=utf-8", + ".csv": "text/csv; charset=utf-8", + ".svg": "image/svg+xml", + ".png": "image/png", + ".ico": "image/x-icon", +}; + +function json(response, statusCode, payload) { + const body = `${JSON.stringify(payload, null, 2)}\n`; + response.writeHead(statusCode, { + "Content-Type": "application/json; charset=utf-8", + "Content-Length": Buffer.byteLength(body), + "Cache-Control": "no-store", + "X-Content-Type-Options": "nosniff", + }); + response.end(body); +} + +function safeStaticPath(urlPath) { + const decoded = decodeURIComponent(urlPath).replace(/^\/+/, ""); + const relative = decoded || "tools/recipe-tree-editor/index.html"; + const webPath = relative.replaceAll("\\", "/"); + const allowed = webPath.startsWith("tools/recipe-tree-editor/") + || webPath === "data/recipe-book.json" + || webPath === "docs/tech-tree-nodes-v0.2.csv"; + if (!allowed) return null; + const target = path.resolve(ROOT, relative); + return target === ROOT || target.startsWith(`${ROOT}${path.sep}`) ? target : null; +} + +async function readTechnologyIds() { + try { + const csv = await readFile(TECH_PATH, "utf8"); + return new Set(csv.split(/\r?\n/).slice(1).map((line) => line.split(",", 1)[0].trim()).filter(Boolean)); + } catch { + return null; + } +} + +async function readBody(request) { + const chunks = []; + let size = 0; + for await (const chunk of request) { + size += chunk.length; + if (size > MAX_BODY_BYTES) throw Object.assign(new Error("数据超过 5 MB 限制。"), { statusCode: 413 }); + chunks.push(chunk); + } + return Buffer.concat(chunks).toString("utf8"); +} + +async function saveBook(request, response) { + if (!String(request.headers["content-type"] || "").toLowerCase().includes("application/json")) { + return json(response, 415, { ok: false, message: "保存接口只接受 JSON。" }); + } + let book; + try { + book = JSON.parse(await readBody(request)); + } catch (error) { + return json(response, error.statusCode || 400, { ok: false, message: error.message || "JSON 无法解析。" }); + } + + const technologyIds = await readTechnologyIds(); + const issues = validateBook(book, { technologyIds }); + const errors = issues.filter((entry) => entry.severity === "error"); + if (errors.length) return json(response, 422, { ok: false, message: `存在 ${errors.length} 个校验错误,未写入文件。`, errors }); + + const timestamp = new Date().toISOString().replace(/[.:]/g, "-").replace("T", "_"); + const backupName = `recipe-book_${timestamp}.json`; + const backupPath = path.join(BACKUP_DIR, backupName); + const temporaryPath = `${BOOK_PATH}.${process.pid}.tmp`; + try { + await mkdir(BACKUP_DIR, { recursive: true }); + await copyFile(BOOK_PATH, backupPath); + await writeFile(temporaryPath, `${JSON.stringify(book, null, 2)}\n`, "utf8"); + await rename(temporaryPath, BOOK_PATH); + } catch (error) { + await unlink(temporaryPath).catch(() => {}); + return json(response, 500, { ok: false, message: `写入失败:${error.message}` }); + } + return json(response, 200, { + ok: true, + savedAt: new Date().toISOString(), + backup: `data/backups/${backupName}`, + warnings: issues.filter((entry) => entry.severity === "warning").length, + }); +} + +async function serveStatic(request, response, pathname) { + const filePath = safeStaticPath(pathname); + if (!filePath) return json(response, 403, { ok: false, message: "路径不在项目内。" }); + try { + const fileStat = await stat(filePath); + if (!fileStat.isFile()) throw new Error("not a file"); + const content = await readFile(filePath); + response.writeHead(200, { + "Content-Type": MIME[path.extname(filePath).toLowerCase()] || "application/octet-stream", + "Content-Length": content.length, + "Cache-Control": "no-store", + "X-Content-Type-Options": "nosniff", + "Content-Security-Policy": "default-src 'self'; style-src 'self' 'unsafe-inline'; script-src 'self'; img-src 'self' data:; connect-src 'self'", + }); + if (request.method === "HEAD") response.end(); + else response.end(content); + } catch { + json(response, 404, { ok: false, message: "文件不存在。" }); + } +} + +const server = http.createServer(async (request, response) => { + try { + const url = new URL(request.url || "/", "http://127.0.0.1"); + if (request.method === "GET" && url.pathname === "/api/status") { + return json(response, 200, { ok: true, service: "magic-foundry-recipe-editor", root: ROOT }); + } + if (request.method === "GET" && url.pathname === "/api/book") { + const book = JSON.parse(await readFile(BOOK_PATH, "utf8")); + return json(response, 200, book); + } + if (request.method === "POST" && url.pathname === "/api/book") return await saveBook(request, response); + if (request.method === "GET" && url.pathname === "/") { + response.writeHead(302, { Location: "/tools/recipe-tree-editor/" }); + return response.end(); + } + if ((request.method === "GET" || request.method === "HEAD") && url.pathname === "/tools/recipe-tree-editor/") { + return await serveStatic(request, response, "/tools/recipe-tree-editor/index.html"); + } + if (request.method === "GET" || request.method === "HEAD") return await serveStatic(request, response, url.pathname); + return json(response, 405, { ok: false, message: "不支持的请求方式。" }); + } catch (error) { + return json(response, 500, { ok: false, message: error.message }); + } +}); + +const portIndex = process.argv.indexOf("--port"); +const requestedPort = portIndex >= 0 ? Number(process.argv[portIndex + 1]) : DEFAULT_PORT; +const port = Number.isInteger(requestedPort) && requestedPort > 0 && requestedPort < 65536 ? requestedPort : DEFAULT_PORT; + +server.on("error", (error) => { + if (error.code === "EADDRINUSE") { + console.error(`端口 ${port} 已被占用;如果工作台已经打开,可以直接继续使用。`); + } else console.error(error); + process.exitCode = 1; +}); + +server.listen(port, "127.0.0.1", () => { + console.log(`魔力工坊配方树工作台:http://127.0.0.1:${port}/tools/recipe-tree-editor/`); + console.log("服务只监听本机;关闭对应 node 进程即可停止。 "); +}); diff --git a/tools/recipe-tree-editor/start-editor.cmd b/tools/recipe-tree-editor/start-editor.cmd new file mode 100644 index 0000000..292a508 --- /dev/null +++ b/tools/recipe-tree-editor/start-editor.cmd @@ -0,0 +1,17 @@ +@echo off +setlocal +where node.exe >nul 2>nul +if errorlevel 1 ( + echo [配方树工作台] 未找到 Node.js。请安装 Node.js 20 或更高版本后重试。 + pause + exit /b 1 +) + +powershell.exe -NoProfile -ExecutionPolicy Bypass -File "%~dp0start-editor.ps1" + +if errorlevel 1 ( + echo [配方树工作台] 启动失败。请在当前目录运行 node server.mjs 查看原因。 + pause + exit /b 1 +) +endlocal diff --git a/tools/recipe-tree-editor/start-editor.ps1 b/tools/recipe-tree-editor/start-editor.ps1 new file mode 100644 index 0000000..e83716a --- /dev/null +++ b/tools/recipe-tree-editor/start-editor.ps1 @@ -0,0 +1,34 @@ +param([switch]$NoOpen) + +$ErrorActionPreference = "Stop" +$url = "http://127.0.0.1:8765/tools/recipe-tree-editor/" +$statusUrl = "http://127.0.0.1:8765/api/status" + +try { + Invoke-RestMethod -Uri $statusUrl -TimeoutSec 1 | Out-Null +} +catch { + $serverPath = Join-Path $PSScriptRoot "server.mjs" + $quotedServerPath = '"' + $serverPath + '"' + Start-Process -FilePath "node.exe" -ArgumentList @($quotedServerPath, "--port", "8765") -WindowStyle Hidden + + $ready = $false + foreach ($attempt in 1..25) { + Start-Sleep -Milliseconds 100 + try { + Invoke-RestMethod -Uri $statusUrl -TimeoutSec 1 | Out-Null + $ready = $true + break + } + catch { + # Retry while the local helper starts. + } + } + if (-not $ready) { + throw "Recipe editor service did not start on port 8765." + } +} + +if (-not $NoOpen) { + Start-Process $url +} diff --git a/tools/recipe-tree-editor/styles.css b/tools/recipe-tree-editor/styles.css new file mode 100644 index 0000000..fc2031f --- /dev/null +++ b/tools/recipe-tree-editor/styles.css @@ -0,0 +1,339 @@ +:root { + --bg: #10131b; + --panel: #171b25; + --panel-raised: #1d2230; + --panel-soft: #141822; + --line: #2a3040; + --line-strong: #3a4256; + --text: #e9edf5; + --text-soft: #a6b0c5; + --text-dim: #707b92; + --mint: #67d8b2; + --mint-deep: #1c876d; + --violet: #9d8cff; + --gold: #e7bf68; + --red: #ef7180; + --orange: #e59a55; + --blue: #70a9ff; + --shadow: 0 18px 50px rgb(0 0 0 / 24%); + --radius: 14px; + --font: "Segoe UI", "Microsoft YaHei UI", "Microsoft YaHei", sans-serif; +} + +* { box-sizing: border-box; } + +html, body { height: 100%; } + +body { + margin: 0; + overflow: hidden; + background: + radial-gradient(circle at 54% 0%, rgb(90 69 144 / 13%), transparent 36%), + var(--bg); + color: var(--text); + font-family: var(--font); + font-size: 14px; +} + +button, input, select, textarea { font: inherit; } +button { color: inherit; } + +button:focus-visible, input:focus-visible, select:focus-visible, textarea:focus-visible { + outline: 2px solid var(--mint); + outline-offset: 2px; +} + +.app { height: 100%; display: grid; grid-template-rows: 68px minmax(0, 1fr); } + +.topbar { + display: flex; + align-items: center; + gap: 24px; + padding: 0 18px; + border-bottom: 1px solid var(--line); + background: rgb(18 22 31 / 94%); + backdrop-filter: blur(18px); + z-index: 20; +} + +.brand { display: flex; align-items: center; gap: 11px; min-width: 260px; } +.brand-mark { + width: 36px; + height: 36px; + display: grid; + place-items: center; + border: 1px solid rgb(103 216 178 / 45%); + border-radius: 11px; + color: var(--mint); + background: linear-gradient(145deg, rgb(103 216 178 / 16%), rgb(157 140 255 / 8%)); + box-shadow: inset 0 0 22px rgb(103 216 178 / 8%); + font-size: 20px; +} +.brand div { display: grid; gap: 2px; } +.brand strong { font-size: 15px; letter-spacing: .04em; } +.brand span:last-child { color: var(--text-dim); font-size: 11px; } + +.top-stats { display: flex; align-items: center; gap: 16px; color: var(--text-dim); white-space: nowrap; } +.top-stats span { padding-left: 15px; border-left: 1px solid var(--line); font-size: 12px; } +.top-stats b { color: var(--text); font-size: 14px; margin-right: 3px; } + +.toolbar { margin-left: auto; display: flex; gap: 7px; align-items: center; } +.button, .icon-button { + border: 1px solid var(--line-strong); + border-radius: 9px; + background: var(--panel-raised); + cursor: pointer; + transition: border-color .15s ease, background .15s ease, transform .15s ease, opacity .15s ease; +} +.button { min-height: 34px; padding: 0 12px; font-weight: 600; font-size: 12px; } +.button:hover:not(:disabled), .icon-button:hover:not(:disabled) { border-color: #566077; background: #242a3a; } +.button:active:not(:disabled), .icon-button:active:not(:disabled) { transform: translateY(1px); } +.button:disabled { opacity: .35; cursor: default; } +.button.ghost { background: transparent; color: var(--text-soft); } +.button.primary { border-color: #52c7a1; background: var(--mint); color: #10221d; box-shadow: 0 7px 22px rgb(103 216 178 / 14%); } +.button.primary:hover:not(:disabled) { background: #79e5c0; border-color: #79e5c0; } +.button.compact { min-height: 30px; padding: 0 10px; } +.issue-button.has-errors { border-color: rgb(239 113 128 / 55%); color: #ff9aa6; } +.issue-button.has-warnings:not(.has-errors) { border-color: rgb(229 154 85 / 55%); color: #efb078; } +.icon-button { width: 34px; height: 34px; font-size: 20px; display: grid; place-items: center; } + +.save-state { display: inline-flex; align-items: center; gap: 7px; color: var(--text-dim); margin-right: 3px; font-size: 12px; white-space: nowrap; } +.save-state i { width: 7px; height: 7px; border-radius: 50%; background: var(--text-dim); } +.save-state.saved i { background: var(--mint); box-shadow: 0 0 10px rgb(103 216 178 / 65%); } +.save-state.dirty { color: var(--gold); } +.save-state.dirty i { background: var(--gold); } +.save-state.offline { color: var(--orange); } +.save-state.offline i { background: var(--orange); } +.save-state.loading i { animation: pulse 1s infinite alternate; } +@keyframes pulse { to { opacity: .25; } } + +.workspace { + min-height: 0; + display: grid; + grid-template-columns: 292px minmax(500px, 1fr) 390px; + gap: 1px; + background: var(--line); +} + +.panel { min-width: 0; min-height: 0; background: var(--panel); } +.catalog, .inspector { display: flex; flex-direction: column; } +.panel-heading { min-height: 76px; padding: 17px 16px 13px; display: flex; align-items: center; justify-content: space-between; gap: 12px; } +.panel-heading h1, .panel-heading h2, .graph-title h2 { margin: 3px 0 0; font-size: 17px; line-height: 1.2; } +.eyebrow { display: block; color: var(--text-dim); text-transform: uppercase; font-size: 10px; letter-spacing: .16em; font-weight: 700; } + +.type-tabs { margin: 0 13px 12px; padding: 3px; display: grid; grid-template-columns: repeat(3, 1fr); border-radius: 10px; background: var(--panel-soft); border: 1px solid var(--line); } +.type-tabs button, .segmented button, .issue-filter button { + border: 0; + border-radius: 7px; + color: var(--text-dim); + background: transparent; + cursor: pointer; +} +.type-tabs button { padding: 8px 4px; font-size: 12px; font-weight: 600; } +.type-tabs button span { margin-left: 3px; font-size: 10px; opacity: .7; } +.type-tabs button.active, .segmented button.active, .issue-filter button.active { background: #292f3f; color: var(--text); box-shadow: 0 2px 8px rgb(0 0 0 / 18%); } + +.search-box { margin: 0 13px 10px; height: 38px; display: grid; grid-template-columns: 24px 1fr auto; align-items: center; padding: 0 10px; border-radius: 9px; border: 1px solid var(--line); background: var(--panel-soft); color: var(--text-dim); } +.search-box:focus-within { border-color: var(--mint-deep); } +.search-box input { min-width: 0; border: 0; outline: 0; color: var(--text); background: transparent; } +.search-box input::placeholder { color: #5f687c; } +.search-box kbd { border: 1px solid var(--line); border-radius: 4px; padding: 1px 5px; color: var(--text-dim); background: var(--panel-raised); font-size: 10px; } + +.catalog-filters { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; padding: 0 13px 10px; } +.catalog-filters label { display: grid; gap: 4px; color: var(--text-dim); font-size: 10px; } +select, input[type="text"], input[type="number"], textarea { + width: 100%; + color: var(--text); + border: 1px solid var(--line-strong); + border-radius: 8px; + background: var(--panel-soft); +} +select, input[type="text"], input[type="number"] { height: 34px; padding: 0 9px; } +textarea { min-height: 76px; padding: 9px; line-height: 1.5; resize: vertical; } +select { padding-right: 24px; } +.catalog-filters select { height: 32px; border-color: var(--line); font-size: 11px; } + +.catalog-summary { padding: 1px 15px 9px; color: var(--text-dim); font-size: 11px; } +.entity-list { min-height: 0; overflow: auto; padding: 0 8px 18px; scrollbar-color: #3b4355 transparent; } +.stage-group-label { position: sticky; top: 0; z-index: 2; padding: 11px 8px 7px; color: var(--text-dim); background: linear-gradient(var(--panel) 72%, transparent); font-size: 10px; font-weight: 700; letter-spacing: .08em; } +.entity-row { width: 100%; border: 1px solid transparent; border-radius: 9px; padding: 9px 9px 8px; display: grid; grid-template-columns: 27px 1fr auto; gap: 8px; align-items: center; text-align: left; background: transparent; cursor: pointer; } +.entity-row:hover { background: #1d2230; } +.entity-row.active { border-color: rgb(103 216 178 / 32%); background: linear-gradient(90deg, rgb(103 216 178 / 11%), rgb(103 216 178 / 3%)); } +.entity-icon { width: 27px; height: 27px; display: grid; place-items: center; border-radius: 7px; color: var(--mint); background: rgb(103 216 178 / 9%); font-size: 12px; } +.entity-row[data-type="recipes"] .entity-icon { color: var(--violet); background: rgb(157 140 255 / 10%); } +.entity-row[data-type="machines"] .entity-icon { color: var(--gold); background: rgb(231 191 104 / 10%); } +.entity-copy { min-width: 0; display: grid; gap: 2px; } +.entity-copy strong { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 12px; } +.entity-copy small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--text-dim); font-size: 10px; font-family: Consolas, monospace; } +.entity-meta { max-width: 65px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--text-dim); font-size: 9px; } +.list-empty { padding: 36px 15px; text-align: center; color: var(--text-dim); line-height: 1.6; } + +.graph-panel { display: grid; grid-template-rows: auto minmax(0, 1fr) 42px; background: #121620; } +.graph-header { min-height: 76px; padding: 15px 18px 12px; display: flex; align-items: center; justify-content: space-between; gap: 16px; border-bottom: 1px solid var(--line); background: var(--panel); } +.graph-title { min-width: 0; } +.graph-title h2 { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } +.graph-title p { margin: 4px 0 0; color: var(--text-dim); font-size: 11px; } +.graph-controls { display: flex; align-items: center; gap: 8px; } +.segmented { display: flex; padding: 3px; border: 1px solid var(--line); border-radius: 9px; background: var(--panel-soft); } +.segmented button { min-width: 48px; padding: 6px 8px; font-size: 11px; } +.depth-control { display: flex; align-items: center; gap: 6px; color: var(--text-dim); font-size: 11px; } +.depth-control select { width: 50px; height: 30px; border-color: var(--line); } +.depth-control.is-disabled { opacity: .35; pointer-events: none; } + +.graph-stage { + position: relative; + min-height: 0; + overflow: hidden; + background-color: #11151e; + background-image: + linear-gradient(rgb(255 255 255 / 2.3%) 1px, transparent 1px), + linear-gradient(90deg, rgb(255 255 255 / 2.3%) 1px, transparent 1px), + radial-gradient(circle at 50% 45%, rgb(103 216 178 / 4%), transparent 42%); + background-size: 28px 28px, 28px 28px, 100% 100%; +} +#recipeGraph { width: 100%; height: 100%; display: block; cursor: grab; user-select: none; } +#recipeGraph.dragging { cursor: grabbing; } +.stage-band rect { fill: rgb(255 255 255 / 1.6%); stroke: rgb(255 255 255 / 4%); } +.stage-band text { fill: #606b81; font-size: 11px; font-weight: 700; letter-spacing: .08em; } +.graph-edge { fill: none; stroke: #68748e; stroke-width: 1.4; opacity: .7; } +.graph-edge.output { stroke: #50cda7; marker-end: url(#arrowOutput); } +.graph-edge.catalyst, .graph-edge.state { stroke: var(--gold); stroke-dasharray: 5 4; } +.graph-edge.fluid { stroke: var(--blue); } +.graph-edge.machine { stroke: var(--gold); stroke-dasharray: 3 4; } +.graph-edge.consumed { marker-end: url(#arrowInput); } +.edge-label { fill: #77839a; font-size: 9px; paint-order: stroke; stroke: #11151e; stroke-width: 4px; } +.graph-node { cursor: pointer; } +.graph-node rect { stroke-width: 1; filter: drop-shadow(0 6px 8px rgb(0 0 0 / 18%)); } +.graph-node.item rect { fill: #1a2530; stroke: #355366; } +.graph-node.recipe rect { fill: #242035; stroke: #594f81; } +.graph-node.machine rect { fill: #2b261c; stroke: #665535; } +.graph-node.selected rect { stroke: var(--mint); stroke-width: 2.2; filter: drop-shadow(0 0 8px rgb(103 216 178 / 30%)); } +.graph-node text { pointer-events: none; } +.node-label { fill: #edf1f8; font-size: 12px; font-weight: 650; } +.node-subtitle { fill: #8490a7; font-size: 9px; } +.node-glyph { fill: var(--mint); font-size: 11px; } +.graph-node.recipe .node-glyph { fill: var(--violet); } +.graph-node.machine .node-glyph { fill: var(--gold); } +.graph-empty { position: absolute; inset: 0; display: grid; place-content: center; text-align: center; color: var(--text-dim); pointer-events: none; } +.graph-empty[hidden] { display: none; } +.graph-empty span { color: var(--mint); font-size: 28px; } +.graph-empty strong { margin-top: 7px; color: var(--text-soft); } +.graph-empty p { margin: 5px 0 0; font-size: 11px; } +.zoom-tools { position: absolute; right: 14px; bottom: 14px; display: flex; align-items: center; border: 1px solid var(--line); border-radius: 9px; overflow: hidden; background: rgb(23 27 37 / 92%); box-shadow: var(--shadow); } +.zoom-tools button { width: 32px; height: 30px; border: 0; background: transparent; cursor: pointer; font-size: 17px; } +.zoom-tools button:hover { background: #272d3c; } +.zoom-tools output { min-width: 48px; padding: 0 5px; color: var(--text-dim); text-align: center; font-size: 10px; } +.graph-legend { position: absolute; left: 14px; bottom: 14px; display: flex; gap: 12px; padding: 7px 9px; border: 1px solid var(--line); border-radius: 8px; color: var(--text-dim); background: rgb(23 27 37 / 90%); font-size: 9px; } +.graph-legend span { display: flex; align-items: center; gap: 5px; } +.graph-legend i { width: 13px; height: 7px; border: 1px solid #355366; border-radius: 2px; background: #1a2530; } +.graph-legend .legend-recipe { border-color: #594f81; background: #242035; } +.graph-legend .legend-catalyst { height: 0; border: 0; border-top: 1px dashed var(--gold); background: none; } +.graph-footer { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 0 16px; border-top: 1px solid var(--line); color: var(--text-dim); background: var(--panel); font-size: 10px; } +#routeSummary { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } +.graph-hint { white-space: nowrap; } + +.inspector-heading { border-bottom: 1px solid var(--line); } +.inspector-heading h2 { max-width: 260px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } +.entity-kind { flex: none; padding: 5px 7px; border: 1px solid var(--line); border-radius: 6px; color: var(--text-dim); font-size: 9px; text-transform: uppercase; letter-spacing: .08em; } +.inspector-content { min-height: 0; overflow: auto; padding: 14px 14px 80px; scrollbar-color: #3b4355 transparent; } +.empty-inspector { display: grid; place-items: center; gap: 9px; padding: 80px 24px; text-align: center; color: var(--text-dim); line-height: 1.55; } +.empty-inspector span { color: var(--violet); font-size: 25px; } +.inspector-section { margin-bottom: 12px; padding: 13px; border: 1px solid var(--line); border-radius: 11px; background: var(--panel-soft); } +.section-title { margin: 0 0 11px; display: flex; align-items: center; justify-content: space-between; color: var(--text-soft); font-size: 11px; text-transform: uppercase; letter-spacing: .07em; } +.section-title button { border: 0; color: var(--mint); background: transparent; cursor: pointer; font-size: 11px; } +.form-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; } +.form-field { min-width: 0; display: grid; align-content: start; gap: 5px; } +.form-field.full { grid-column: 1 / -1; } +.form-field > span { color: var(--text-dim); font-size: 10px; } +.field-help { color: #657088; font-size: 9px; line-height: 1.4; } +.id-field { font-family: Consolas, monospace; font-size: 11px; } +.checkbox-field { display: flex; align-items: center; gap: 7px; min-height: 34px; padding-top: 15px; color: var(--text-soft); font-size: 11px; } +.checkbox-field input { accent-color: var(--mint); } +.io-row { margin-bottom: 8px; padding: 9px; border: 1px solid var(--line); border-radius: 9px; background: #181d28; } +.io-row:last-child { margin-bottom: 0; } +.io-main { display: grid; grid-template-columns: minmax(0, 1fr) 74px 82px 28px; gap: 6px; align-items: center; } +.io-row.output .io-main { grid-template-columns: minmax(0, 1fr) 74px 28px; } +.io-extra { display: grid; grid-template-columns: repeat(4, 1fr); gap: 6px; margin-top: 7px; } +.io-extra label { display: grid; gap: 3px; color: var(--text-dim); font-size: 8px; } +.io-row select, .io-row input { height: 30px; font-size: 10px; } +.row-delete { width: 28px; height: 28px; border: 0; border-radius: 6px; color: var(--red); background: rgb(239 113 128 / 8%); cursor: pointer; } +.row-delete:hover { background: rgb(239 113 128 / 16%); } +.inline-stats { display: grid; grid-template-columns: repeat(3, 1fr); gap: 7px; } +.inline-stats div { padding: 9px; border-radius: 8px; background: #181d28; } +.inline-stats strong, .inline-stats span { display: block; } +.inline-stats strong { color: var(--text); font-size: 13px; } +.inline-stats span { margin-top: 3px; color: var(--text-dim); font-size: 8px; } +.dependency-links { display: flex; flex-wrap: wrap; gap: 5px; } +.dependency-links button { max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; padding: 5px 7px; border: 1px solid var(--line); border-radius: 6px; color: var(--text-soft); background: #1b202c; cursor: pointer; font-size: 9px; } +.dependency-links button:hover { border-color: var(--mint-deep); color: var(--mint); } +.inspector-actions { display: flex; gap: 7px; } +.inspector-actions .danger { margin-left: auto; border-color: rgb(239 113 128 / 35%); color: #f48c99; } +.help-link { width: 100%; margin-top: 2px; color: var(--text-dim); border: 0; background: transparent; cursor: pointer; font-size: 10px; } +.help-link:hover { color: var(--mint); } + +dialog { padding: 0; color: var(--text); border: 1px solid var(--line-strong); border-radius: 15px; background: var(--panel); box-shadow: 0 30px 100px rgb(0 0 0 / 55%); } +dialog::backdrop { background: rgb(6 8 12 / 72%); backdrop-filter: blur(4px); } +.issues-dialog { width: min(720px, calc(100vw - 32px)); max-height: min(760px, calc(100vh - 32px)); } +.help-dialog { width: min(620px, calc(100vw - 32px)); } +.dialog-shell { display: grid; grid-template-rows: auto auto minmax(0, 1fr) auto; max-height: inherit; } +.dialog-shell > header { padding: 19px 20px 15px; display: flex; justify-content: space-between; gap: 20px; border-bottom: 1px solid var(--line); } +.dialog-shell > header h2 { margin: 3px 0 0; font-size: 18px; } +.dialog-shell > header p { margin: 6px 0 0; color: var(--text-dim); font-size: 11px; } +.dialog-shell > footer { min-height: 58px; padding: 10px 18px; display: flex; align-items: center; justify-content: space-between; gap: 15px; border-top: 1px solid var(--line); color: var(--text-dim); font-size: 10px; } +.issue-filter { padding: 10px 18px; display: flex; gap: 7px; border-bottom: 1px solid var(--line); } +.issue-filter button { padding: 6px 11px; font-size: 10px; } +.issue-list { min-height: 170px; overflow: auto; padding: 9px 11px 15px; } +.issue-row { width: 100%; margin-bottom: 5px; padding: 10px; display: grid; grid-template-columns: 9px 1fr auto; gap: 10px; align-items: start; text-align: left; border: 1px solid transparent; border-radius: 9px; color: var(--text-soft); background: transparent; cursor: pointer; } +.issue-row:hover { border-color: var(--line); background: var(--panel-raised); } +.issue-dot { width: 7px; height: 7px; margin-top: 4px; border-radius: 50%; background: var(--blue); } +.issue-row.error .issue-dot { background: var(--red); } +.issue-row.warning .issue-dot { background: var(--orange); } +.issue-copy { display: grid; gap: 3px; } +.issue-copy strong { color: var(--text); font-size: 11px; font-weight: 600; } +.issue-copy small, .issue-code { color: var(--text-dim); font-size: 9px; font-family: Consolas, monospace; } +.no-issues { padding: 45px 20px; text-align: center; color: var(--mint); } +.help-content { padding: 17px 22px 23px; overflow: auto; } +.help-content dl { display: grid; grid-template-columns: 70px 1fr; gap: 12px 16px; margin: 0; } +.help-content dt { color: var(--mint); font-weight: 700; } +.help-content dd { margin: 0; color: var(--text-soft); line-height: 1.55; } + +.toast-stack { position: fixed; right: 18px; bottom: 18px; z-index: 100; display: grid; gap: 8px; pointer-events: none; } +.toast { width: min(360px, calc(100vw - 36px)); padding: 11px 13px; border: 1px solid var(--line-strong); border-left: 3px solid var(--mint); border-radius: 9px; color: var(--text-soft); background: rgb(29 34 48 / 96%); box-shadow: var(--shadow); animation: toast-in .18s ease-out; } +.toast.error { border-left-color: var(--red); } +.toast.warning { border-left-color: var(--orange); } +@keyframes toast-in { from { opacity: 0; transform: translateY(6px); } } + +@media (max-width: 1220px) { + .workspace { grid-template-columns: 255px minmax(430px, 1fr) 340px; } + .top-stats { display: none; } + .brand { min-width: 220px; } + .toolbar .button.ghost:nth-of-type(3), .toolbar .button.ghost:nth-of-type(4) { display: none; } +} + +@media (max-width: 930px) { + body { overflow: auto; } + .app { min-height: 100%; height: auto; grid-template-rows: auto auto; } + .topbar { min-height: 66px; flex-wrap: wrap; padding-block: 10px; } + .brand { flex: 1; } + .save-state { display: none; } + .workspace { min-height: calc(100vh - 66px); grid-template-columns: 245px minmax(0, 1fr); grid-template-rows: minmax(520px, 64vh) minmax(520px, 64vh); } + .catalog { grid-row: 1 / span 2; } + .inspector { grid-column: 2; min-height: 520px; border-top: 1px solid var(--line); } + .graph-controls { flex-wrap: wrap; justify-content: flex-end; } +} + +@media (max-width: 680px) { + .topbar { position: sticky; top: 0; } + .brand span:last-child { display: none; } + .brand { min-width: 0; } + .toolbar .button.ghost { display: none; } + .workspace { display: block; } + .catalog, .graph-panel, .inspector { min-height: 620px; overflow: hidden; } + .catalog { height: 70vh; } + .graph-panel { height: 78vh; } + .inspector { height: 78vh; } + .graph-header { align-items: flex-start; } + .graph-title p, .graph-hint { display: none; } + .graph-controls .compact { display: none; } + .inspector-heading h2 { max-width: 220px; } +} diff --git a/tools/recipe-tree-editor/tests.mjs b/tools/recipe-tree-editor/tests.mjs new file mode 100644 index 0000000..1c24c09 --- /dev/null +++ b/tools/recipe-tree-editor/tests.mjs @@ -0,0 +1,46 @@ +import assert from "node:assert/strict"; +import { readFile } from "node:fs/promises"; +import { buildGraph, cloneBook, makeIndex, traceIngredientClosure, validateBook } from "./core.mjs"; + +const book = JSON.parse(await readFile(new URL("../../data/recipe-book.json", import.meta.url), "utf8")); +const schema = JSON.parse(await readFile(new URL("../../data/recipe-book.schema.json", import.meta.url), "utf8")); +const techCsv = await readFile(new URL("../../docs/tech-tree-nodes-v0.2.csv", import.meta.url), "utf8"); +const technologyIds = new Set(techCsv.split(/\r?\n/).slice(1).map((line) => line.split(",", 1)[0].trim()).filter(Boolean)); + +assert.equal(book.schemaVersion, 1, "配方书版本必须为 1"); +assert.equal(schema.properties.schemaVersion.const, 1, "Schema 与配方书版本必须一致"); +for (const required of schema.required) assert.ok(Object.hasOwn(book, required), `缺少顶层字段 ${required}`); + +const issues = validateBook(book, { technologyIds }); +const errors = issues.filter((entry) => entry.severity === "error"); +const warnings = issues.filter((entry) => entry.severity === "warning"); +assert.deepEqual(errors, [], `存在校验错误:${errors.map((entry) => entry.message).join(";")}`); +assert.deepEqual(warnings, [], `存在非预期警告:${warnings.map((entry) => entry.message).join(";")}`); + +const index = makeIndex(book); +assert.ok(index.recipes.has("perform_first_warp"), "缺少首次折跃配方"); +assert.ok(index.items.has("first_warp_record"), "缺少首次折跃记录"); +assert.ok(index.recipes.has("gather_guiding_dew"), "生机循环缺少显式启动配方"); + +const firstWarp = traceIngredientClosure(book, "first_warp_record"); +assert.deepEqual(firstWarp.missing, [], "首次折跃上游必须全部可追溯"); +for (const requiredRecipe of ["perform_first_warp", "assemble_walker_construct", "harvest_life_proof", "recall_death_proof", "prove_element_cycle", "separate_dimension_proof"]) { + assert.ok(firstWarp.recipes.includes(requiredRecipe), `首次折跃追溯缺少 ${requiredRecipe}`); +} + +for (const recipe of book.recipes.filter((entry) => entry.kind === "result_bag")) { + const weighted = recipe.outputs.filter((entry) => entry.weight != null); + if (weighted.length) assert.equal(weighted.reduce((sum, entry) => sum + entry.weight, 0), 100, `${recipe.id} 权重不等于 100`); + const chance = recipe.outputs.filter((entry) => entry.chance != null); + if (chance.length === recipe.outputs.length) assert.ok(Math.abs(chance.reduce((sum, entry) => sum + entry.chance, 0) - 1) < 1e-9, `${recipe.id} 概率不等于 1`); +} + +const focused = buildGraph(book, { mode: "focus", depth: 2, selection: { type: "recipes", id: "perform_first_warp" } }); +assert.ok(focused.nodes.some((node) => node.key === "recipes:perform_first_warp"), "聚焦图缺少选中配方"); +assert.ok(focused.edges.length >= 10, "首次折跃聚焦图边数异常"); + +const broken = cloneBook(book); +broken.recipes[0].inputs.push({ itemId: "missing_test_item", amount: 1, mode: "consumed" }); +assert.ok(validateBook(broken, { technologyIds }).some((entry) => entry.code === "missing_item" && entry.severity === "error"), "缺失引用必须被识别为错误"); + +console.log(`配方树测试通过:${book.items.length} 物品 / ${book.recipes.length} 配方 / ${book.machines.length} 设施 / ${firstWarp.recipes.length} 道首次折跃上游配方。`);