BSP: add Binary Space Partitioning for procedural dungeon generation
Implements #202, #203, #204, #205; partially implements #206:
- BSP class: core tree structure with bounds, split_once, split_recursive, clear
- BSPNode class: lightweight node reference with bounds, level, is_leaf,
split_horizontal, split_position; navigation via left/right/parent/sibling;
contains() and center() methods
- Traversal enum: PRE_ORDER, IN_ORDER, POST_ORDER, LEVEL_ORDER, INVERTED_LEVEL_ORDER
- BSP iteration: leaves() for leaf nodes only, traverse(order) for all nodes
- BSP query: find(pos) returns deepest node containing position
- BSP.to_heightmap(): converts BSP to HeightMap with select, shrink, value options
Note: #206's BSPMap subclass deferred - to_heightmap returns plain HeightMap.
The HeightMap already has all necessary operations (inverse, threshold, etc.)
for procedural generation workflows.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-12 07:02:54 -05:00
|
|
|
"""Simple BSP test to identify crash."""
|
|
|
|
|
import sys
|
|
|
|
|
import mcrfpy
|
|
|
|
|
|
|
|
|
|
print("Step 1: Import complete")
|
|
|
|
|
|
|
|
|
|
print("Step 2: Creating BSP...")
|
BSP: add safety features and API improvements (closes #202, #203, #204, #205, #206)
Safety improvements:
- Generation counter detects stale BSPNode references after clear()/split_recursive()
- GRID_MAX validation prevents oversized BSP trees
- Depth parameter capped at 16 to prevent resource exhaustion
- Iterator checks generation to detect invalidation during mutation
API improvements:
- Changed constructor from bounds=((x,y),(w,h)) to pos=(x,y), size=(w,h)
- Added pos and size properties alongside bounds
- BSPNode __eq__ compares underlying pointers for identity
- BSP __iter__ as shorthand for leaves()
- BSP __len__ returns leaf count
Tests:
- Added tests for stale node detection, GRID_MAX validation, depth cap
- Added tests for __len__, __iter__, and BSPNode equality
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-12 07:59:31 -05:00
|
|
|
bsp = mcrfpy.BSP(pos=(0, 0), size=(100, 80))
|
BSP: add Binary Space Partitioning for procedural dungeon generation
Implements #202, #203, #204, #205; partially implements #206:
- BSP class: core tree structure with bounds, split_once, split_recursive, clear
- BSPNode class: lightweight node reference with bounds, level, is_leaf,
split_horizontal, split_position; navigation via left/right/parent/sibling;
contains() and center() methods
- Traversal enum: PRE_ORDER, IN_ORDER, POST_ORDER, LEVEL_ORDER, INVERTED_LEVEL_ORDER
- BSP iteration: leaves() for leaf nodes only, traverse(order) for all nodes
- BSP query: find(pos) returns deepest node containing position
- BSP.to_heightmap(): converts BSP to HeightMap with select, shrink, value options
Note: #206's BSPMap subclass deferred - to_heightmap returns plain HeightMap.
The HeightMap already has all necessary operations (inverse, threshold, etc.)
for procedural generation workflows.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-12 07:02:54 -05:00
|
|
|
print("Step 2: BSP created:", bsp)
|
|
|
|
|
|
|
|
|
|
print("Step 3: Getting bounds...")
|
|
|
|
|
bounds = bsp.bounds
|
|
|
|
|
print("Step 3: Bounds:", bounds)
|
|
|
|
|
|
|
|
|
|
print("Step 4: Getting root...")
|
|
|
|
|
root = bsp.root
|
|
|
|
|
print("Step 4: Root:", root)
|
|
|
|
|
|
|
|
|
|
print("Step 5: Split once...")
|
|
|
|
|
bsp.split_once(horizontal=True, position=40)
|
|
|
|
|
print("Step 5: Split complete")
|
|
|
|
|
|
|
|
|
|
print("Step 6: Get leaves...")
|
|
|
|
|
leaves = list(bsp.leaves())
|
|
|
|
|
print("Step 6: Leaves count:", len(leaves))
|
|
|
|
|
|
|
|
|
|
print("PASS")
|
|
|
|
|
sys.exit(0)
|