Station Editor PIE Testing Implementation Guide
March 7, 2026 · View on GitHub
Version: 1.0 Last Updated: December 6, 2025 System Status: Fully Implemented in C++, Ready for Blueprint Integration
Table of Contents
- Overview
- Prerequisites
- Quick Start
- Part 1: Blueprint Widget Setup
- Part 2: Input Binding Configuration
- Part 3: Game Integration
- Part 4: Testing in PIE
- Advanced Features
- Troubleshooting
- Reference
Overview
This guide provides step-by-step instructions for implementing and testing the Station Editor system in PIE (Play In Editor). The Station Editor allows players to construct and modify space stations by placing, removing, and connecting modules.
What You'll Build
- A runtime-accessible station editor UI
- Key binding to toggle the editor (N key)
- Full module placement, removal, and management
- Undo/redo functionality
- Construction queue system
- Real-time statistics and validation
System Architecture
┌─────────────────────────────────────────────────┐
│ Player Input (N Key Press) │
└──────────────────┬──────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────┐
│ BP_SpaceshipController (or Game HUD) │
│ - Creates WBP_StationEditor widget │
│ - Initializes UStationEditorManager │
│ - Sets up catalog and configuration │
└──────────────────┬──────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────┐
│ WBP_StationEditor (UI Widget) │
│ - Module selection grid │
│ - Station statistics display │
│ - Construction queue panel │
│ - Connection visualization │
└──────────────────┬──────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────┐
│ UStationEditorManager (C++ Manager) │
│ - Module placement logic │
│ - Validation and collision checking │
│ - Power balance calculation │
│ - Undo/redo system │
└──────────────────┬──────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────┐
│ ASpaceStation (Game World) │
│ - Actual station with modules │
│ - Visual representation │
│ - Collision and physics │
└─────────────────────────────────────────────────┘
Prerequisites
Before starting, ensure you have:
✅ Unreal Engine 5.6 installed ✅ Adastrea project opened in the editor ✅ C++ code compiled successfully ✅ Basic familiarity with UMG (Unreal Motion Graphics) ✅ Understanding of Enhanced Input System
Required C++ Classes (Already Implemented)
These classes are already in the project:
UStationEditorManager- Core editor managerUStationModuleCatalog- Module catalog data assetUStationEditorWidget- Base widget class with C++ hooksAStationBuildPreview- Preview actor for placementUStationGridSystem- Grid snapping systemASpaceStation- Station actorASpaceStationModule- Base module class
Documentation References
- StationEditorSystemGuide.md - Complete C++ API reference
- StationManagementGuide.md - Station management patterns
- PIE_TESTING_GUIDE.md - General PIE testing practices
Quick Start
TL;DR - Get the editor running in 15 minutes:
- Create
DA_StationModuleCatalogData Asset - Create
WBP_StationEditorWidget Blueprint - Add input action
IA_OpenStationEditor - Bind key in
IMC_Spaceship(N key) - Add toggle logic to Player Controller
- Press Play, approach station, press N
Part 1: Blueprint Widget Setup
Step 1.1: Create Module Catalog Data Asset
The catalog defines which modules can be built.
-
Create the Data Asset:
- Right-click in Content Browser
- Navigate to:
Content/DataAssets/Stations/ - Create folder if it doesn't exist
- Select Miscellaneous → Data Asset
- Choose StationModuleCatalog as the class
- Name it:
DA_StationModuleCatalog
-
Populate Module Entries: Open
DA_StationModuleCatalogand add entries:Module Entry 0: ├─ ModuleClass: BP_ReactorModule ├─ DisplayName: "Reactor Core" ├─ Description: "Generates power for the station" ├─ RequiredTechLevel: 1 ├─ ModuleGroup: Power ├─ BuildCost: │ ├─ Credits: 5000 │ ├─ BuildTime: 60.0 │ └─ Materials: (optional) └─ PreviewMesh: SM_Reactor_Preview Module Entry 1: ├─ ModuleClass: BP_DockingBay ├─ DisplayName: "Docking Bay" ├─ Description: "Allows ships to dock" ├─ RequiredTechLevel: 1 ├─ ModuleGroup: Docking └─ ... (configure similarly)Tip: Start with 3-5 basic modules for testing.
-
Save the catalog
Step 1.2: Create Station Editor Widget Blueprint
-
Create Widget Blueprint:
- Content Browser →
Content/UI/Station/ - Right-click → User Interface → Widget Blueprint
- Name:
WBP_StationEditor - Parent Class:
StationEditorWidget(C++ class)
- Content Browser →
-
Design the UI Layout:
Open
WBP_StationEditorin the UMG Designer:Canvas Panel (Root) ├─ Border (Background - Fullscreen) │ └─ Overlay │ ├─ Image (Semi-transparent dark background) │ └─ Horizontal Box (Main Layout) │ ├─ Left Panel (Module List) - 280px │ │ ├─ Text Block: "Available Modules" │ │ └─ Scroll Box: ModuleListScrollBox │ │ └─ (Populated at runtime) │ │ │ ├─ Center Panel (3D Viewport Area) - Fill │ │ ├─ Text Block: "Station Editor Active" │ │ └─ (Game viewport visible through transparency) │ │ │ └─ Right Panel (Statistics) - 320px │ ├─ Vertical Box │ │ ├─ Text Block: "Station Statistics" │ │ ├─ Text Block: PowerDisplay (bind to function) │ │ ├─ Text Block: ModuleCountDisplay │ │ ├─ Progress Bar: PowerBalance │ │ └─ Button: "Close Editor" │ └─ Vertical Box (Construction Queue) │ └─ (Populated at runtime) -
Create Essential Widgets:
Module List Item (
WBP_ModuleListItem):Border (150x80) └─ Vertical Box ├─ Text Block: ModuleName ├─ Text Block: Cost └─ Button: "Build"Construction Queue Item (
WBP_ConstructionQueueItem):Border └─ Horizontal Box ├─ Text Block: ModuleName ├─ Progress Bar: BuildProgress └─ Button: "Cancel"
Step 1.3: Configure Widget Blueprint Variables
In WBP_StationEditor, add these variables:
Variables:
├─ EditorManager: UStationEditorManager (Instance Editable)
├─ CurrentStation: ASpaceStation (Instance Editable)
├─ ModuleCatalog: UStationModuleCatalog (Instance Editable, default: DA_StationModuleCatalog)
├─ ModuleListScrollBox: UScrollBox (Bind to widget)
├─ PowerDisplayText: UTextBlock (Bind to widget)
├─ CloseButton: UButton (Bind to widget)
└─ bIsEditorOpen: Boolean (default: false)
Step 1.4: Implement Widget Event Graph
Event Construct
Event Construct
├─ EnsureEditorManager
│ └─ If EditorManager is null
│ └─ Create EditorManager Object
│ ├─ Outer: Self
│ └─ Class: StationEditorManager
├─ Set EditorManager Properties
│ ├─ ModuleCatalog = ModuleCatalog variable
│ ├─ PlayerTechLevel = 5 (for testing)
│ └─ PlayerCredits = 100000 (for testing)
└─ RefreshModuleList
Function: RefreshModuleList
Function: RefreshModuleList
├─ Clear ModuleListScrollBox children
├─ Get Available Modules (from EditorManager)
└─ For Each Module Entry
├─ Create WBP_ModuleListItem
├─ Set Module Data
│ ├─ Module Name
│ ├─ Build Cost
│ └─ Preview Image
├─ Bind Build Button
│ └─ On Clicked → PlaceModuleAtCursor
└─ Add to ScrollBox
Function: PlaceModuleAtCursor
Function: PlaceModuleAtCursor (ModuleClass)
├─ Get Player Controller
├─ Get Mouse Position in World
│ └─ DeprojectScreenToWorld
├─ Line Trace for placement position
│ └─ From: Camera Location
│ └─ To: Mouse direction * 10000
├─ If Hit Station or Near Station
│ ├─ EditorManager → PlaceModule
│ │ ├─ ModuleClass
│ │ ├─ Hit Location
│ │ └─ Default Rotation
│ └─ RefreshStatistics
└─ Else
└─ Show Error: "Too far from station"
Function: RefreshStatistics
Function: RefreshStatistics
├─ Get Station Statistics (from EditorManager)
├─ Update PowerDisplayText
│ └─ Format: "Power: {Generated} / {Consumed} MW"
├─ Update Module Count
│ └─ Format: "Modules: {Current} / {Max}"
└─ Update PowerBalance Progress Bar
└─ Percent = PowerGenerated / (PowerGenerated + PowerConsumed)
Event: Close Button Clicked
Event: CloseButton Clicked
├─ If EditorManager is valid
│ └─ EditorManager → Save
├─ Remove from Parent
└─ Set Input Mode Game Only
Part 2: Input Binding Configuration
Step 2.1: Create Input Action
- Navigate to
Content/Input/Actions/ - Right-click → Input → Input Action
- Name:
IA_OpenStationEditor - Configure:
- Value Type: Digital (bool)
- Trigger: Pressed (not Down)
- Consume Input: ✅ Checked
Step 2.2: Add to Input Mapping Context
- Open
Content/Input/IMC_Spaceship - Add new mapping:
Mappings: ├─ ... (existing mappings) └─ IA_OpenStationEditor └─ Key: N └─ Modifiers: (none) └─ Triggers: Pressed - Save
Step 2.3: Update Input Config Data Asset
- Open
Content/DataAssets/Input/DA_InputConfig - Add new property:
Properties: ├─ ... (existing actions) └─ OpenStationEditorAction: IA_OpenStationEditor - Save
Part 3: Game Integration
Step 3.1: Add to Player Controller
Open BP_SpaceshipController (or your game's player controller):
Add Variables
Variables:
├─ StationEditorWidget: WBP_StationEditor (null by default)
├─ bStationEditorOpen: Boolean (default: false)
├─ NearbyStation: ASpaceStation (null by default)
└─ StationSearchRadius: Float (default: 5000.0)
Implement Toggle Function
Function: ToggleStationEditor
├─ Branch: bStationEditorOpen?
│ ├─ TRUE: Close Editor
│ │ ├─ If StationEditorWidget is valid
│ │ │ ├─ StationEditorWidget → Remove from Parent
│ │ │ └─ Set StationEditorWidget = null
│ │ ├─ Set Input Mode: Game Only
│ │ └─ Set bStationEditorOpen = false
│ │
│ └─ FALSE: Open Editor
│ ├─ Find Nearby Station
│ │ └─ GetActorsInRadius (center: player pawn, radius: StationSearchRadius)
│ │ └─ Filter by ASpaceStation class
│ ├─ If Station Found
│ │ ├─ Create WBP_StationEditor Widget
│ │ ├─ Set CurrentStation = Found Station
│ │ ├─ EditorManager → BeginEditing(Station)
│ │ ├─ Add to Viewport (ZOrder: 10)
│ │ ├─ Set Input Mode: UI Only
│ │ │ └─ Widget to Focus: StationEditorWidget
│ │ └─ Set bStationEditorOpen = true
│ └─ Else
│ └─ Show Message: "No station nearby"
Bind Input Action
In Event Graph:
Event: Enhanced Input Action (IA_OpenStationEditor)
└─ ToggleStationEditor
Alternative Setup (if using DA_InputConfig):
Event BeginPlay
├─ Parent: BeginPlay
├─ Get Enhanced Input Subsystem
├─ Add Mapping Context (IMC_Spaceship)
└─ Bind Action (IA_OpenStationEditor)
└─ Triggered → ToggleStationEditor
Step 3.2: Add Station Detection Helper
Function: FindNearestStation → ASpaceStation
├─ Get All Actors of Class (ASpaceStation)
├─ Filter by Distance
│ └─ Distance < StationSearchRadius
├─ Sort by Distance
└─ Return: Closest Station (or null)
Part 4: Testing in PIE
Step 4.1: Setup Test Level
-
Create or Open Test Level:
- Use existing
TestLevelor create new - File → New Level → Empty Level
- Add: Player Start, Directional Light, Sky Atmosphere
- Use existing
-
Place a Station:
- Drag
BP_SpaceStation(or a station blueprint) into level - Position: Near player start (within 5000 units)
- Configure station:
- Add a few starting modules if desired
- Set faction (optional)
- Drag
-
Configure Game Mode:
- World Settings → Game Mode Override:
BP_SpaceGameMode - Default Pawn Class:
BP_PlayerShip - Player Controller Class:
BP_SpaceshipController
- World Settings → Game Mode Override:
-
Save Level
Step 4.2: Initial PIE Test
-
Start PIE (Alt+P)
-
Expected behavior:
- Player spawns in ship
- Station is visible nearby
- Controls work (WASD, mouse)
-
Approach Station:
- Fly toward the station
- Get within 5000 units
-
Open Station Editor:
- Press N
- Expected: UI appears with module list and statistics
-
Test Module Placement:
- Click a module from the list
- UI should show placement preview (if preview system is active)
- Click in 3D space to place
- Module appears on station
-
Test Statistics:
- Power balance updates
- Module count increases
-
Close Editor:
- Click "Close" button
- UI disappears
- Input returns to ship control
Step 4.3: Advanced Testing
Test Undo/Redo
Add Undo/Redo Buttons to WBP_StationEditor:
├─ Button: Undo (Ctrl+Z)
│ └─ On Clicked → EditorManager → Undo()
└─ Button: Redo (Ctrl+Y)
└─ On Clicked → EditorManager → Redo()
Test:
1. Place several modules
2. Click Undo - last module removed
3. Click Redo - module returns
Test Construction Queue
Add Queue Panel:
├─ Text Block: "Construction Queue"
└─ Scroll Box: QueueListScrollBox
Function: RefreshConstructionQueue
├─ Clear QueueListScrollBox
├─ Get Construction Queue (from EditorManager)
└─ For Each Queue Item
├─ Create WBP_ConstructionQueueItem
├─ Set Item Data
│ ├─ Module Name
│ ├─ Progress (TimeRemaining / TotalBuildTime)
│ └─ Bind Cancel Button
└─ Add to ScrollBox
Test:
1. Queue multiple modules
2. Watch progress bars update
3. Test cancel functionality
Test Power Validation
Add validation feedback:
├─ Before placing module
│ └─ EditorManager → WouldCausePowerDeficit(ModuleClass)
├─ If deficit detected
│ ├─ Show warning icon
│ └─ Optionally disable placement
└─ Test by placing many power-consuming modules
Test:
1. Place reactor (power generation)
2. Place many power-consuming modules
3. Verify warning when power would be exceeded
Test Module Connections
Add Connections Visualization:
├─ Get All Connections (from EditorManager)
└─ For Each Connection
├─ Draw Debug Line (or use Widget Component)
│ └─ From: ModuleA Location
│ └─ To: ModuleB Location
└─ Color by ConnectionType
├─ Power: Yellow
├─ Data: Blue
└─ LifeSupport: Green
Test:
1. Place adjacent modules
2. EditorManager → AutoGenerateConnections
3. Verify lines appear between modules
Step 4.4: Performance Testing
-
Test with Many Modules:
- Place 20-50 modules
- Check frame rate
- Monitor statistics refresh rate
-
Stress Test:
- Rapid placement and removal
- Quick undo/redo actions
- Check for memory leaks
-
UI Responsiveness:
- Scroll through long module lists
- Toggle view modes quickly
- Check notification system with many messages
Advanced Features
Feature 1: Module Preview System
Show a preview of where the module will be placed.
Function: UpdatePlacementPreview
├─ Get Mouse World Position (line trace)
├─ If SelectedModuleClass is valid
│ ├─ EditorManager → ShowPreview(SelectedModuleClass)
│ ├─ EditorManager → UpdatePreview(HitLocation, DefaultRotation)
│ └─ Check Placement Validity
│ ├─ EditorManager → CanPlaceModule
│ ├─ If valid → Preview color: Green
│ └─ If invalid → Preview color: Red
└─ Else
└─ EditorManager → HidePreview()
Call this function:
- On Tick (or Timer every 0.1s)
- Only when editor is open and module selected
Feature 2: Camera Control
Allow players to rotate around station while editing.
Add Camera Controls:
├─ Middle Mouse Button: Rotate camera
├─ Mouse Wheel: Zoom in/out
└─ Right Mouse Button: Pan camera
Implementation:
1. Store camera pivot point (station center)
2. On mouse input:
├─ Rotate pivot
├─ Update camera position
└─ Maintain distance from pivot
3. Reset camera when editor closes
Feature 3: Module Search and Filters
Add Search Box:
├─ Editable Text: SearchBox
└─ On Text Changed
├─ Filter module list by name
└─ RefreshModuleList (with filter)
Add Filter Buttons:
├─ Button: All Modules
├─ Button: Power Modules
├─ Button: Docking Modules
├─ Button: Storage Modules
└─ Button: Defense Modules
Each button:
└─ Set ModuleGroupFilter
└─ RefreshModuleList (with filter)
Feature 4: Hotkeys
Add Hotkey Support:
├─ Ctrl+Z: Undo
├─ Ctrl+Y: Redo
├─ Delete: Remove selected module
├─ R: Rotate selected module
├─ G: Toggle grid snapping
└─ Esc: Close editor
Implementation in Widget:
Override OnKeyDown event
├─ Switch on Key
│ ├─ Z (with Ctrl): Call Undo
│ ├─ Y (with Ctrl): Call Redo
│ ├─ Delete: Remove selected
│ └─ Esc: Close editor
└─ Return: Handled
Feature 5: Notifications System
Display editor messages to the player.
Add Notification Panel:
├─ Vertical Box: NotificationList (bottom-right)
└─ Function: ShowNotification(Message, Severity)
├─ Create notification widget
│ ├─ Text: Message
│ ├─ Color by severity
│ │ ├─ Info: Blue
│ │ ├─ Warning: Yellow
│ │ ├─ Error: Red
│ │ └─ Success: Green
│ └─ Auto-dismiss after 5 seconds
└─ Add to NotificationList
Bind to EditorManager events:
├─ OnModulePlaced → "Module placed successfully"
├─ OnModuleRemoved → "Module removed"
├─ OnPowerBalanceChanged → "Power balance updated"
└─ On validation failure → Show error reason
Feature 6: Save/Load Station Layouts
Add Save/Load Buttons:
├─ Button: "Save Layout"
│ └─ Save station module configuration to file
└─ Button: "Load Layout"
└─ Load and apply saved configuration
Implementation:
├─ Serialize station data
│ └─ Array of: ModuleClass, Position, Rotation
├─ Save to JSON or Blueprint SaveGame
└─ Load and reconstruct on demand
Troubleshooting
Issue: Widget Not Appearing
Symptoms: N key pressed, nothing happens
Solutions:
- Check Output Log for errors
- Verify Input Action is bound correctly
- Check widget is being created (add Print String)
- Ensure Input Mode is set to UI Only
- Check widget Z-order (should be > 0)
Debug:
In ToggleStationEditor, add:
├─ Print String: "Toggle called"
├─ After Create Widget: Print: "Widget created"
└─ After Add to Viewport: Print: "Widget added"
Issue: No Nearby Station Found
Symptoms: Message "No station nearby" always shows
Solutions:
- Verify station is placed in level
- Check search radius (increase to 10000 for testing)
- Ensure station class matches (ASpaceStation)
- Add debug sphere to visualize radius
Debug:
In FindNearestStation:
├─ Draw Debug Sphere (Radius: StationSearchRadius)
└─ Print: "Stations found: {Count}"
Issue: Modules Not Placing
Symptoms: Click on module, nothing spawns
Solutions:
- Check EditorManager is valid
- Verify BeginEditing was called
- Check CanPlaceModule result
- Verify module class is valid
- Check collision settings
Debug:
In PlaceModuleAtCursor:
├─ Print: "Attempting to place: {ModuleClass}"
├─ Check CanPlaceModule result
│ └─ Print result enum value
└─ After PlaceModule call
├─ Print: "Module placed: {Module is valid?}"
└─ If null, print error from EditorManager
Issue: Statistics Not Updating
Symptoms: Power balance, module count don't change
Solutions:
- Ensure RefreshStatistics is called after placement
- Bind to EditorManager events
- Check EditorManager → GetStationStatistics returns valid data
- Verify station has modules array populated
Debug:
In RefreshStatistics:
├─ Print: "Refreshing stats"
├─ Get Statistics
│ └─ Print: "Power: {PowerGenerated} / {PowerConsumed}"
│ └─ Print: "Modules: {TotalModules}"
└─ If all zeros, check station data
Issue: Editor Doesn't Close
Symptoms: UI stuck on screen, input not responding
Solutions:
- Verify Remove from Parent is called
- Check Set Input Mode is called
- Ensure widget reference is cleared
- Try ESC key as alternative close method
Debug:
In Close function:
├─ Print: "Closing editor"
├─ After Remove from Parent: Print: "Removed"
└─ After Input Mode: Print: "Input restored"
Issue: Preview Not Showing
Symptoms: No visual feedback when selecting modules
Solutions:
- Check AStationBuildPreview spawns correctly
- Verify EditorManager → ShowPreview is called
- Check preview materials are assigned
- Ensure preview actor is not hidden
Debug:
After ShowPreview:
├─ Print: "Preview shown for: {ModuleClass}"
├─ Check PreviewActor is valid
└─ Check PreviewActor visibility
Issue: Performance Lag
Symptoms: Editor feels slow or choppy
Solutions:
- Reduce statistics refresh frequency (use Timer, not Tick)
- Limit module list to visible items only
- Use object pooling for list items
- Disable unnecessary visual effects
- Check for expensive Blueprint operations in Tick
Optimization:
Instead of Tick:
├─ Use Timer (0.5 second interval)
│ └─ RefreshStatistics
└─ Only refresh on events when possible
└─ Bind to OnModulePlaced, OnModuleRemoved
Reference
Key C++ Classes
UStationEditorManager
Primary C++ manager class providing all editing functionality.
Key Functions:
BeginEditing(Station)- Start editing sessionPlaceModule(Class, Position, Rotation)- Place a moduleRemoveModule(Module)- Remove a moduleCanPlaceModule(Class, Position, Rotation)- Validate placementGetStationStatistics()- Get current statsUndo()/Redo()- Undo/redo operationsSave()/Cancel()- End editing
Key Events:
OnModulePlaced- Module successfully placedOnModuleRemoved- Module removedOnPowerBalanceChanged- Power changedOnStatisticsUpdated- Stats recalculated
UStationModuleCatalog
Data Asset containing available modules.
Key Functions:
GetAvailableModules()- Get all modulesGetModulesByGroup(Group)- Filter by groupGetModulesByTechLevel(Level)- Filter by tech levelGetModuleBuildCost(Class)- Get build cost
UStationEditorWidget
Base C++ widget class with Blueprint integration points.
Inherited Functions:
AddModule(Class, Location)- Add moduleRemoveModule(Module)- Remove moduleGetAllModules()- Get station modules- All manager pass-through functions
Enums
EModulePlacementResult
Success- Module placed successfullyInvalidModule- Module class is null or invalidInvalidPosition- Position is not validCollisionDetected- Collision with existing moduleInsufficientPower- Not enough power availableInsufficientTech- Tech level too lowInsufficientFunds- Not enough creditsNoStation- No station selectedNotEditing- Not in edit mode
EStationModuleGroup
All- All modules (catch-all, used for filtering)Docking- Docking baysPower- Reactors and powerStorage- Cargo storageProcessing- Manufacturing and processingDefence- Weapons and shieldsHabitation- Living quarters and crew spacesPublic- Public/trade areas (markets, commerce)Connection- Connectors, corridors, linksOther- Miscellaneous/uncategorized modules
EStationEditorViewMode
Edit- Standard editing modePreview- Preview-only modeConnections- Connection visualization mode
Structs
FStationStatistics
int32 TotalModules
int32 MaxModules
int32 CurrentPopulation
int32 MaxPopulation
float PowerGenerated
float PowerConsumed
float DefenseRating
float EfficiencyRating
float CargoCapacity
float CargoUsed
FConstructionQueueItem
int32 QueueId
TSubclassOf<ASpaceStationModule> ModuleClass
FVector TargetPosition
FRotator TargetRotation
float TotalBuildTime
float TimeRemaining
bool bIsBuilding
bool bIsPaused
FModuleConnection
ASpaceStationModule* ModuleA
ASpaceStationModule* ModuleB
EModuleConnectionType ConnectionType
bool bIsActive
float Capacity
float CurrentUsage
HTML Mockups
Visual design references:
STATION_EDITOR_MOCKUP.html- Main editor UI mockupSTATION_EDITOR_CONNECTIONS_MOCKUP.html- Connections view mockup
Open these in a browser to see intended visual design.
Configuration Files
Module Catalog Example:
Content/DataAssets/Stations/DA_StationModuleCatalog
├─ Entry 0: Reactor Module
│ ├─ Class: BP_ReactorModule
│ ├─ Tech: 1, Cost: 5000, Time: 60s
│ └─ Group: Power
├─ Entry 1: Docking Bay
│ └─ ... (similar structure)
└─ Entry N: ...
Input Configuration:
Content/Input/IMC_Spaceship
├─ ... (existing mappings)
└─ IA_OpenStationEditor → N
Testing Checklist
Use this checklist for thorough PIE testing:
- Widget appears when N key pressed
- Widget disappears when closed
- Module list populates correctly
- Modules can be selected
- Modules can be placed
- Modules appear in 3D world
- Statistics update correctly
- Power balance calculated
- Module count accurate
- Undo removes last module
- Redo restores module
- Construction queue works
- Queue progress updates
- Can cancel queued items
- Placement validation works
- Collision detection works
- Tech level filtering works
- Cost checking works
- Preview system works (if implemented)
- Camera controls work (if implemented)
- Hotkeys work (if implemented)
- Notifications appear (if implemented)
- No performance issues
- No memory leaks
- No crash scenarios
Next Steps
After completing PIE testing:
-
Polish the UI:
- Improve visual design
- Add animations
- Enhance user feedback
-
Add Advanced Features:
- Module rotation control
- Module upgrading
- Module selling/scrapping
- Station templates
-
Integration:
- Connect to trading system
- Add faction restrictions
- Integrate with crew management
- Add quest triggers
-
Multiplayer Support:
- Server-side validation
- Replication setup
- Permission system
- Conflict resolution
-
Production Readiness:
- Localization
- Accessibility
- Tutorial integration
- Help system
Related Documentation
- StationEditorSystemGuide.md - Complete C++ API
- StationManagementGuide.md - Station management patterns
- PIE_TESTING_GUIDE.md - General PIE testing
- BLUEPRINT_QUICK_START_PIE.md - Blueprint PIE basics
- SpaceStationModule System - Station C++ source
Version History:
- 1.0 (2025-12-06): Initial comprehensive PIE testing guide
Maintained by: Adastrea Development Team Last Updated: December 6, 2025
Quick Reference Card
┌─────────────────────────────────────────────────────────┐
│ STATION EDITOR QUICK REFERENCE │
├─────────────────────────────────────────────────────────┤
│ Key Binding: N (toggle editor) │
│ Close Editor: ESC or Close button │
│ Place Module: Click module, click in 3D space │
│ Remove Module: Select module, Delete key │
│ Undo: Ctrl+Z │
│ Redo: Ctrl+Y │
│ Rotate Module: R key (if implemented) │
│ Toggle Grid: G key (if implemented) │
├─────────────────────────────────────────────────────────┤
│ Required Assets: │
│ ├─ DA_StationModuleCatalog (Data Asset) │
│ ├─ WBP_StationEditor (Widget Blueprint) │
│ ├─ IA_OpenStationEditor (Input Action) │
│ └─ Module Blueprints (BP_ReactorModule, etc.) │
├─────────────────────────────────────────────────────────┤
│ Common Issues: │
│ ├─ Widget not appearing → Check Input binding │
│ ├─ No station found → Increase search radius │
│ ├─ Modules not placing → Check collision/validation │
│ └─ Stats not updating → Call RefreshStatistics │
└─────────────────────────────────────────────────────────┘
End of Guide