unreal-engine-mcp-server 0.5.0 → 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/.env.example +1 -1
  2. package/.github/release-drafter-config.yml +51 -0
  3. package/.github/workflows/greetings.yml +5 -1
  4. package/.github/workflows/labeler.yml +2 -1
  5. package/.github/workflows/publish-mcp.yml +2 -4
  6. package/.github/workflows/release-drafter.yml +3 -2
  7. package/.github/workflows/release.yml +3 -3
  8. package/CHANGELOG.md +109 -0
  9. package/CONTRIBUTING.md +1 -1
  10. package/GEMINI.md +115 -0
  11. package/Public/Plugin_setup_guide.mp4 +0 -0
  12. package/README.md +166 -200
  13. package/dist/automation/bridge.d.ts +1 -2
  14. package/dist/automation/bridge.js +24 -23
  15. package/dist/automation/connection-manager.d.ts +1 -0
  16. package/dist/automation/connection-manager.js +10 -0
  17. package/dist/automation/message-handler.js +5 -4
  18. package/dist/automation/request-tracker.d.ts +4 -0
  19. package/dist/automation/request-tracker.js +11 -3
  20. package/dist/config.d.ts +0 -1
  21. package/dist/config.js +0 -1
  22. package/dist/constants.d.ts +4 -0
  23. package/dist/constants.js +4 -0
  24. package/dist/graphql/loaders.d.ts +64 -0
  25. package/dist/graphql/loaders.js +117 -0
  26. package/dist/graphql/resolvers.d.ts +3 -3
  27. package/dist/graphql/resolvers.js +33 -30
  28. package/dist/graphql/server.js +3 -1
  29. package/dist/graphql/types.d.ts +2 -0
  30. package/dist/index.d.ts +2 -0
  31. package/dist/index.js +13 -2
  32. package/dist/server-setup.d.ts +0 -1
  33. package/dist/server-setup.js +0 -40
  34. package/dist/tools/actors.d.ts +58 -24
  35. package/dist/tools/actors.js +22 -6
  36. package/dist/tools/assets.d.ts +19 -71
  37. package/dist/tools/assets.js +28 -22
  38. package/dist/tools/base-tool.d.ts +4 -4
  39. package/dist/tools/base-tool.js +1 -1
  40. package/dist/tools/blueprint.d.ts +45 -61
  41. package/dist/tools/blueprint.js +43 -14
  42. package/dist/tools/consolidated-tool-definitions.js +2 -1
  43. package/dist/tools/consolidated-tool-handlers.js +96 -110
  44. package/dist/tools/dynamic-handler-registry.d.ts +11 -9
  45. package/dist/tools/dynamic-handler-registry.js +17 -95
  46. package/dist/tools/editor.d.ts +19 -193
  47. package/dist/tools/editor.js +11 -2
  48. package/dist/tools/environment.d.ts +8 -14
  49. package/dist/tools/foliage.d.ts +18 -143
  50. package/dist/tools/foliage.js +4 -2
  51. package/dist/tools/handlers/actor-handlers.d.ts +1 -1
  52. package/dist/tools/handlers/actor-handlers.js +14 -13
  53. package/dist/tools/handlers/asset-handlers.js +454 -454
  54. package/dist/tools/handlers/sequence-handlers.d.ts +1 -1
  55. package/dist/tools/handlers/sequence-handlers.js +24 -13
  56. package/dist/tools/introspection.d.ts +1 -1
  57. package/dist/tools/introspection.js +1 -1
  58. package/dist/tools/landscape.d.ts +16 -116
  59. package/dist/tools/landscape.js +7 -3
  60. package/dist/tools/level.d.ts +22 -103
  61. package/dist/tools/level.js +26 -18
  62. package/dist/tools/lighting.d.ts +54 -7
  63. package/dist/tools/lighting.js +9 -5
  64. package/dist/tools/materials.d.ts +1 -1
  65. package/dist/tools/materials.js +5 -1
  66. package/dist/tools/niagara.js +37 -2
  67. package/dist/tools/performance.d.ts +0 -1
  68. package/dist/tools/performance.js +0 -1
  69. package/dist/tools/physics.js +5 -1
  70. package/dist/tools/sequence.d.ts +24 -24
  71. package/dist/tools/sequence.js +13 -0
  72. package/dist/tools/ui.d.ts +0 -2
  73. package/dist/types/automation-responses.d.ts +115 -0
  74. package/dist/types/automation-responses.js +2 -0
  75. package/dist/types/responses.d.ts +249 -0
  76. package/dist/types/responses.js +2 -0
  77. package/dist/types/tool-interfaces.d.ts +135 -135
  78. package/dist/types/tool-types.d.ts +2 -0
  79. package/dist/unreal-bridge.js +4 -4
  80. package/dist/utils/command-validator.js +7 -5
  81. package/dist/utils/error-handler.d.ts +24 -2
  82. package/dist/utils/error-handler.js +58 -23
  83. package/dist/utils/normalize.d.ts +7 -4
  84. package/dist/utils/normalize.js +12 -10
  85. package/dist/utils/path-security.d.ts +2 -0
  86. package/dist/utils/path-security.js +24 -0
  87. package/dist/utils/response-factory.d.ts +4 -4
  88. package/dist/utils/response-factory.js +15 -21
  89. package/dist/utils/response-validator.js +88 -73
  90. package/dist/utils/unreal-command-queue.d.ts +2 -0
  91. package/dist/utils/unreal-command-queue.js +8 -1
  92. package/docs/Migration-Guide-v0.5.0.md +1 -9
  93. package/docs/handler-mapping.md +4 -2
  94. package/docs/testing-guide.md +2 -2
  95. package/package.json +12 -6
  96. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSubsystem.cpp +298 -33
  97. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AnimationHandlers.cpp +7 -8
  98. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintGraphHandlers.cpp +229 -319
  99. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers.cpp +98 -0
  100. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EffectHandlers.cpp +24 -0
  101. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EnvironmentHandlers.cpp +96 -0
  102. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LightingHandlers.cpp +52 -5
  103. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ProcessRequest.cpp +5 -268
  104. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequenceHandlers.cpp +57 -2
  105. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpConnectionManager.cpp +0 -1
  106. package/scripts/run-all-tests.mjs +25 -20
  107. package/server.json +3 -2
  108. package/src/automation/bridge.ts +27 -25
  109. package/src/automation/connection-manager.ts +18 -0
  110. package/src/automation/message-handler.ts +33 -8
  111. package/src/automation/request-tracker.ts +39 -7
  112. package/src/config.ts +1 -1
  113. package/src/constants.ts +7 -0
  114. package/src/graphql/loaders.ts +244 -0
  115. package/src/graphql/resolvers.ts +47 -49
  116. package/src/graphql/server.ts +3 -1
  117. package/src/graphql/types.ts +3 -0
  118. package/src/index.ts +15 -2
  119. package/src/resources/assets.ts +5 -4
  120. package/src/server/tool-registry.ts +3 -3
  121. package/src/server-setup.ts +3 -37
  122. package/src/tools/actors.ts +77 -44
  123. package/src/tools/animation.ts +1 -0
  124. package/src/tools/assets.ts +76 -65
  125. package/src/tools/base-tool.ts +3 -3
  126. package/src/tools/blueprint.ts +170 -104
  127. package/src/tools/consolidated-tool-definitions.ts +2 -1
  128. package/src/tools/consolidated-tool-handlers.ts +129 -150
  129. package/src/tools/dynamic-handler-registry.ts +22 -140
  130. package/src/tools/editor.ts +43 -29
  131. package/src/tools/environment.ts +21 -27
  132. package/src/tools/foliage.ts +28 -25
  133. package/src/tools/handlers/actor-handlers.ts +16 -17
  134. package/src/tools/handlers/asset-handlers.ts +484 -484
  135. package/src/tools/handlers/sequence-handlers.ts +85 -62
  136. package/src/tools/introspection.ts +7 -7
  137. package/src/tools/landscape.ts +34 -28
  138. package/src/tools/level.ts +100 -80
  139. package/src/tools/lighting.ts +25 -20
  140. package/src/tools/materials.ts +9 -3
  141. package/src/tools/niagara.ts +44 -2
  142. package/src/tools/performance.ts +1 -2
  143. package/src/tools/physics.ts +7 -1
  144. package/src/tools/sequence.ts +42 -26
  145. package/src/tools/ui.ts +1 -3
  146. package/src/types/automation-responses.ts +119 -0
  147. package/src/types/responses.ts +355 -0
  148. package/src/types/tool-interfaces.ts +135 -135
  149. package/src/types/tool-types.ts +4 -0
  150. package/src/unreal-bridge.ts +71 -26
  151. package/src/utils/command-validator.ts +47 -5
  152. package/src/utils/error-handler.ts +128 -45
  153. package/src/utils/normalize.test.ts +162 -0
  154. package/src/utils/normalize.ts +38 -16
  155. package/src/utils/path-security.ts +43 -0
  156. package/src/utils/response-factory.ts +29 -24
  157. package/src/utils/response-validator.ts +103 -87
  158. package/src/utils/safe-json.test.ts +90 -0
  159. package/src/utils/unreal-command-queue.ts +13 -1
  160. package/src/utils/validation.test.ts +184 -0
  161. package/tests/test-animation.mjs +358 -33
  162. package/tests/test-asset-graph.mjs +311 -0
  163. package/tests/test-audio.mjs +314 -116
  164. package/tests/test-behavior-tree.mjs +327 -144
  165. package/tests/test-blueprint-graph.mjs +343 -12
  166. package/tests/test-control-editor.mjs +85 -53
  167. package/tests/test-graphql.mjs +58 -8
  168. package/tests/test-input.mjs +349 -0
  169. package/tests/test-inspect.mjs +291 -61
  170. package/tests/test-landscape.mjs +304 -48
  171. package/tests/test-lighting.mjs +428 -0
  172. package/tests/test-manage-level.mjs +70 -51
  173. package/tests/test-performance.mjs +539 -0
  174. package/tests/test-sequence.mjs +82 -46
  175. package/tests/test-system.mjs +72 -33
  176. package/tests/test-wasm.mjs +98 -8
  177. package/vitest.config.ts +35 -0
  178. package/.github/release-drafter.yml +0 -148
  179. package/dist/prompts/index.d.ts +0 -21
  180. package/dist/prompts/index.js +0 -217
  181. package/dist/tools/blueprint/helpers.d.ts +0 -29
  182. package/dist/tools/blueprint/helpers.js +0 -182
  183. package/src/prompts/index.ts +0 -249
  184. package/src/tools/blueprint/helpers.ts +0 -189
  185. package/tests/test-blueprint-events.mjs +0 -35
  186. package/tests/test-extra-tools.mjs +0 -38
  187. package/tests/test-render.mjs +0 -33
  188. package/tests/test-search-assets.mjs +0 -66
