2026-01-18 - 2026-04-18
Overview
1 release published by 1 user
Tag
0.2.3-prerelease-7drl2026-emscripten
100 issues closed from 1 user
Closed
#294 Entity.gridstate as DiscreteMap reference
Closed
#311 DijkstraMap pathfinding accepts out-of-bounds coords and aborts via TCOD assertion
Closed
#310 compute_fov loads out-of-range int into TCOD_fov_algorithm_t enum (UBSan)
Closed
#309 Caption numeric setters cast negative floats to unsigned int (UBSan)
Closed
#283 [Major Feature] Coverage-guided fuzz harness for Python API (libFuzzer + ASan)
Closed
#237 Multi-tile entities using composite sprites
Closed
#149 Reduce the size of UIGrid.cpp
Closed
#281 [Minor Feature] Free-threaded CPython + TSan Makefile targets
Closed
#280 [Minor Feature] Instrumented libtcod debug build for sanitizer coverage
Closed
#285 [Minor Feature] CI pipeline for debug-test and asan-test
Closed
#240 Playground: Developer troubleshooting documentation for WASM deployments
Closed
#238 Playground: Emscripten debugging infrastructure (DWARF, source maps, debug dumps)
Closed
#233 Enhance Entity rendering and positioning capabilities
Closed
#235 Texture display bounds for non-uniform sprite content
Closed
#236 Multi-tile entities using oversized sprites
Closed
#287 [Minor Feature] Regression tests that trigger each bug from #258–#278
Closed
#293 DiscreteMap serialization via bytes
Closed
#218 mcrfpy.Color and mcrfpy.Vector animation targets
Closed
#271 [Bugfix] UIGridPoint::parent_grid is a dangling raw pointer
Closed
#256 [Bugfix] Animation system bypasses spatial hash updates for entity position
Closed
#270 [Bugfix] GridLayer::parent_grid is a dangling raw pointer when grid is destroyed
Closed
#277 [Bugfix] GridChunk::parent_grid raw pointer can dangle
Closed
#234 Entity origin offset for oversized sprites
Closed
#279 [Meta] Engine memory safety audit — 7DRL 2026 post-mortem
Closed
#284 [Tiny Feature] Valgrind Massif heap profiling target
Closed
#304 [API Freeze] Remove camelCase module functions before 1.0
Closed
#286 [Tiny Feature] Re-enable ASan leak detection after fixing #266/#275
Closed
#291 [Refactoring] Audit all Python property setters for missing markDirty() calls
Closed
#290 [Bugfix] UIDrawable base x/y/pos/grid_pos setters don't propagate dirty flags to parent
Closed
#288 [Bugfix] UICollection mutations don't invalidate parent Frame's render cache
Closed
#257 grid layers with z_index of zero are on top of entities
Closed
#289 [Bugfix] Caption Python property setters don't call markDirty()
Closed
#308 [API Freeze] Remove redundant Grid.position alias
Closed
#306 [API Freeze] Remove legacy string enum comparisons
Closed
#305 [API Freeze] Remove deprecated sprite_number property
Closed
#307 [Bugfix] Color type missing __eq__/__ne__ despite having __hash__
Closed
#252 GridView and Grid, FOVLayer and PathLayer
Closed
#303 FOV optimization for behavior TARGET triggers
Closed
#302 Pathfinding with entity collision labels
Closed
#301 grid.step() — turn manager for entity behaviors
Closed
#298 mcrfpy.Trigger enum — behavior trigger type identifiers
Closed
#297 mcrfpy.Behavior enum — behavior type identifiers
Closed
#253 Use spatial hash by default when checking GridPoint for entities
Closed
#266 [Bugfix] UIEntity self reference cycle causes permanent memory leak
Closed
#299 Entity step() callback — Python-side turn handler
Closed
#254 TileLayer doesn't get any texture when assigned manually
Closed
#292 Deduplicate redundant FOV computation
Closed
#296 Entity labels — multi-tag string set for collision and trigger grouping
Closed
#295 Entity cell_pos — integer logical position decoupled from render position
Closed
#300 Behavior data struct and primitive implementations
Closed
#274 [Bugfix] UIEntity.set_grid() missing spatial hash cleanup on grid transfer
Closed
#275 [Bugfix] UIEntity has no tp_dealloc — Py_INCREF(self) in init() is never balanced
Closed
#265 [Bugfix] grid.at() returns GridPoint with dangling raw pointer into grid storage
Closed
#278 [Bugfix] entity.at() lazy init guard also has gridstate.size()==0 bug
Closed
#273 [Bugfix] entity.die() during iteration over grid.entities invalidates list iterator
Closed
#268 [Bugfix] sfVector2f_to_PyObject crashes on NULL from PyObject_GetAttrString
Closed
#276 [Bugfix] updateVisibility() gridstate.size()==0 guard doesn't validate against current grid dimensions
Closed
#263 [Bugfix] EntityCollection extended slice assignment skips gridstate resize
Closed
#264 [Bugfix] entity.at() returns GridPointState with dangling raw pointer into gridstate vector
Closed
#262 [Bugfix] EntityCollection contiguous slice assignment skips gridstate resize
Closed
#267 [Bugfix] PyObject_GetAttrString return values leaked across 60+ call sites
Closed
#260 [Bugfix] EntityCollection.insert() skips gridstate resize when entity has existing gridstate
Closed
#261 [Bugfix] EntityCollection.__setitem__ skips gridstate resize when replacing entity
Closed
#272 [Bugfix] UniformCollection stores raw pointer without checking weak_ptr owner before access
Closed
#269 [Bugfix] PythonObjectCache::lookup() reads hash map without mutex
Closed
#258 [Bugfix] EntityCollection.append() skips gridstate resize when entity has existing gridstate
Closed
#259 [Bugfix] EntityCollection.extend() skips gridstate resize when entity has existing gridstate
Closed
#251 Timer fires with corrupted callback after Python object is garbage collected
Closed
#250 [7DRL Prep] itch.io deployment pipeline
Closed
#249 [7DRL Prep] Cookbook 4: Responsive design guide
Closed
#246 [7DRL Prep] WASM fullscreen on mobile devices
Closed
#247 [7DRL Prep] SDL audio working in browser (WASM)
Closed
#244 [Bugfix] Entity3D.viewport returns None instead of parent Viewport3D
Closed
#242 [Bugfix] Entity3D.animate() raises NotImplementedError
Closed
#243 [Minor Feature] EntityCollection3D missing pop(), find(), extend() methods
Closed
#227 [Bugfix] UIDrawable: Silent failure when RenderTexture creation fails
Closed
#245 [Minor Feature] screen_to_world() only intersects Y=0 plane
Closed
#158 [Major Feature] WebAssembly/Emscripten build target for browser deployment
Closed
#157 [Major Feature] True headless execution without X11/GPU dependencies
Closed
#100 Add rotation support to UIDrawable objects
Closed
#241 [Bugfix] Fix segfault when animation callbacks start new animations
Closed
#106 Shader support
Closed
#232 Scrollwheel registers as MouseButton.LEFT
Closed
#231 Middle Click produces no event
Closed
#228 [Bugfix] UIGrid: RenderTexture hard-coded to 1080p causes issues at higher resolutions
Closed
#230 on_enter and on_exit have unnecessary parameters
Closed
#229 Animation callback doesn't provide data
Closed
#225 [Bugfix] UIFrame: Child appearance changes don't invalidate parent's cached texture
Closed
#223 [Bugfix] UIFrame: box.setPosition(0,0) corrupts position when using clip_children
Closed
#226 [Bugfix] UIFrame: Zero-size frame with clip_children causes inconsistent state
Closed
#224 [Bugfix] UIFrame: RenderTexture not disabled when clip_children toggled off
Closed
#136 ImGui Object Explorer / Scene Tree View
Closed
#161 [Documentation] Update Grid stubs to match current API
Closed
#166 [Refactoring] Test suite cleanup and organization
Closed
#165 [Documentation] Update mcrogueface.github.io website
Closed
#168 [Documentation] README polish for public release
Closed
#215 Cleanup: mcrfpy.libtcod
Closed
#219 Primary Concurrency Model: Threading Support with mcrfpy.lock()
Closed
#221 Grid children: support .grid_pos property
Closed
#222 on_click receiving string args instead of enums
96 issues created by 1 user
Opened
#221 Grid children: support .grid_pos property
Opened
#222 on_click receiving string args instead of enums
Opened
#223 [Bugfix] UIFrame: box.setPosition(0,0) corrupts position when using clip_children
Opened
#224 [Bugfix] UIFrame: RenderTexture not disabled when clip_children toggled off
Opened
#225 [Bugfix] UIFrame: Child appearance changes don't invalidate parent's cached texture
Opened
#226 [Bugfix] UIFrame: Zero-size frame with clip_children causes inconsistent state
Opened
#227 [Bugfix] UIDrawable: Silent failure when RenderTexture creation fails
Opened
#228 [Bugfix] UIGrid: RenderTexture hard-coded to 1080p causes issues at higher resolutions
Opened
#229 Animation callback doesn't provide data
Opened
#230 on_enter and on_exit have unnecessary parameters
Opened
#231 Middle Click produces no event
Opened
#232 Scrollwheel registers as MouseButton.LEFT
Opened
#233 Enhance Entity rendering and positioning capabilities
Opened
#234 Entity origin offset for oversized sprites
Opened
#235 Texture display bounds for non-uniform sprite content
Opened
#236 Multi-tile entities using oversized sprites
Opened
#237 Multi-tile entities using composite sprites
Opened
#238 Playground: Emscripten debugging infrastructure (DWARF, source maps, debug dumps)
Opened
#239 Playground: Automated WASM testing infrastructure with headless browser
Opened
#240 Playground: Developer troubleshooting documentation for WASM deployments
Opened
#241 [Bugfix] Fix segfault when animation callbacks start new animations
Opened
#242 [Bugfix] Entity3D.animate() raises NotImplementedError
Opened
#243 [Minor Feature] EntityCollection3D missing pop(), find(), extend() methods
Opened
#244 [Bugfix] Entity3D.viewport returns None instead of parent Viewport3D
Opened
#245 [Minor Feature] screen_to_world() only intersects Y=0 plane
Opened
#246 [7DRL Prep] WASM fullscreen on mobile devices
Opened
#247 [7DRL Prep] SDL audio working in browser (WASM)
Opened
#248 [7DRL Prep] Crypt of Sokoban Remaster
Opened
#249 [7DRL Prep] Cookbook 4: Responsive design guide
Opened
#250 [7DRL Prep] itch.io deployment pipeline
Opened
#251 Timer fires with corrupted callback after Python object is garbage collected
Opened
#252 GridView and Grid, FOVLayer and PathLayer
Opened
#253 Use spatial hash by default when checking GridPoint for entities
Opened
#254 TileLayer doesn't get any texture when assigned manually
Opened
#255 Tracking down performance improvement opportunities
Opened
#256 [Bugfix] Animation system bypasses spatial hash updates for entity position
Opened
#257 grid layers with z_index of zero are on top of entities
Opened
#258 [Bugfix] EntityCollection.append() skips gridstate resize when entity has existing gridstate
Opened
#259 [Bugfix] EntityCollection.extend() skips gridstate resize when entity has existing gridstate
Opened
#260 [Bugfix] EntityCollection.insert() skips gridstate resize when entity has existing gridstate
Opened
#261 [Bugfix] EntityCollection.__setitem__ skips gridstate resize when replacing entity
Opened
#262 [Bugfix] EntityCollection contiguous slice assignment skips gridstate resize
Opened
#263 [Bugfix] EntityCollection extended slice assignment skips gridstate resize
Opened
#264 [Bugfix] entity.at() returns GridPointState with dangling raw pointer into gridstate vector
Opened
#265 [Bugfix] grid.at() returns GridPoint with dangling raw pointer into grid storage
Opened
#266 [Bugfix] UIEntity self reference cycle causes permanent memory leak
Opened
#267 [Bugfix] PyObject_GetAttrString return values leaked across 60+ call sites
Opened
#268 [Bugfix] sfVector2f_to_PyObject crashes on NULL from PyObject_GetAttrString
Opened
#269 [Bugfix] PythonObjectCache::lookup() reads hash map without mutex
Opened
#270 [Bugfix] GridLayer::parent_grid is a dangling raw pointer when grid is destroyed
Opened
#271 [Bugfix] UIGridPoint::parent_grid is a dangling raw pointer
Opened
#272 [Bugfix] UniformCollection stores raw pointer without checking weak_ptr owner before access
Opened
#273 [Bugfix] entity.die() during iteration over grid.entities invalidates list iterator
Opened
#274 [Bugfix] UIEntity.set_grid() missing spatial hash cleanup on grid transfer
Opened
#275 [Bugfix] UIEntity has no tp_dealloc — Py_INCREF(self) in init() is never balanced
Opened
#276 [Bugfix] updateVisibility() gridstate.size()==0 guard doesn't validate against current grid dimensions
Opened
#277 [Bugfix] GridChunk::parent_grid raw pointer can dangle
Opened
#278 [Bugfix] entity.at() lazy init guard also has gridstate.size()==0 bug
Opened
#279 [Meta] Engine memory safety audit — 7DRL 2026 post-mortem
Opened
#280 [Minor Feature] Instrumented libtcod debug build for sanitizer coverage
Opened
#281 [Minor Feature] Free-threaded CPython + TSan Makefile targets
Opened
#282 [Minor Feature] Install modern Clang for improved TSan and fuzzing
Opened
#283 [Major Feature] Coverage-guided fuzz harness for Python API (libFuzzer + ASan)
Opened
#284 [Tiny Feature] Valgrind Massif heap profiling target
Opened
#285 [Minor Feature] CI pipeline for debug-test and asan-test
Opened
#286 [Tiny Feature] Re-enable ASan leak detection after fixing #266/#275
Opened
#287 [Minor Feature] Regression tests that trigger each bug from #258–#278
Opened
#288 [Bugfix] UICollection mutations don't invalidate parent Frame's render cache
Opened
#289 [Bugfix] Caption Python property setters don't call markDirty()
Opened
#290 [Bugfix] UIDrawable base x/y/pos/grid_pos setters don't propagate dirty flags to parent
Opened
#291 [Refactoring] Audit all Python property setters for missing markDirty() calls
Opened
#292 Deduplicate redundant FOV computation
Opened
#293 DiscreteMap serialization via bytes
Opened
#294 Entity.gridstate as DiscreteMap reference
Opened
#295 Entity cell_pos — integer logical position decoupled from render position
Opened
#296 Entity labels — multi-tag string set for collision and trigger grouping
Opened
#297 mcrfpy.Behavior enum — behavior type identifiers
Opened
#298 mcrfpy.Trigger enum — behavior trigger type identifiers
Opened
#299 Entity step() callback — Python-side turn handler
Opened
#300 Behavior data struct and primitive implementations
Opened
#301 grid.step() — turn manager for entity behaviors
Opened
#302 Pathfinding with entity collision labels
Opened
#303 FOV optimization for behavior TARGET triggers
Opened
#304 [API Freeze] Remove camelCase module functions before 1.0
Opened
#305 [API Freeze] Remove deprecated sprite_number property
Opened
#306 [API Freeze] Remove legacy string enum comparisons
Opened
#307 [Bugfix] Color type missing __eq__/__ne__ despite having __hash__
Opened
#308 [API Freeze] Remove redundant Grid.position alias
Opened
#309 Caption numeric setters cast negative floats to unsigned int (UBSan)
Opened
#310 compute_fov loads out-of-range int into TCOD_fov_algorithm_t enum (UBSan)
Opened
#311 DijkstraMap pathfinding accepts out-of-bounds coords and aborts via TCOD assertion
Opened
#312 [Minor Feature] Extend fuzz coverage to remaining public API surface
Opened
#313 [Refactoring] Migrate UIEntity::grid from shared_ptr<UIGrid> to shared_ptr<GridData>
Opened
#314 [Documentation] API audit follow-through: close the gaps from docs/api-audit-2026-04.md
Opened
#315 Behavior pathfinding architecture — support A*↔Dijkstra spectrum, multi-root, and custom heuristics
Opened
#316 Sparse perspective writeback in UIEntity::updateVisibility (Phase 5.2 finding)
4 unresolved conversations
Open
#167
[Demo Target] r/roguelikedev Tutorial Series Demo Game
Open
#46
subinterpreter tests
Open
#152
Sparse Grid Layers
Open
#220
Secondary Concurrency Model: Subinterpreter Support