Created detailed implementation plan for redesigning the room layout system to support variable room sizes and four-direction connections. Core Concepts: - Grid unit system (5×4 tiles base, excluding 2-tile visual top) - Valid room heights: 6, 10, 14, 18, 22, 26... (formula: 2 + 4N) - Breadth-first room positioning from starting room - Deterministic door placement with alignment for asymmetric connections - Comprehensive scenario validation Documents Created: - OVERVIEW.md: High-level goals and changes - TERMINOLOGY.md: Definitions and concepts - GRID_SYSTEM.md: Grid unit system specification - POSITIONING_ALGORITHM.md: Room positioning logic - DOOR_PLACEMENT.md: Door placement rules and algorithms - WALL_SYSTEM.md: Wall collision system updates - VALIDATION.md: Scenario validation system - IMPLEMENTATION_STEPS.md: Step-by-step implementation guide - TODO_LIST.md: Detailed task checklist - README.md: Quick start and overview Review & Critical Fixes: - review1/CRITICAL_REVIEW.md: Identified 4 critical issues - review1/RECOMMENDATIONS.md: Solutions for all issues - UPDATED_FILES_SUMMARY.md: Integration of review feedback Critical Issues Identified & Resolved: 1. Grid height calculation (now: 6, 10, 14, 18...) 2. Door alignment for asymmetric connections (solution documented) 3. Code duplication (shared module approach specified) 4. Disconnected rooms (validation added) Implementation Strategy: - Incremental approach with feature flag - Phase 1: Constants and helpers - Phase 2a: North/South positioning - Phase 2b: East/West support - Phase 3: Door placement with critical fixes - Phase 4: Validation - Phase 5-6: Testing and documentation Estimated time: 18-26 hours Confidence: 9/10 (all critical issues addressed) Ready for implementation.
14 KiB
Critical Review of Room Layout Implementation Plan
Executive Summary
The implementation plan is comprehensive and well-structured. However, there are several critical issues and edge cases that need to be addressed to ensure successful implementation.
Overall Assessment: 7/10
- Strong: Clear documentation, systematic approach, good testing strategy
- Weak: Some edge cases not fully addressed, potential performance issues, migration complexity
Critical Issues
Issue 1: Grid Height Calculation Ambiguity
Problem: The grid height calculation has an ambiguity.
Current spec states:
- Standard room: 10×8 tiles
- Grid height = (8 - 2) / 4 = 1.5 grid units
This creates fractional grid units, but the plan states rooms must be in whole multiples of grid units.
Impact: HIGH
- Affects room size validation
- Affects positioning calculations
- Could cause rounding errors
Recommendation:
- Clarify: Should standard rooms be 10×10 tiles total (8 stackable + 2 visual)?
- Or: Should standard rooms be 10×8 tiles total (6 stackable + 2 visual)?
- Proposed Solution: Standard rooms should be 10×8 tiles where:
- Visual top: 2 tiles
- Stackable area: 6 tiles (not 8!)
- This gives gridHeight = 6/4 = 1.5... still fractional
Alternative Approach:
- Redefine grid unit height as 3 tiles (not 4)
- Standard room: 10×8 = 2×2 grid units (visual: 2, stackable: 6 = 2×3)
- Closet: 5×5 = 1×1 grid units (visual: 2, stackable: 3 = 1×3)
- This eliminates fractions entirely
OR
- Keep grid as 5×4 but measure total height including visual:
- Closet: 5×6 tiles = 1×1.5 grid units (still fractional)
- Standard: 10×10 tiles = 2×2.5 grid units (still fractional)
NEEDS CLARIFICATION FROM USER
Issue 2: Door Overlap at Room Connections
Problem: When two rooms connect, both create door sprites at the same position. The plan mentions this creates "layered doors" which is intentional, but doesn't fully explain the interaction model.
Current Behavior:
- Room A has door to Room B (locked with Room B's lock)
- Room B has door to Room A (locked with Room A's lock? or always open?)
Questions:
- Do both doors have the same lock properties?
- Which door does the player interact with?
- What happens when one door is open but the other is closed?
Recommendation:
- Document the door interaction model clearly
- Consider: Only create door sprite from the "locked" side
- Or: Create single shared door sprite
- Add validation to ensure door lock consistency
Issue 3: Stacking Height in Overlap Detection
Problem: The plan uses "stacking height" for overlap detection, but this might not be correct for visual accuracy.
When Room A is north of Room B:
[Room A] <- bottom tiles visible
[Room B] <- top wall tiles visible
Room B's visual top wall (2 tiles) overlaps Room A's visual floor. This is intentional and correct for rendering, but the overlap detection treats it as non-overlapping.
Impact: MEDIUM
- Visual overlap is desired for rendering
- But positioning overlap is not desired
- Need to ensure both are handled correctly
Recommendation:
- Clarify that overlap detection should use stacking height (excluding visual top)
- Add visual overlap diagram to documentation
- Ensure rendering depth handles overlapping visual elements
Issue 4: East/West Door Placement for Different Heights
Problem: The plan specifies door placement for east/west connections with different heights, but doesn't fully address all cases.
When a tall room (16 tiles high) connects east to a short room (8 tiles high):
[Tall ]
[Room ][Short]
[ ]
The plan states:
- "First door: north corner (2 tiles from top)"
- "Second door: 3 tiles up from south"
But what if the short room is only 8 tiles tall?
-
North corner: Y = roomY + 64px
-
South position: Y = roomY + heightPx - 96px
- For 8 tile room: Y = roomY + 256 - 96 = roomY + 160
- Door spacing: 160 - 64 = 96px (3 tiles) - OK!
-
But what if room is 6 tiles tall (closet height)?
- South position: Y = roomY + 192 - 96 = roomY + 96
- Door spacing: 96 - 64 = 32px (1 tile) - Too close!
Recommendation:
- Add minimum height requirement for E/W connections (8 tiles)
- Or: Add validation to ensure sufficient height for door spacing
- Or: Adjust formula for small rooms
Issue 5: Grid Alignment Validation Timing
Problem: The plan validates grid alignment after positioning, but alignment should be guaranteed by the positioning algorithm.
If validation finds misalignment, it's too late - rooms are already positioned incorrectly.
Recommendation:
- Remove grid alignment validation (should never fail if positioning is correct)
- Or: Use alignment validation as assertion/sanity check
- Add unit tests to ensure positioning functions always return grid-aligned positions
Issue 6: Performance with Large Scenarios
Problem: The breadth-first room positioning processes all rooms sequentially. For scenarios with 50+ rooms, this could be slow.
Also, validation does O(n²) overlap checks (all room pairs).
Impact: LOW-MEDIUM
- Most scenarios have < 20 rooms (fast)
- But custom scenarios could have many rooms
Recommendation:
- Profile with large scenario (50+ rooms)
- If slow: Consider spatial hashing for overlap detection
- If very slow: Consider caching dimension calculations
Edge Cases Not Addressed
Edge Case 1: Disconnected Rooms
Scenario: Room exists in scenario but has no connections and is not the starting room.
Current Behavior: Room won't be positioned (never added to queue)
Recommendation:
- Add validation to detect disconnected rooms
- Either: Warn and skip them
- Or: Position them at a default location
Edge Case 2: Circular References with East/West
Scenario:
{
"room1": { "connections": { "east": "room2" } },
"room2": { "connections": { "west": "room1", "east": "room3" } },
"room3": { "connections": { "west": "room2" } }
}
With breadth-first processing, this should work correctly. But what if room3 also connects back to room1?
{
"room3": { "connections": { "west": "room2", "south": "room1" } }
}
This creates a loop. Room1 is processed first (starting room), positions room2 east. Room2 positions room3 east. Room3 tries to position room1 south, but room1 is already positioned (in processed set).
Current Behavior: Should work correctly (room1 already processed, skipped)
Recommendation:
- Add test case for circular connections
- Verify processed set prevents re-positioning
Edge Case 3: Asymmetric Connection Counts
Scenario: Small room connects to large room with multiple children
[R2][R3][R4]
[--R1------]
[---R0----]
R1 connects to 3 rooms north (R2, R3, R4). R0 connects to 1 room north (R1).
When calculating R1's south door:
- R1 has 1 south connection (R0)
- Door placed deterministically (left or right)
When calculating R0's north door:
- R0 has 1 north connection (R1)
- Door placed deterministically
- BUT: Does it align with R1's south door?
Problem: If R0 chooses left and R1 chooses right, doors won't align!
Root Cause: Deterministic placement uses grid coordinates, but R1 might be at different grid position than R0 expects.
Recommendation:
- When placing door to connected room, check if connected room has multiple connections in opposite direction
- If so, calculate which index this room is in that array
- Use that index to determine door position (not grid coordinates)
- This ensures alignment
This is a CRITICAL issue that needs to be addressed!
Edge Case 4: Very Small Rooms
Scenario: Room is exactly 5×6 tiles (minimum size)
Floor area: 3 tiles wide × 2 tiles tall (after removing walls)
Can this fit:
- Player sprite?
- Objects?
- NPCs?
Recommendation:
- Test with minimum size room
- Ensure collision boxes don't completely block room
- Consider documenting minimum recommended size vs minimum technical size
Design Improvements
Improvement 1: Shared Door Positioning Function
Current Plan: Door positioning calculated in two places:
createDoorSpritesForRoom()in doors.jsremoveTilesUnderDoor()in collision.js
Problem: Code duplication, potential for divergence
Recommendation: Create single source of truth
// In doors.js
export function calculateDoorPositions(roomId, position, dimensions, connections) {
// Returns array of door positions for a room
}
// Used by both:
createDoorSpritesForRoom() // for creating sprites
removeTilesUnderDoor() // for removing tiles
Improvement 2: Room Dimension Caching
Current Plan: getRoomDimensions() called multiple times for same room
Recommendation: Cache dimensions in first pass
const dimensionsCache = new Map();
function getRoomDimensions(roomId, roomData, gameInstance) {
if (dimensionsCache.has(roomId)) {
return dimensionsCache.get(roomId);
}
const dimensions = /* calculate */;
dimensionsCache.set(roomId, dimensions);
return dimensions;
}
Improvement 3: Validation Summary Report
Current Plan: Validation logs errors to console
Recommendation: Generate structured validation report
window.scenarioValidation = {
valid: true,
errors: [
{ type: 'overlap', room1: 'office1', room2: 'office2', details: {...} }
],
warnings: [
{ type: 'alignment', room: 'closet', details: {...} }
],
summary: "3 errors, 1 warning",
timestamp: Date.now()
};
This allows:
- Programmatic error checking
- Better debugging
- Potential UI for scenario authors
Improvement 4: Debug Visualization
Current Plan: Debug tools added in Phase 6
Recommendation: Add debug visualization for positioning algorithm
- Show rooms being positioned in real-time
- Highlight current room, connected rooms
- Show grid overlay
- Animate positioning process
This would help:
- Understanding the algorithm
- Debugging positioning issues
- Teaching scenario authors
Testing Gaps
Gap 1: Stress Testing
Missing: Test with extreme scenarios
- 100+ rooms
- Very deep hierarchy (10+ levels)
- Very wide branching (10+ children)
Recommendation: Create stress test scenarios
Gap 2: Invalid Scenario Testing
Missing: Test with intentionally broken scenarios
- Invalid room sizes
- Missing reciprocal connections
- Circular connections
- Non-existent room references
Recommendation: Create test suite for invalid scenarios
Gap 3: Migration Testing
Missing: Test existing scenarios work with new system
Recommendation:
- Run ALL existing scenarios
- Create regression test suite
- Document any breaking changes
Implementation Order Concerns
Concern 1: Big Bang Approach
Current Plan: Implement all changes, then test
Risk: If something breaks, hard to isolate
Recommendation: More incremental approach
- Phase 1: Add constants and helpers (test immediately)
- Phase 2: Implement positioning for north/south only (test with existing scenarios)
- Phase 3: Add east/west support (test with new scenarios)
- Phase 4: Add door placement (test)
- Phase 5: Add validation (test)
This allows:
- Earlier testing
- Easier debugging
- Incremental commits
Concern 2: No Rollback Plan
Current Plan: Comment out old code
Risk: If new system has critical bug, hard to rollback
Recommendation:
- Create feature flag
const USE_NEW_POSITIONING = true; // Set to false to use old system
function calculateRoomPositions(...) {
if (USE_NEW_POSITIONING) {
return newCalculateRoomPositions(...);
} else {
return oldCalculateRoomPositions(...);
}
}
This allows:
- Easy A/B testing
- Quick rollback if issues
- Gradual migration
Documentation Gaps
Gap 1: Migration Guide
Missing: Guide for scenario authors
Needs:
- How to update scenarios for new system
- How to use new room sizes
- How to test scenarios
- Common issues and solutions
Gap 2: Algorithm Visualization
Missing: Visual diagrams of algorithm
Needs:
- Flowchart of positioning algorithm
- Diagrams showing door placement rules
- Illustrations of grid system
Gap 3: Troubleshooting Guide
Missing: Guide for debugging issues
Needs:
- Common error messages and fixes
- How to use debug tools
- How to validate scenarios
Summary of Recommendations
Critical (Must Fix)
- ✅ Resolve grid height calculation ambiguity
- ✅ Fix door alignment for asymmetric connections
- ✅ Create shared door positioning function
- ✅ Add validation for disconnected rooms
High Priority (Should Fix)
- Document door interaction model for layered doors
- Add minimum height validation for E/W connections
- Add test cases for edge cases
- Implement feature flag for gradual migration
Medium Priority (Nice to Have)
- Cache room dimensions for performance
- Create structured validation report
- Add debug visualization
- Create migration guide
Low Priority (Future Enhancements)
- Stress test with large scenarios
- Create algorithm visualizations
- Add troubleshooting guide
Overall Assessment
The implementation plan is solid and well-thought-out. The main issues are:
Strengths:
- Comprehensive documentation
- Systematic approach
- Good testing strategy
- Clear phases
Weaknesses:
- Grid calculation needs clarification
- Some edge cases not fully addressed
- Big bang implementation approach
- Missing migration strategy
Verdict: Plan is viable with the recommended fixes. Address critical issues before implementation begins.