Updated README_scenario_design.md with new grid-based room layout system: - Documented Grid Unit (GU) system: 5×4 tiles base unit - Added valid room size specifications (widths: multiples of 5, heights: 2+4N) - Replaced old north/south-only constraints with four-direction support - Updated door placement rules for N/S/E/W connections - Added room positioning algorithm documentation - Revised scenario design guidelines for grid system flexibility Created 5 comprehensive test scenarios: 1. test_vertical_layout.json - Traditional N/S stacking 2. test_horizontal_layout.json - E/W connections 3. test_complex_multidirection.json - All four directions 4. test_multiple_connections.json - Multiple doors per direction 5. test_mixed_room_sizes.json - Different room sizes (1×1, 1×2, 2×2 GU) Added TEST_SCENARIOS_README.md documenting: - Grid system overview and room size specifications - Detailed test scenario descriptions with layout diagrams - Testing procedures and validation checks - Expected console output examples - Troubleshooting guide Note: Scenarios reference hall_1x2gu.json and small_room_1x1gu.json which need to be created in assets/rooms/. Currently using 2×2 GU placeholders. All test scenarios include: - Visual layout diagrams in scenario_brief - Progressive difficulty with locks and keys - Documentation of what each scenario tests - Notes explaining grid system concepts
11 KiB
Scenario Design Constraints in Hacktivity Cyber Security Labs
There are several constraints and patterns for designing scenarios for BreakEscape.
Scenario Structure Constraints
Basic Structure
- Each scenario must have a
scenario_briefthat explains the mission - Each scenario must define a
startRoomwhere the player begins - Some scenarios include an
endGoalproperty (like in biometric_breach.json) - All scenarios must have a
roomsobject containing individual room definitions
Room Connections
Rooms can connect in four directions: north, south, east, west
Connection Syntax:
"connections": {
"north": "office1", // Single connection
"south": ["reception", "hall"], // Multiple connections (array)
"east": "serverroom",
"west": ["closet1", "closet2"]
}
Key Points:
- All directions support both single connections (string) and multiple connections (array)
- The room layout algorithm positions rooms using breadth-first traversal
- Multiple rooms in the same direction are positioned side-by-side (N/S) or stacked (E/W)
- All rooms align to grid boundaries for consistent door placement
Door Validation and Locking
The code in validateDoorsByRoomOverlap() (lines 3236-3323) shows that:
- Doors must connect exactly two rooms (line 3281)
- If a door connects to a locked room, the door inherits the lock properties (lines 3296-3303)
- Doors that don't connect exactly two rooms are removed (lines 3281-3291)
Designing Solvable Scenarios with the Grid System
The grid-based room layout system provides significant flexibility for scenario design:
-
Flexible Layout Patterns: Design scenarios using any combination of directions:
- Vertical: Stack rooms north/south for traditional layouts
- Horizontal: Connect rooms east/west for wide facilities
- Mixed: Combine directions for complex, non-linear layouts
- Branching: All directions support multiple connections
-
Room Size Variety: Mix different room sizes for visual interest and gameplay:
- Use 1×1 GU closets for small storage rooms or utility spaces
- Use 2×2 GU standard rooms for offices, reception areas
- Use 1×2 GU or 4×1 GU halls to connect distant areas
- Ensure all room dimensions follow the valid size formula
-
Lock Progression: Design logical progression through the facility:
- Place keys, codes, and unlock items in accessible rooms first
- Create puzzles that require backtracking or exploring side rooms
- Use east/west connections for optional areas with bonus items
- Layer security with multiple lock types (key → PIN → biometric)
-
Connection Planning:
- Start by sketching your layout on grid paper (5-tile width increments)
- Ensure all rooms are reachable from the starting room
- Verify room dimensions before creating Tiled maps
- Test door alignment between connected rooms
-
Avoid Common Pitfalls:
- Invalid heights: Heights of 7, 8, 9, 11, 12, 13 will cause issues
- Room overlaps: System validates and warns, but plan carefully
- Disconnected rooms: Ensure all rooms connect to the starting room
- Asymmetric connections: When connecting single-door to multi-door rooms, the system handles alignment automatically
Example Layout Structures
Vertical Tower (traditional):
[Server Room]
↑
[CEO Office]
↑
[Office1] [Office2]
↑ ↑
[Reception]
Horizontal Facility (wide):
[Closet1] ← [Office] → [Meeting] → [Server]
↑
[Reception]
Complex Multi-Direction:
[Storage] [CEO]
↑ ↑
[Closet] ← [Office] → [Server]
↑
[Reception]
With Hallways:
[Office1] [Office2]
↑ ↑
[---- Hall ----]
↑
[Reception]
These layouts demonstrate the flexibility of the new grid system for creating engaging, solvable scenarios.
Room Properties
- Each room has a
typeproperty (e.g., "room_reception", "room_office", "room_ceo", "room_servers", "room_closet") - Rooms can be
lockedwith different lock types:lockType: "key", "pin", "password", "bluetooth", or "biometric"requires: The specific key_id, PIN code, password, MAC address, or fingerprint owner name needed- For biometric locks, a
biometricMatchThresholdcan be specified (e.g., 0.5, 0.7, 0.9)
- Each room contains an array of
objectsthat players can interact with
Object Properties
- Objects must have a
type(e.g., "phone", "notes", "pc", "key", "safe", "suitcase", "fingerprint_kit") - Objects must have a
namefor display purposes - Objects have a
takeableboolean property indicating if they can be added to inventory - Objects can have
observationstext that describes what the player sees - Readable objects have a
readableproperty andtextcontent - Objects can be locked with the same lock types as rooms
- Container objects (like safes and suitcases) can have
contentsarrays with nested objects
Starting Inventory
- Use the
startItemsInInventoryarray at the root level of your scenario - Players will have these items automatically when they start the game
- Example:
{
"scenario_brief": "...",
"startRoom": "reception",
"startItemsInInventory": [
{
"type": "workstation",
"name": "Crypto Analysis Station",
"takeable": true,
"observations": "A powerful workstation for cryptographic analysis"
}
],
"rooms": { ... }
}
Special Object Types
fingerprint_kit: Used to collect fingerprintsworkstation: For cryptographic analysisbluetooth_scanner: For detecting Bluetooth deviceslockpick: For picking locks- Objects can have
hasFingerprintwith properties likefingerprintOwnerandfingerprintDifficulty
Room Layout System (Grid-Based)
The game uses a grid unit system for room positioning that supports variable room sizes and four-direction connections.
Grid Unit System
- Base Grid Unit (GU): 5 tiles wide × 4 tiles tall (160px × 128px)
- Tile Size: 32px × 32px
- Room Structure:
- Top 2 rows: Visual wall (overlaps room to north)
- Middle rows: Stackable area (used for positioning calculations)
- All rooms must be multiples of grid units
Valid Room Sizes
Width: Must be multiple of 5 tiles (5, 10, 15, 20, 25...)
Height: Must follow formula 2 + (N × 4) where N ≥ 1
- Valid heights: 6, 10, 14, 18, 22, 26... (increments of 4 after initial 2)
- Invalid heights: 7, 8, 9, 11, 12, 13...
Examples:
- 1×1 GU (Closet): 5×6 tiles = 160×192px
- 2×2 GU (Standard): 10×10 tiles = 320×320px
- 1×2 GU (Hall): 5×10 tiles = 160×320px
- 4×1 GU (Wide Hall): 20×6 tiles = 640×192px
Room Positioning Algorithm
- The
startRoomis positioned at grid coordinates (0,0) - Rooms are positioned outward from the starting room using breadth-first traversal
- Rooms align to grid boundaries using
Math.floor()for consistent rounding - North/South: Rooms stack vertically, centered or side-by-side when multiple
- East/West: Rooms align horizontally, stacked vertically when multiple
- All positions are validated to detect overlaps
Door Placement Rules
North/South Doors:
- Size: 1 tile wide × 2 tiles tall
- Single door: Placed in corner (NW or NE), determined by grid coordinates using
(gridX + gridY) % 2 - Multiple doors: Evenly spaced across room width with 1.5 tile inset from edges
East/West Doors:
- Size: 1 tile wide × 1 tile tall
- Single door: North corner of edge, 2 tiles from top
- Multiple doors: First at north corner, last 3 tiles up from south, others evenly spaced
Alignment: Doors must align perfectly between connecting rooms. Special logic handles asymmetric connections (single door to multi-door room).
Four-Direction Connections
Unlike the old system (north/south only), the new system supports:
- North: Connects to rooms above
- South: Connects to rooms below
- East: Connects to rooms on the right
- West: Connects to rooms on the left
Each direction supports multiple connections (arrays).
Designing Solvable Scenarios
Based on the grid-based room layout system, here are comprehensive guidelines for creating solvable scenarios:
-
Clear Progression Path: Design a logical sequence of rooms that can be unlocked in order
- Ensure keys/codes for locked rooms are obtainable before they're needed
- Use the four-direction connection system to create interesting navigation puzzles
-
Tool Placement: Place necessary tools early in the scenario
- Critical tools like fingerprint kits, lockpicks, or bluetooth scanners should be available before they're needed
- Consider adding some tools to the initial inventory with
startItemsInInventory
-
Clue Distribution: Spread clues logically throughout the scenario
- Place hints for codes/passwords in accessible locations
- Use readable objects (notes, phones, computers) to provide guidance
-
Lock Complexity Progression: Increase difficulty gradually
- Start with simpler locks (keys, simple PINs)
- Progress to more complex locks (biometric with high thresholds)
-
Nested Containers: Use containers within containers strategically
- Don't create unsolvable dependency loops (e.g., key A locked in a box requiring key B, which is locked in a box requiring key A)
-
End Goal Items: For scenarios with specific goals (like recovering the prototype in biometric_breach.json):
- Mark important items with
important: true - Use
isEndGoal: truefor the final objective item
- Mark important items with
-
Room Layout with Grid System: Design layouts using the grid unit system
- Use valid room sizes (widths: multiples of 5 tiles; heights: 2 + 4N where N ≥ 1)
- Mix room sizes for variety (1×1 GU closets, 2×2 GU standard rooms, hallways)
- Leverage all four directions (north, south, east, west) for complex layouts
- Ensure all rooms are reachable from the starting room
-
Fingerprint Mechanics: When using biometric locks:
- Ensure the required fingerprints can be collected from objects in accessible rooms
- Set appropriate difficulty thresholds (higher = more difficult)
-
Testing Your Scenario:
- Verify all room dimensions follow the valid size formula
- Check that all rooms connect properly (no isolated rooms)
- Ensure door alignment by testing connections between different-sized rooms
- Play through to verify the scenario is solvable
By following these constraints and guidelines, you can create scenarios that are both technically valid for the game engine and provide an engaging, solvable experience for players.