@@ -1,59 +1,315 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * Condensed Environment Building Test Suite (15 cases)
3
+ * Comprehensive Environment Building Test Suite
4
4
  * Tool: build_environment
5
+ * Coverage: All 20 actions with success, error, and edge cases
5
6
  */
6
7
 
7
8
  import { runToolTests } from './test-runner.mjs';
8
9
 
9
10
  const testCases = [
10
- { scenario: 'Create small landscape', toolName: 'build_environment', arguments: { action: 'create_landscape', name: 'TC_Landscape', sizeX: 4, sizeY: 4 }, expected: 'success - landscape created' },
11
- { scenario: 'Sculpt landscape - smooth', toolName: 'build_environment', arguments: { action: 'sculpt', name: 'TC_Landscape', tool: 'Smooth' }, expected: 'success or LOAD_FAILED' },
12
- { scenario: 'Flatten small area', toolName: 'build_environment', arguments: { action: 'sculpt', name: 'TC_Landscape', tool: 'Flatten' }, expected: 'success or LOAD_FAILED' },
13
- { scenario: 'Add foliage type (trees)', toolName: 'build_environment', arguments: { action: 'add_foliage', foliageType: 'TC_Tree', meshPath: '/Engine/BasicShapes/Cube.Cube', density: 0.1 }, expected: 'success - foliage added' },
14
- { scenario: 'Paint a small foliage patch', toolName: 'build_environment', arguments: { action: 'paint_foliage', foliageType: 'TC_Tree', position: { x: 0, y: 0, z: 0 }, brushSize: 100, strength: 0.5 }, expected: 'success - foliage painted' },
15
- { scenario: 'Create procedural terrain', toolName: 'build_environment', arguments: { action: 'create_procedural_terrain', name: 'TC_ProcTerrain', location: { x: 500, y: 0, z: 0 }, subdivisions: 8 }, expected: 'success - procedural terrain created' },
16
- { scenario: 'Create procedural foliage (small)', toolName: 'build_environment', arguments: { action: 'create_procedural_foliage', bounds: { location: { x: 0, y: 0, z: 0 }, size: { x: 1000, y: 1000, z: 100 } }, seed: 42 }, expected: 'success - procedural foliage created' },
17
- { scenario: 'Add grass foliage', toolName: 'build_environment', arguments: { action: 'add_foliage', meshPath: '/Engine/BasicShapes/Cube.Cube', density: 0.5 }, expected: 'success - grass added' },
18
- { scenario: 'Generate small LODs (best-effort)', toolName: 'build_environment', arguments: { action: 'generate_lods', assetPath: '/Game/Meshes/SM_Test', lodCount: 2 }, expected: 'success or ASSET_NOT_FOUND' },
19
- { scenario: 'Bake lightmap for a small area (preview)', toolName: 'build_environment', arguments: { action: 'bake_lightmap', quality: 'Preview' }, expected: 'success - lightmap bake requested' },
20
- { scenario: 'Create landscape grass type', toolName: 'build_environment', arguments: { action: 'create_landscape_grass_type', name: 'TC_Grass', meshPath: '/Engine/BasicShapes/Cube.Cube' }, expected: 'success - grass type created' },
21
- { scenario: 'Add foliage instances', toolName: 'build_environment', arguments: { action: 'add_foliage', foliageType: 'TC_Tree', locations: [{ x: 0, y: 0, z: 0 }] }, expected: 'success - instances added' },
22
- { scenario: 'Export environment snapshot', toolName: 'build_environment', arguments: { action: 'export_snapshot', path: './tests/reports/env_snapshot.json' }, expected: 'success - snapshot exported' },
23
- { scenario: 'Import environment snapshot', toolName: 'build_environment', arguments: { action: 'import_snapshot', path: './tests/reports/env_snapshot.json' }, expected: 'success - import handled' },
24
- { scenario: 'Cleanup landscape artifacts', toolName: 'build_environment', arguments: { action: 'delete', names: ['TC_Landscape', 'TC_ProcTerrain'] }, expected: 'success or DELETE_PARTIAL' },
25
- // Additional
26
- // Real-World Scenario: Terrain Sculpting
27
- { scenario: 'Sculpting - Create Landscape', toolName: 'build_environment', arguments: { action: 'create_landscape', name: 'TC_Sculpt_Landscape', sizeX: 8, sizeY: 8 }, expected: 'success' },
28
- { scenario: 'Sculpting - Apply Noise', toolName: 'build_environment', arguments: { action: 'sculpt', name: 'TC_Sculpt_Landscape', tool: 'Noise', strength: 0.2 }, expected: 'success or LOAD_FAILED' },
29
- { scenario: 'Sculpting - Assign Material', toolName: 'build_environment', arguments: { action: 'set_landscape_material', name: 'TC_Sculpt_Landscape', materialPath: '/Engine/EngineMaterials/WorldGridMaterial.WorldGridMaterial' }, expected: 'success or LOAD_FAILED' },
30
-
31
- // Cleanup
32
- { scenario: 'Cleanup - Delete Sculpt Landscape', toolName: 'build_environment', arguments: { action: 'delete', names: ['TC_Sculpt_Landscape'] }, expected: 'success or DELETE_PARTIAL' },
33
-
34
- {
35
- scenario: "Error: Invalid sculpt tool",
36
- toolName: "build_environment",
37
- arguments: { action: "sculpt", tool: "InvalidTool" },
38
- expected: "error"
39
- },
40
- {
41
- scenario: "Edge: Landscape size 0",
42
- toolName: "build_environment",
43
- arguments: { action: "create_landscape", sizeX: 0, sizeY: 0 },
44
- expected: "error|validation|required"
45
- },
46
- {
47
- scenario: "Border: Zero density foliage",
48
- toolName: "build_environment",
49
- arguments: { action: "add_foliage", meshPath: "/Game/Valid", density: 0 },
50
- expected: "success|no_instances|LOAD_FAILED|ASSET_NOT_FOUND|INVALID_ARGUMENT"
51
- },
52
- {
53
- scenario: "Edge: Empty foliage types",
54
- toolName: "build_environment",
55
- arguments: { action: "create_procedural_foliage", foliageTypes: [] },
56
- expected: "success|no_op"
11
+ // === PRE-CLEANUP ===
12
+ {
13
+ scenario: 'Pre-cleanup: Delete test landscapes',
14
+ toolName: 'build_environment',
15
+ arguments: { action: 'delete', names: ['TC_Landscape', 'TC_ProcTerrain', 'TC_Sculpt_Landscape'] },
16
+ expected: 'success|not_found'
17
+ },
18
+
19
+ // === CREATE LANDSCAPE ===
20
+ {
21
+ scenario: 'Create small landscape',
22
+ toolName: 'build_environment',
23
+ arguments: {
24
+ action: 'create_landscape',
25
+ name: 'TC_Landscape',
26
+ sizeX: 4,
27
+ sizeY: 4,
28
+ sectionSize: 63,
29
+ sectionsPerComponent: 1
30
+ },
31
+ expected: 'success - landscape created'
32
+ },
33
+ {
34
+ scenario: 'Create medium landscape',
35
+ toolName: 'build_environment',
36
+ arguments: {
37
+ action: 'create_landscape',
38
+ name: 'TC_Landscape_Med',
39
+ sizeX: 8,
40
+ sizeY: 8,
41
+ componentCount: { x: 2, y: 2 }
42
+ },
43
+ expected: 'success'
44
+ },
45
+
46
+ // === SCULPT LANDSCAPE ===
47
+ {
48
+ scenario: 'Sculpt landscape - smooth',
49
+ toolName: 'build_environment',
50
+ arguments: { action: 'sculpt', name: 'TC_Landscape', tool: 'Smooth' },
51
+ expected: 'success or LOAD_FAILED'
52
+ },
53
+ {
54
+ scenario: 'Sculpt landscape - flatten',
55
+ toolName: 'build_environment',
56
+ arguments: { action: 'sculpt', name: 'TC_Landscape', tool: 'Flatten' },
57
+ expected: 'success or LOAD_FAILED'
58
+ },
59
+ {
60
+ scenario: 'Sculpt landscape - noise',
61
+ toolName: 'build_environment',
62
+ arguments: { action: 'sculpt', name: 'TC_Landscape', tool: 'Noise', strength: 0.3 },
63
+ expected: 'success or LOAD_FAILED'
64
+ },
65
+ {
66
+ scenario: 'Sculpt landscape (alias)',
67
+ toolName: 'build_environment',
68
+ arguments: { action: 'sculpt_landscape', landscapeName: 'TC_Landscape', tool: 'Raise', strength: 0.5 },
69
+ expected: 'success or LOAD_FAILED'
70
+ },
71
+
72
+ // === PAINT LANDSCAPE ===
73
+ {
74
+ scenario: 'Paint landscape layer',
75
+ toolName: 'build_environment',
76
+ arguments: {
77
+ action: 'paint_landscape',
78
+ landscapeName: 'TC_Landscape',
79
+ layerName: 'Grass',
80
+ position: { x: 0, y: 0, z: 0 },
81
+ brushSize: 100,
82
+ strength: 0.8
83
+ },
84
+ expected: 'success or LOAD_FAILED'
85
+ },
86
+ {
87
+ scenario: 'Paint landscape layer (alias)',
88
+ toolName: 'build_environment',
89
+ arguments: {
90
+ action: 'paint_landscape_layer',
91
+ landscapeName: 'TC_Landscape',
92
+ layerName: 'Rock',
93
+ brushSize: 50,
94
+ strength: 1.0
95
+ },
96
+ expected: 'success or LOAD_FAILED'
97
+ },
98
+
99
+ // === MODIFY HEIGHTMAP ===
100
+ {
101
+ scenario: 'Modify heightmap',
102
+ toolName: 'build_environment',
103
+ arguments: {
104
+ action: 'modify_heightmap',
105
+ landscapeName: 'TC_Landscape',
106
+ heightData: [100, 110, 105, 95],
107
+ updateNormals: true
108
+ },
109
+ expected: 'success or LOAD_FAILED'
110
+ },
111
+
112
+ // === SET LANDSCAPE MATERIAL ===
113
+ {
114
+ scenario: 'Set landscape material',
115
+ toolName: 'build_environment',
116
+ arguments: {
117
+ action: 'set_landscape_material',
118
+ name: 'TC_Landscape',
119
+ materialPath: '/Engine/EngineMaterials/WorldGridMaterial.WorldGridMaterial'
120
+ },
121
+ expected: 'success or LOAD_FAILED'
122
+ },
123
+
124
+ // === GRASS TYPE ===
125
+ {
126
+ scenario: 'Create landscape grass type',
127
+ toolName: 'build_environment',
128
+ arguments: {
129
+ action: 'create_landscape_grass_type',
130
+ name: 'TC_GrassType',
131
+ meshPath: '/Engine/BasicShapes/Cube.Cube'
132
+ },
133
+ expected: 'success - grass type created'
134
+ },
135
+
136
+ // === FOLIAGE ===
137
+ {
138
+ scenario: 'Add foliage type',
139
+ toolName: 'build_environment',
140
+ arguments: {
141
+ action: 'add_foliage',
142
+ foliageType: 'TC_Tree',
143
+ meshPath: '/Engine/BasicShapes/Cube.Cube',
144
+ density: 0.1,
145
+ minScale: 0.8,
146
+ maxScale: 1.2
147
+ },
148
+ expected: 'success - foliage added'
149
+ },
150
+ {
151
+ scenario: 'Paint foliage',
152
+ toolName: 'build_environment',
153
+ arguments: {
154
+ action: 'paint_foliage',
155
+ foliageType: 'TC_Tree',
156
+ position: { x: 0, y: 0, z: 0 },
157
+ brushSize: 100,
158
+ density: 0.5
159
+ },
160
+ expected: 'success - foliage painted'
161
+ },
162
+ {
163
+ scenario: 'Add foliage instances',
164
+ toolName: 'build_environment',
165
+ arguments: {
166
+ action: 'add_foliage_instances',
167
+ foliageType: 'TC_Tree',
168
+ locations: [{ x: 0, y: 0, z: 0 }, { x: 100, y: 0, z: 0 }, { x: 200, y: 0, z: 0 }],
169
+ randomYaw: true,
170
+ alignToNormal: true
171
+ },
172
+ expected: 'success - instances added'
173
+ },
174
+ {
175
+ scenario: 'Get foliage instances',
176
+ toolName: 'build_environment',
177
+ arguments: {
178
+ action: 'get_foliage_instances',
179
+ foliageType: 'TC_Tree',
180
+ bounds: { minX: -1000, maxX: 1000, minY: -1000, maxY: 1000 }
181
+ },
182
+ expected: 'success'
183
+ },
184
+ {
185
+ scenario: 'Remove foliage instances',
186
+ toolName: 'build_environment',
187
+ arguments: {
188
+ action: 'remove_foliage',
189
+ foliageType: 'TC_Tree',
190
+ eraseMode: true,
191
+ radius: 200,
192
+ position: { x: 0, y: 0, z: 0 }
193
+ },
194
+ expected: 'success'
195
+ },
196
+
197
+ // === PROCEDURAL TERRAIN ===
198
+ {
199
+ scenario: 'Create procedural terrain',
200
+ toolName: 'build_environment',
201
+ arguments: {
202
+ action: 'create_procedural_terrain',
203
+ name: 'TC_ProcTerrain',
204
+ location: { x: 5000, y: 0, z: 0 },
205
+ seed: 12345,
206
+ sizeX: 200,
207
+ sizeY: 200
208
+ },
209
+ expected: 'success - procedural terrain created'
210
+ },
211
+
212
+ // === PROCEDURAL FOLIAGE ===
213
+ {
214
+ scenario: 'Create procedural foliage volume',
215
+ toolName: 'build_environment',
216
+ arguments: {
217
+ action: 'create_procedural_foliage',
218
+ volumeName: 'TC_ProcFoliage',
219
+ bounds: { location: { x: 0, y: 0, z: 0 }, size: { x: 1000, y: 1000, z: 100 } },
220
+ seed: 42,
221
+ foliageTypes: []
222
+ },
223
+ expected: 'success - procedural foliage created'
224
+ },
225
+
226
+ // === LODS ===
227
+ {
228
+ scenario: 'Generate LODs',
229
+ toolName: 'build_environment',
230
+ arguments: {
231
+ action: 'generate_lods',
232
+ meshPath: '/Engine/BasicShapes/Cube',
233
+ lodCount: 3,
234
+ cullDistance: 5000
235
+ },
236
+ expected: 'success or ASSET_NOT_FOUND'
237
+ },
238
+
239
+ // === LIGHTMAP ===
240
+ {
241
+ scenario: 'Bake lightmap (preview)',
242
+ toolName: 'build_environment',
243
+ arguments: { action: 'bake_lightmap', quality: 'Preview' },
244
+ expected: 'success - lightmap bake requested'
245
+ },
246
+
247
+ // === SNAPSHOTS ===
248
+ {
249
+ scenario: 'Export environment snapshot',
250
+ toolName: 'build_environment',
251
+ arguments: { action: 'export_snapshot', filename: 'tc_env_snapshot.json' },
252
+ expected: 'success - snapshot exported'
253
+ },
254
+ {
255
+ scenario: 'Import environment snapshot',
256
+ toolName: 'build_environment',
257
+ arguments: { action: 'import_snapshot', filename: 'tc_env_snapshot.json' },
258
+ expected: 'success - import handled'
259
+ },
260
+
261
+ // === ERROR CASES ===
262
+ {
263
+ scenario: 'Error: Invalid sculpt tool',
264
+ toolName: 'build_environment',
265
+ arguments: { action: 'sculpt', tool: 'InvalidTool' },
266
+ expected: 'error'
267
+ },
268
+ {
269
+ scenario: 'Error: Landscape size 0',
270
+ toolName: 'build_environment',
271
+ arguments: { action: 'create_landscape', sizeX: 0, sizeY: 0 },
272
+ expected: 'error|validation|required'
273
+ },
274
+ {
275
+ scenario: 'Error: Invalid mesh path for foliage',
276
+ toolName: 'build_environment',
277
+ arguments: { action: 'add_foliage', meshPath: '/Game/Invalid/Mesh', density: 0.5 },
278
+ expected: 'LOAD_FAILED|ASSET_NOT_FOUND|INVALID_ARGUMENT'
279
+ },
280
+
281
+ // === EDGE CASES ===
282
+ {
283
+ scenario: 'Edge: Zero density foliage',
284
+ toolName: 'build_environment',
285
+ arguments: { action: 'add_foliage', meshPath: '/Engine/BasicShapes/Cube', density: 0 },
286
+ expected: 'success|no_instances|LOAD_FAILED|ASSET_NOT_FOUND|INVALID_ARGUMENT'
287
+ },
288
+ {
289
+ scenario: 'Edge: Empty foliage types',
290
+ toolName: 'build_environment',
291
+ arguments: { action: 'create_procedural_foliage', foliageTypes: [] },
292
+ expected: 'success|no_op'
293
+ },
294
+ {
295
+ scenario: 'Edge: Negative seed',
296
+ toolName: 'build_environment',
297
+ arguments: { action: 'create_procedural_terrain', name: 'TC_NegSeed', seed: -1 },
298
+ expected: 'success'
299
+ },
300
+
301
+ // === CLEANUP ===
302
+ {
303
+ scenario: 'Cleanup landscapes',
304
+ toolName: 'build_environment',
305
+ arguments: { action: 'delete', names: ['TC_Landscape', 'TC_Landscape_Med', 'TC_ProcTerrain'] },
306
+ expected: 'success or DELETE_PARTIAL'
307
+ },
308
+ {
309
+ scenario: 'Cleanup grass type asset',
310
+ toolName: 'manage_asset',
311
+ arguments: { action: 'delete', assetPaths: ['/Game/TC_GrassType'] },
312
+ expected: 'success|not_found'
57
313
  }
58
314
  ];
59
315