Lobby → 🎨 Game Editor
1. Click "🎯 Toggle Placement Tools"
2. Select marker type
3. Click on terrain
4. Edit properties
5. Save
Click "💾 Save Scene" → Downloads JSON
| Icon | Type | Use For | Key Properties |
|---|---|---|---|
| 👤 | NPC | Friendly characters | npcId, name, dialogue |
| 👹 | Enemy | Monster spawns | enemyId, level, health, damage |
| 🏪 | Vendor | Merchants | vendorId, shopType, inventory |
| 🎯 | Player Spawn | Start locations | spawnId, team, priority |
| 🌀 | Warp Point | Teleporters | targetScene, targetPosition |
| ⚡ | Respawn | Death respawn | respawnId, checkpoint |
| 📜 | Quest Giver | Quest NPCs | questGiverId, quests |
| 💎 | Treasure | Loot chests | treasureId, loot |
| ⚙️ | Trigger | Event zones | triggerId, action, radius |
W - Position gizmo
E - Rotation gizmo
R - Scale gizmo
Delete - Remove marker
Escape - Deselect / Exit mode
import { MarkerLoader } from './src/utils/markerLoader.js';
import { getAssetLibrary } from './src/assets/index.js';
const assetSystems = getAssetLibrary(scene);
const markerLoader = new MarkerLoader(scene, assetSystems);
await markerLoader.loadFromFile('./config/archipelago_scene.json');// Automatic via MarkerLoader
const enemy = await markerLoader.spawnFromMarker(markerData);
// Manual
const { enemyManager } = getAssetLibrary(scene);
const enemy = await enemyManager.spawn(
markerData.data.enemyId,
position,
markerData.data
);const spawn = markerLoader.getPlayerSpawn(priority);
character.position = spawn.position.clone();scene.meshes.forEach(mesh => {
if (mesh.metadata?.isWarpPoint) {
console.log('Warp to:', mesh.metadata.targetScene);
}
});src/editor/
├── MarkerDefinitions.js # Marker configs
├── PlacementTools.js # Core logic
└── PlacementToolsUI.js # UI panel
src/utils/
└── markerLoader.js # Runtime loader
src/scene/scenes/
├── archipelagoEditor.js # Editor scene
└── archipelago.js # Game scene (with loader)
docs/
├── PLACEMENT_TOOLS_GUIDE.md # Full guide
├── PLACEMENT_TOOLS_IMPLEMENTATION.md # Tech details
└── QUICK_REFERENCE_PLACEMENT_TOOLS.md # This file
// 1. Add to MarkerTypes enum
export const MarkerTypes = {
// ...
MY_NEW_TYPE: 'my_new_type'
};
// 2. Add config
export const MarkerConfig = {
[MarkerTypes.MY_NEW_TYPE]: {
name: 'My New Type',
icon: '🆕',
color: new BABYLON.Color3(1, 0, 0),
size: 1.5,
defaultData: { /* properties */ }
}
};
// 3. Add spawn handler in MarkerLoader
async spawnMyNewType(markerData, position) {
// Implementation
}const markers = editorState.placementTools.exportMarkers();
console.log(JSON.stringify(markers, null, 2));const markers = [ /* marker data */ ];
editorState.placementTools.importMarkers(markers);const enemies = placementTools.getMarkersByType('enemy');
const npcs = placementTools.getMarkersByType('npc');Markers not appearing?
// Check placement tools initialized
console.log(window.EDITOR_STATE.placementTools);
// Check markers array
console.log(placementTools.getAllMarkers());Properties not saving?
// Check marker metadata
console.log(marker.metadata);
// Verify save was called
marker.metadata.lastModified // Should updateRuntime spawning fails?
// Check asset systems available
const { enemyManager, characterManager } = getAssetLibrary(scene);
console.log(enemyManager, characterManager);
// Check marker data format
console.log(markerData.type, markerData.data);{
"type": "enemy",
"position": { "x": 0, "y": 0, "z": 0 },
"rotation": { "x": 0, "y": 0, "z": 0 },
"data": {
"enemyId": "slime",
"level": 5,
"health": 100
},
"createdAt": "2024-12-24T18:00:00.000Z",
"lastModified": "2024-12-24T18:00:00.000Z"
}NPC: Blue (0.3, 0.7, 1.0)
Enemy: Red (1.0, 0.2, 0.2)
Vendor: Gold (1.0, 0.8, 0.2)
Player Spawn: Green (0.2, 1.0, 0.2)
Warp: Purple (0.8, 0.2, 1.0)
Respawn: Yellow (1.0, 1.0, 0.2)
Quest: Orange (1.0, 0.6, 0.2)
Treasure: Cyan (0.2, 0.8, 0.8)
Trigger: Gray (0.5, 0.5, 0.5)- Limit Markers - Keep under 100 per scene
- Use Triggers Wisely - Large radius = more checks
- Batch Spawns - Load all markers at scene start
- Dispose Unused - Clear markers when changing scenes
- Optimize Meshes - Use low-poly marker visuals
✅ DO:
- Use descriptive IDs
- Test spawn points in-game
- Save frequently
- Version control JSON files
- Document custom properties
❌ DON'T:
- Place markers inside geometry
- Use duplicate IDs
- Edit JSON manually (use editor)
- Forget to export after changes
- Place too many enemies in one area
- EnemyManager - Spawns enemies from markers
- CharacterManager - Spawns NPCs/vendors
- AssetLibrary - Manages asset references
- SceneManager - Loads scenes with markers
- SettingsManager - Editor preferences
For detailed information, see:
docs/PLACEMENT_TOOLS_GUIDE.md- User guidedocs/PLACEMENT_TOOLS_IMPLEMENTATION.md- Technical detailssrc/editor/MarkerDefinitions.js- Marker configssrc/utils/markerLoader.js- Runtime loading