2025-07-05 22:16:52 -04:00
# McRogueFace - Development Roadmap
## Project Status: 🎉 ALPHA 0.1 RELEASE! 🎉
**Current State**: Alpha release achieved! All critical blockers resolved!
**Latest Update**: Moved RenderTexture (#6 ) to Beta - Alpha is READY! (2025-07-05)
**Branch**: interpreter_mode (ready for alpha release merge)
**Open Issues**: ~46 remaining (non-blocking quality-of-life improvements)
---
## Recent Achievements
2025-07-08 09:31:00 -04:00
### 2025-07-08: PyArgHelpers Infrastructure Complete! 🔧
**Standardized Python API Argument Parsing**
- Unified position handling: (x, y) tuples or separate x, y args
- Consistent size parsing: (w, h) tuples or width, height args
- Grid-specific helpers for tile-based positioning
- Proper conflict detection between positional and keyword args
- All UI components migrated: Frame, Caption, Sprite, Grid, Entity
- Improved error messages: "Value must be a number (int or float)"
- Foundation for Phase 7 documentation efforts
2025-07-05 22:16:52 -04:00
### 2025-07-05: ALPHA 0.1 ACHIEVED! 🎊🍾
**All Alpha Blockers Resolved!**
- Z-order rendering with performance optimization (Issue #63 )
- Python Sequence Protocol for collections (Issue #69 )
- Comprehensive Animation System (Issue #59 )
- Moved RenderTexture to Beta (not needed for Alpha)
- **McRogueFace is ready for Alpha release!**
### 2025-07-05: Z-order Rendering Complete! 🎉
**Issue #63 Resolved**: Consistent z-order rendering with performance optimization
- Dirty flag pattern prevents unnecessary per-frame sorting
- Lazy sorting for both Scene elements and Frame children
- Frame children now respect z_index (fixed inconsistency)
- Automatic dirty marking on z_index changes and collection modifications
- Performance: O(1) check for static scenes vs O(n log n) every frame
### 2025-07-05: Python Sequence Protocol Complete! 🎉
**Issue #69 Resolved**: Full sequence protocol implementation for collections
- Complete __setitem __ , __delitem __ , __contains __ support
- Slice operations with extended slice support (step != 1)
- Concatenation (+) and in-place concatenation (+=) with validation
- Negative indexing throughout, index() and count() methods
- Type safety: UICollection (Frame/Caption/Sprite/Grid), EntityCollection (Entity only)
- Default value support: None for texture/font parameters uses engine defaults
### 2025-07-05: Animation System Complete! 🎉
**Issue #59 Resolved**: Comprehensive animation system with 30+ easing functions
- Property-based animations for all UI classes (Frame, Caption, Sprite, Grid, Entity)
- Individual color component animation (r/g/b/a)
- Sprite sequence animation and text typewriter effects
- Pure C++ execution without Python callbacks
- Delta animation support for relative values
### 2025-01-03: Major Stability Update
**Major Cleanup**: Removed deprecated registerPyAction system (-180 lines)
**Bug Fixes**: 12 critical issues including Grid segfault, Issue #78 (middle click), Entity setters
**New Features**: Entity.index() (#73 ), EntityCollection.extend() (#27 ), Sprite validation (#33 )
**Test Coverage**: Comprehensive test suite with timer callback pattern established
---
## 🔧 CURRENT WORK: Alpha Streamline 2 - Major Architecture Improvements
### Recent Completions:
2025-07-06 14:43:43 -04:00
- ✅ **Phase 1-4 Complete ** - Foundation, API Polish, Entity Lifecycle, Visibility/Performance
- ✅ **Phase 5 Complete ** - Window/Scene Architecture fully implemented!
- Window singleton with properties (#34 )
- OOP Scene support with lifecycle methods (#61 )
- Window resize events (#1 )
- Scene transitions with animations (#105 )
2025-07-07 10:58:00 -04:00
- ✅ **Phase 6 Complete ** - Rendering Revolution achieved!
2025-07-06 16:58:35 -04:00
- Grid background colors (#50 ) ✅
2025-07-07 10:58:00 -04:00
- RenderTexture overhaul (#6 ) ✅
2025-07-06 16:58:35 -04:00
- UIFrame clipping support ✅
2025-07-07 10:28:50 -04:00
- Viewport-based rendering (#8 ) ✅
2025-07-05 22:16:52 -04:00
### Active Development:
- **Branch**: alpha_streamline_2
2025-07-08 09:31:00 -04:00
- **Current Phase**: Phase 7 - Documentation & Distribution
- **Achievement**: PyArgHelpers infrastructure complete - standardized Python API
2025-07-05 22:16:52 -04:00
- **Strategic Vision**: See STRATEGIC_VISION.md for platform roadmap
2025-07-08 09:31:00 -04:00
- **Latest**: All UI components now use consistent argument parsing patterns!
2025-07-05 22:16:52 -04:00
### 🏗️ Architectural Dependencies Map
```
Foundation Layer:
├── #71 Base Class (_Drawable)
│ ├── #10 Visibility System (needs AABB from base)
│ ├── #87 visible property
│ └── #88 opacity property
│
├── #7 Safe Constructors (affects all classes)
│ └── Blocks any new class creation until resolved
│
└── #30 Entity/Grid Integration (lifecycle management)
└── Enables reliable entity management
Window/Scene Layer:
├── #34 Window Object
│ ├── #61 Scene Object (depends on Window)
│ ├── #14 SFML Exposure (helps implement Window)
│ └── Future: Multi-window support
Rendering Layer:
└── #6 RenderTexture Overhaul
├── Enables clipping
├── Off-screen rendering
└── Post-processing effects
```
## 🚀 Alpha Streamline 2 - Comprehensive Phase Plan
### Phase 1: Foundation Stabilization (1-2 weeks)
**Goal**: Safe, predictable base for all future work
```
1. #7 - Audit and fix unsafe constructors (CRITICAL - do first!)
- Find all manually implemented no-arg constructors
- Verify map compatibility requirements
- Make pointer-safe or remove
2. #71 - _Drawable base class implementation
- Common properties: x, y, w, h, visible, opacity
- Virtual methods: get_bounds(), render()
- Proper Python inheritance setup
3. #87 - visible property
- Add to base class
- Update all render methods to check
4. #88 - opacity property (depends on #87 )
- 0.0-1.0 float range
- Apply in render methods
5. #89 - get_bounds() method
- Virtual method returning (x, y, w, h)
- Override in each UI class
6. #98 - move()/resize() convenience methods
- move(dx, dy) - relative movement
- resize(w, h) - absolute sizing
```
*Rationale*: Can't build on unsafe foundations. Base class enables all UI improvements.
### Phase 2: Constructor & API Polish (1 week)
**Goal**: Pythonic, intuitive API
```
1. #101 - Standardize (0,0) defaults for all positions
2. #38 - Frame children parameter: Frame(children=[...])
3. #42 - Click handler in __init __ : Button(click=callback)
4. #90 - Grid size tuple: Grid(grid_size=(10, 10))
5. #19 - Sprite texture swapping: sprite.texture = new_texture
6. #52 - Grid skip out-of-bounds entities (performance)
```
*Rationale*: Quick wins that make the API more pleasant before bigger changes.
### Phase 3: Entity Lifecycle Management (1 week)
**Goal**: Bulletproof entity/grid relationships
```
1. #30 - Entity.die() and grid association
- Grid.entities.append(e) sets e.grid = self
- Grid.entities.remove(e) sets e.grid = None
- Entity.die() calls self.grid.remove(self)
- Entity can only be in 0 or 1 grid
2. #93 - Vector arithmetic methods
- add, subtract, multiply, divide
- distance, normalize, dot product
3. #94 - Color helper methods
- from_hex("#FF0000 "), to_hex()
- lerp(other_color, t) for interpolation
feat: Phase 1 - safe constructors and _Drawable foundation
Closes #7 - Make all UI class constructors safe:
- Added safe default constructors for UISprite, UIGrid, UIEntity, UICaption
- Initialize all members to predictable values
- Made Python init functions accept no arguments
- Added x,y properties to UIEntity
Closes #71 - Create _Drawable Python base class:
- Created PyDrawable.h/cpp with base type (not yet inherited by UI types)
- Registered in module initialization
Closes #87 - Add visible property:
- Added bool visible=true to UIDrawable base class
- All render methods check visibility before drawing
Closes #88 - Add opacity property:
- Added float opacity=1.0 to UIDrawable base class
- UICaption and UISprite apply opacity to alpha channel
Closes #89 - Add get_bounds() method:
- Virtual method returns sf::FloatRect(x,y,w,h)
- Implemented in Frame, Caption, Sprite, Grid
Closes #98 - Add move() and resize() methods:
- move(dx,dy) for relative movement
- resize(w,h) for absolute sizing
- Caption resize is no-op (size controlled by font)
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-06 00:13:39 -04:00
4. #103 - Timer objects
2025-07-05 22:16:52 -04:00
timer = mcrfpy.Timer("my_timer", callback, 1000)
timer.pause()
timer.resume()
timer.cancel()
```
*Rationale*: Games need reliable entity management. Timer objects enable entity AI.
### Phase 4: Visibility & Performance (1-2 weeks)
**Goal**: Only render/process what's needed
```
2025-07-06 12:02:37 -04:00
1. #10 - [UNSCHEDULED] Full visibility system with AABB
- Postponed: UIDrawables can exist in multiple collections
- Cannot reliably determine screen position due to multiple render contexts
- Needs architectural solution for parent-child relationships
2025-07-05 22:16:52 -04:00
2025-07-06 12:02:37 -04:00
2. #52 - Grid culling (COMPLETED in Phase 2)
2025-07-05 22:16:52 -04:00
3. #39/40/41 - Name system for finding elements
- name="button1" property on all UIDrawables
- only_one=True for unique names
- scene.find("button1") returns element
- collection.find("enemy*") returns list
feat: Phase 1 - safe constructors and _Drawable foundation
Closes #7 - Make all UI class constructors safe:
- Added safe default constructors for UISprite, UIGrid, UIEntity, UICaption
- Initialize all members to predictable values
- Made Python init functions accept no arguments
- Added x,y properties to UIEntity
Closes #71 - Create _Drawable Python base class:
- Created PyDrawable.h/cpp with base type (not yet inherited by UI types)
- Registered in module initialization
Closes #87 - Add visible property:
- Added bool visible=true to UIDrawable base class
- All render methods check visibility before drawing
Closes #88 - Add opacity property:
- Added float opacity=1.0 to UIDrawable base class
- UICaption and UISprite apply opacity to alpha channel
Closes #89 - Add get_bounds() method:
- Virtual method returns sf::FloatRect(x,y,w,h)
- Implemented in Frame, Caption, Sprite, Grid
Closes #98 - Add move() and resize() methods:
- move(dx,dy) for relative movement
- resize(w,h) for absolute sizing
- Caption resize is no-op (size controlled by font)
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-06 00:13:39 -04:00
4. #104 - Basic profiling/metrics
2025-07-05 22:16:52 -04:00
- Frame time tracking
- Draw call counting
- Python vs C++ time split
```
*Rationale*: Performance is feature. Finding elements by name is huge QoL.
2025-07-06 14:43:43 -04:00
### Phase 5: Window/Scene Architecture ✅ COMPLETE! (2025-07-06)
2025-07-05 22:16:52 -04:00
**Goal**: Modern, flexible architecture
```
2025-07-06 14:43:43 -04:00
1. ✅ #34 - Window object (singleton first)
2025-07-05 22:16:52 -04:00
window = mcrfpy.Window.get()
window.resolution = (1920, 1080)
window.fullscreen = True
window.vsync = True
2025-07-06 14:43:43 -04:00
2. ✅ #1 - Window resize events
scene.on_resize(self, width, height) callback implemented
2025-07-05 22:16:52 -04:00
2025-07-06 14:43:43 -04:00
3. ✅ #61 - Scene object (OOP scenes)
2025-07-05 22:16:52 -04:00
class MenuScene(mcrfpy.Scene):
2025-07-06 14:43:43 -04:00
def on_keypress(self, key, state):
2025-07-05 22:16:52 -04:00
# handle input
def on_enter(self):
# setup UI
2025-07-06 14:43:43 -04:00
def on_exit(self):
# cleanup
def update(self, dt):
# frame update
2025-07-05 22:16:52 -04:00
2025-07-06 14:43:43 -04:00
4. ✅ #14 - SFML exposure research
- Completed comprehensive analysis
- Recommendation: Direct integration as mcrfpy.sfml
- SFML 3.0 migration deferred to late 2025
2025-07-05 22:16:52 -04:00
2025-07-06 14:43:43 -04:00
5. ✅ #105 - Scene transitions
mcrfpy.setScene("menu", "fade", 1.0)
# Supports: fade, slide_left, slide_right, slide_up, slide_down
2025-07-05 22:16:52 -04:00
```
2025-07-06 14:43:43 -04:00
*Result*: Entire window/scene system modernized with OOP design!
2025-07-05 22:16:52 -04:00
2025-07-07 10:58:00 -04:00
### Phase 6: Rendering Revolution (3-4 weeks) ✅ COMPLETE!
2025-07-05 22:16:52 -04:00
**Goal**: Professional rendering capabilities
```
2025-07-06 16:58:35 -04:00
1. ✅ #50 - Grid background colors [COMPLETED]
grid.background_color = mcrfpy.Color(50, 50, 50)
- Added background_color property with animation support
- Default dark gray background (8, 8, 8, 255)
2025-07-07 10:58:00 -04:00
2. ✅ #6 - RenderTexture overhaul [COMPLETED]
2025-07-06 16:58:35 -04:00
✅ Base infrastructure in UIDrawable
✅ UIFrame clip_children property
✅ Dirty flag optimization system
✅ Nested clipping support
2025-07-07 10:58:00 -04:00
✅ UIGrid already has appropriate RenderTexture implementation
❌ UICaption/UISprite clipping not needed (no children)
2025-07-05 22:16:52 -04:00
2025-07-07 10:28:50 -04:00
3. ✅ #8 - Viewport-based rendering [COMPLETED]
- Fixed game resolution (window.game_resolution)
- Three scaling modes: "center", "stretch", "fit"
- Window to game coordinate transformation
- Mouse input properly scaled with windowToGameCoords()
- Python API fully integrated
- Tests: test_viewport_simple.py, test_viewport_visual.py, test_viewport_scaling.py
2025-07-05 22:16:52 -04:00
2025-07-07 10:58:00 -04:00
4. #106 - Shader support [DEFERRED TO POST-PHASE 7]
2025-07-06 14:43:43 -04:00
sprite.shader = mcrfpy.Shader.load("glow.frag")
frame.shader_params = {"intensity": 0.5}
2025-07-05 22:16:52 -04:00
2025-07-07 10:58:00 -04:00
5. #107 - Particle system [DEFERRED TO POST-PHASE 7]
2025-07-06 14:43:43 -04:00
emitter = mcrfpy.ParticleEmitter()
emitter.texture = spark_texture
emitter.emission_rate = 100
emitter.lifetime = (0.5, 2.0)
2025-07-05 22:16:52 -04:00
```
2025-07-06 14:43:43 -04:00
2025-07-07 10:58:00 -04:00
**Phase 6 Achievement Summary**:
- Grid backgrounds (#50 ) ✅ - Customizable background colors with animation
- RenderTexture overhaul (#6 ) ✅ - UIFrame clipping with opt-in architecture
- Viewport rendering (#8 ) ✅ - Three scaling modes with coordinate transformation
- UIGrid already had optimal RenderTexture implementation for its use case
- UICaption/UISprite clipping unnecessary (no children to clip)
- Performance optimized with dirty flag system
- Backward compatibility preserved throughout
- Effects/Shader/Particle systems deferred for focused delivery
2025-07-06 14:43:43 -04:00
2025-07-05 22:16:52 -04:00
*Rationale*: This unlocks professional visual effects but is complex.
### Phase 7: Documentation & Distribution (1-2 weeks)
**Goal**: Ready for the world
```
2025-07-08 09:34:48 -04:00
1. ✅ #85 - Replace all "docstring" placeholders [COMPLETED 2025-07-08]
2025-07-08 10:09:37 -04:00
2. ✅ #86 - Add parameter documentation [COMPLETED 2025-07-08]
3. ✅ #108 - Generate .pyi type stubs for IDE support [COMPLETED 2025-07-08]
4. ❌ #70 - PyPI wheel preparation [CANCELLED - Architectural mismatch]
2025-07-05 22:16:52 -04:00
5. API reference generator tool
```
## 📋 Critical Path & Parallel Tracks
### 🔴 **Critical Path** (Must do in order)
**Safe Constructors (#7 )** → **Base Class (#71) ** → **Visibility (#10) ** → **Window (#34) ** → **Scene (#61) **
### 🟡 **Parallel Tracks** (Can be done alongside critical path)
**Track A: Entity Systems**
- Entity/Grid integration (#30 )
feat: Phase 1 - safe constructors and _Drawable foundation
Closes #7 - Make all UI class constructors safe:
- Added safe default constructors for UISprite, UIGrid, UIEntity, UICaption
- Initialize all members to predictable values
- Made Python init functions accept no arguments
- Added x,y properties to UIEntity
Closes #71 - Create _Drawable Python base class:
- Created PyDrawable.h/cpp with base type (not yet inherited by UI types)
- Registered in module initialization
Closes #87 - Add visible property:
- Added bool visible=true to UIDrawable base class
- All render methods check visibility before drawing
Closes #88 - Add opacity property:
- Added float opacity=1.0 to UIDrawable base class
- UICaption and UISprite apply opacity to alpha channel
Closes #89 - Add get_bounds() method:
- Virtual method returns sf::FloatRect(x,y,w,h)
- Implemented in Frame, Caption, Sprite, Grid
Closes #98 - Add move() and resize() methods:
- move(dx,dy) for relative movement
- resize(w,h) for absolute sizing
- Caption resize is no-op (size controlled by font)
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-06 00:13:39 -04:00
- Timer objects (#103 )
2025-07-05 22:16:52 -04:00
- Vector/Color helpers (#93 , #94 )
**Track B: API Polish**
- Constructor improvements (#101 , #38 , #42 , #90 )
- Sprite texture swap (#19 )
- Name/search system (#39/40/41 )
**Track C: Performance**
- Grid culling (#52 )
- Visibility culling (part of #10 )
feat: Phase 1 - safe constructors and _Drawable foundation
Closes #7 - Make all UI class constructors safe:
- Added safe default constructors for UISprite, UIGrid, UIEntity, UICaption
- Initialize all members to predictable values
- Made Python init functions accept no arguments
- Added x,y properties to UIEntity
Closes #71 - Create _Drawable Python base class:
- Created PyDrawable.h/cpp with base type (not yet inherited by UI types)
- Registered in module initialization
Closes #87 - Add visible property:
- Added bool visible=true to UIDrawable base class
- All render methods check visibility before drawing
Closes #88 - Add opacity property:
- Added float opacity=1.0 to UIDrawable base class
- UICaption and UISprite apply opacity to alpha channel
Closes #89 - Add get_bounds() method:
- Virtual method returns sf::FloatRect(x,y,w,h)
- Implemented in Frame, Caption, Sprite, Grid
Closes #98 - Add move() and resize() methods:
- move(dx,dy) for relative movement
- resize(w,h) for absolute sizing
- Caption resize is no-op (size controlled by font)
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-06 00:13:39 -04:00
- Profiling tools (#104 )
2025-07-05 22:16:52 -04:00
### 💎 **Quick Wins to Sprinkle Throughout**
1. Color helpers (#94 ) - 1 hour
2. Vector methods (#93 ) - 1 hour
3. Grid backgrounds (#50 ) - 30 minutes
4. Default positions (#101 ) - 30 minutes
### 🎯 **Recommended Execution Order**
**Week 1-2**: Foundation (Critical constructors + base class)
**Week 3**: Entity lifecycle + API polish
**Week 4**: Visibility system + performance
**Week 5-6**: Window/Scene architecture
**Week 7-9**: Rendering revolution (or defer to gamma)
**Week 10**: Documentation + release prep
2025-07-06 14:43:43 -04:00
### 🆕 **New Issues to Create/Track**
1. [x] **Timer Objects ** - Pythonic timer management (#103 ) - * Completed Phase 3 *
2. [ ] **Event System Enhancement ** - Mouse enter/leave, drag, right-click
3. [ ] **Resource Manager ** - Centralized asset loading
4. [ ] **Serialization System ** - Save/load game state
5. [x] **Scene Transitions ** - Fade, slide, custom effects (#105 ) - * Completed Phase 5 *
6. [x] **Profiling Tools ** - Performance metrics (#104 ) - * Completed Phase 4 *
7. [ ] **Particle System ** - Visual effects framework (#107 )
8. [ ] **Shader Support ** - Custom rendering effects (#106 )
---
## 📋 Phase 6 Implementation Strategy
### RenderTexture Overhaul (#6) - Technical Approach
**Current State**:
- UIGrid already uses RenderTexture for entity rendering
- Scene transitions use RenderTextures for smooth animations
- Direct rendering to window for Frame, Caption, Sprite
**Implementation Plan**:
1. **Base Infrastructure ** :
- Add `sf::RenderTexture* target` to UIDrawable base
- Modify `render()` to check if target exists
- If target: render to texture, then draw texture to parent
- If no target: render directly (backward compatible)
2. **Clipping Support ** :
- Frame enforces bounds on children via RenderTexture
- Children outside bounds are automatically clipped
- Nested frames create render texture hierarchy
3. **Performance Optimization ** :
- Lazy RenderTexture creation (only when needed)
- Dirty flag system (only re-render when changed)
- Texture pooling for commonly used sizes
4. **Integration Points ** :
- Scene transitions already working with RenderTextures
- UIGrid can be reference implementation
- Test with deeply nested UI structures
**Quick Wins Before Core Work**:
1. **Grid Background (#50) ** - 30 min implementation
- Add `background_color` and `background_texture` properties
- Render before entities in UIGrid::render()
- Good warm-up before tackling RenderTexture
2025-07-05 22:16:52 -04:00
2025-07-06 14:43:43 -04:00
2. **Research Tasks ** :
- Study UIGrid's current RenderTexture usage
- Profile scene transition performance
- Identify potential texture size limits
2025-07-05 22:16:52 -04:00
---
## 🚀 NEXT PHASE: Beta Features & Polish
### Alpha Complete! Moving to Beta Priorities:
1. ~~**#69** - Python Sequence Protocol for collections~~ - * Completed! (2025-07-05) *
2. ~~**#63** - Z-order rendering for UIDrawables~~ - * Completed! (2025-07-05) *
3. ~~**#59** - Animation system~~ - * Completed! (2025-07-05) *
4. * * #6 ** - RenderTexture concept - * Extensive Overhaul *
5. ~~**#47** - New README.md for Alpha release~~ - * Completed *
- [x] * * #78 ** - Middle Mouse Click sends "C" keyboard event - * Fixed *
- [x] * * #77 ** - Fix error message copy/paste bug - * Fixed *
- [x] * * #74 ** - Add missing `Grid.grid_y` property - * Fixed *
- [ ] * * #37 ** - Fix Windows build module import from "scripts" directory - * Isolated Fix *
feat: Phase 1 - safe constructors and _Drawable foundation
Closes #7 - Make all UI class constructors safe:
- Added safe default constructors for UISprite, UIGrid, UIEntity, UICaption
- Initialize all members to predictable values
- Made Python init functions accept no arguments
- Added x,y properties to UIEntity
Closes #71 - Create _Drawable Python base class:
- Created PyDrawable.h/cpp with base type (not yet inherited by UI types)
- Registered in module initialization
Closes #87 - Add visible property:
- Added bool visible=true to UIDrawable base class
- All render methods check visibility before drawing
Closes #88 - Add opacity property:
- Added float opacity=1.0 to UIDrawable base class
- UICaption and UISprite apply opacity to alpha channel
Closes #89 - Add get_bounds() method:
- Virtual method returns sf::FloatRect(x,y,w,h)
- Implemented in Frame, Caption, Sprite, Grid
Closes #98 - Add move() and resize() methods:
- move(dx,dy) for relative movement
- resize(w,h) for absolute sizing
- Caption resize is no-op (size controlled by font)
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-06 00:13:39 -04:00
Issue #37 is **on hold ** until we have a Windows build environment available. I actually suspect this is already fixed by the updates to the makefile, anyway.
2025-07-05 22:16:52 -04:00
- [x] **Entity Property Setters ** - Fix "new style getargs format" error - * Fixed *
- [x] **Sprite Texture Setter ** - Fix "error return without exception set" - * Fixed *
- [x] **keypressScene() Validation ** - Add proper error handling - * Fixed *
### 🔄 Complete Iterator System
**Status**: Core iterators complete (#72 closed), Grid point iterators still pending
- [ ] **Grid Point Iterator Implementation ** - Complete the remaining grid iteration work
- [x] * * #73 ** - Add `entity.index()` method for collection removal - * Fixed *
- [x] * * #69 ** ⚠️ **Alpha Blocker ** - Refactor all collections to use Python Sequence Protocol - * Completed! (2025-07-05) *
**Dependencies**: Grid point iterators → #73 entity.index() → #69 Sequence Protocol overhaul
---
## 🗂 ISSUE TRIAGE BY SYSTEM (78 Total Issues)
### 🎮 Core Engine Systems
#### Iterator/Collection System (2 issues)
- [x] * * #73 ** - Entity index() method for removal - * Fixed *
- [x] * * #69 ** ⚠️ **Alpha Blocker ** - Sequence Protocol refactor - * Completed! (2025-07-05) *
#### Python/C++ Integration (7 issues)
feat: Phase 1 - safe constructors and _Drawable foundation
Closes #7 - Make all UI class constructors safe:
- Added safe default constructors for UISprite, UIGrid, UIEntity, UICaption
- Initialize all members to predictable values
- Made Python init functions accept no arguments
- Added x,y properties to UIEntity
Closes #71 - Create _Drawable Python base class:
- Created PyDrawable.h/cpp with base type (not yet inherited by UI types)
- Registered in module initialization
Closes #87 - Add visible property:
- Added bool visible=true to UIDrawable base class
- All render methods check visibility before drawing
Closes #88 - Add opacity property:
- Added float opacity=1.0 to UIDrawable base class
- UICaption and UISprite apply opacity to alpha channel
Closes #89 - Add get_bounds() method:
- Virtual method returns sf::FloatRect(x,y,w,h)
- Implemented in Frame, Caption, Sprite, Grid
Closes #98 - Add move() and resize() methods:
- move(dx,dy) for relative movement
- resize(w,h) for absolute sizing
- Caption resize is no-op (size controlled by font)
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-06 00:13:39 -04:00
- [x] * * #76 ** - UIEntity derived type preservation in collections - * Multiple Integrations *
2025-07-05 22:16:52 -04:00
- [ ] * * #71 ** - Drawable base class hierarchy - * Extensive Overhaul *
- [ ] * * #70 ** - PyPI wheel distribution - * Extensive Overhaul *
- [~] * * #32 ** - Executable behave like `python` command - * Extensive Overhaul * * (90% Complete: -h, -V, -c, -m, -i, script execution, sys.argv, --exec all implemented. Only stdin (-) support missing) *
- [ ] * * #35 ** - TCOD as built-in module - * Extensive Overhaul *
2025-07-06 14:43:43 -04:00
- [~] * * #14 ** - Expose SFML as built-in module - * Research Complete, Implementation Pending *
2025-07-05 22:16:52 -04:00
- [ ] * * #46 ** - Subinterpreter threading tests - * Multiple Integrations *
#### UI/Rendering System (12 issues)
feat: Phase 1 - safe constructors and _Drawable foundation
Closes #7 - Make all UI class constructors safe:
- Added safe default constructors for UISprite, UIGrid, UIEntity, UICaption
- Initialize all members to predictable values
- Made Python init functions accept no arguments
- Added x,y properties to UIEntity
Closes #71 - Create _Drawable Python base class:
- Created PyDrawable.h/cpp with base type (not yet inherited by UI types)
- Registered in module initialization
Closes #87 - Add visible property:
- Added bool visible=true to UIDrawable base class
- All render methods check visibility before drawing
Closes #88 - Add opacity property:
- Added float opacity=1.0 to UIDrawable base class
- UICaption and UISprite apply opacity to alpha channel
Closes #89 - Add get_bounds() method:
- Virtual method returns sf::FloatRect(x,y,w,h)
- Implemented in Frame, Caption, Sprite, Grid
Closes #98 - Add move() and resize() methods:
- move(dx,dy) for relative movement
- resize(w,h) for absolute sizing
- Caption resize is no-op (size controlled by font)
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-06 00:13:39 -04:00
- [x] * * #63 ** ⚠️ **Alpha Blocker ** - Z-order for UIDrawables - * Multiple Integrations *
2025-07-05 22:16:52 -04:00
- [x] * * #59 ** ⚠️ **Alpha Blocker ** - Animation system - * Completed! (2025-07-05) *
- [ ] * * #6 ** ⚠️ **Alpha Blocker ** - RenderTexture for all UIDrawables - * Extensive Overhaul *
- [ ] * * #10 ** - UIDrawable visibility/AABB system - * Extensive Overhaul *
- [ ] * * #8 ** - UIGrid RenderTexture viewport sizing - * Multiple Integrations *
feat: Phase 1 - safe constructors and _Drawable foundation
Closes #7 - Make all UI class constructors safe:
- Added safe default constructors for UISprite, UIGrid, UIEntity, UICaption
- Initialize all members to predictable values
- Made Python init functions accept no arguments
- Added x,y properties to UIEntity
Closes #71 - Create _Drawable Python base class:
- Created PyDrawable.h/cpp with base type (not yet inherited by UI types)
- Registered in module initialization
Closes #87 - Add visible property:
- Added bool visible=true to UIDrawable base class
- All render methods check visibility before drawing
Closes #88 - Add opacity property:
- Added float opacity=1.0 to UIDrawable base class
- UICaption and UISprite apply opacity to alpha channel
Closes #89 - Add get_bounds() method:
- Virtual method returns sf::FloatRect(x,y,w,h)
- Implemented in Frame, Caption, Sprite, Grid
Closes #98 - Add move() and resize() methods:
- move(dx,dy) for relative movement
- resize(w,h) for absolute sizing
- Caption resize is no-op (size controlled by font)
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-06 00:13:39 -04:00
- [x] * * #9 ** - UIGrid RenderTexture resize handling - * Multiple Integrations *
2025-07-05 22:16:52 -04:00
- [ ] * * #52 ** - UIGrid skip out-of-bounds entities - * Isolated Fix *
- [ ] * * #50 ** - UIGrid background color field - * Isolated Fix *
- [ ] * * #19 ** - Sprite get/set texture methods - * Multiple Integrations *
- [ ] * * #17 ** - Move UISprite position into sf::Sprite - * Isolated Fix *
- [x] * * #33 ** - Sprite index validation against texture range - * Fixed *
#### Grid/Entity System (6 issues)
- [ ] * * #30 ** - Entity/Grid association management (.die() method) - * Extensive Overhaul *
- [ ] * * #16 ** - Grid strict mode for entity knowledge/visibility - * Extensive Overhaul *
- [ ] * * #67 ** - Grid stitching for infinite worlds - * Extensive Overhaul *
- [ ] * * #15 ** - UIGridPointState cleanup and standardization - * Multiple Integrations *
- [ ] * * #20 ** - UIGrid get_grid_size standardization - * Multiple Integrations *
feat: Phase 1 - safe constructors and _Drawable foundation
Closes #7 - Make all UI class constructors safe:
- Added safe default constructors for UISprite, UIGrid, UIEntity, UICaption
- Initialize all members to predictable values
- Made Python init functions accept no arguments
- Added x,y properties to UIEntity
Closes #71 - Create _Drawable Python base class:
- Created PyDrawable.h/cpp with base type (not yet inherited by UI types)
- Registered in module initialization
Closes #87 - Add visible property:
- Added bool visible=true to UIDrawable base class
- All render methods check visibility before drawing
Closes #88 - Add opacity property:
- Added float opacity=1.0 to UIDrawable base class
- UICaption and UISprite apply opacity to alpha channel
Closes #89 - Add get_bounds() method:
- Virtual method returns sf::FloatRect(x,y,w,h)
- Implemented in Frame, Caption, Sprite, Grid
Closes #98 - Add move() and resize() methods:
- move(dx,dy) for relative movement
- resize(w,h) for absolute sizing
- Caption resize is no-op (size controlled by font)
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-06 00:13:39 -04:00
- [x] * * #12 ** - GridPoint/GridPointState forbid direct init - * Isolated Fix *
2025-07-05 22:16:52 -04:00
2025-07-06 14:43:43 -04:00
#### Scene/Window Management (5 issues)
- [x] * * #61 ** - Scene object encapsulating key callbacks - * Completed Phase 5 *
- [x] * * #34 ** - Window object for resolution/scaling - * Completed Phase 5 *
2025-07-05 22:16:52 -04:00
- [ ] * * #62 ** - Multiple windows support - * Extensive Overhaul *
- [ ] * * #49 ** - Window resolution & viewport controls - * Multiple Integrations *
2025-07-06 14:43:43 -04:00
- [x] * * #1 ** - Scene resize event handling - * Completed Phase 5 *
2025-07-05 22:16:52 -04:00
### 🔧 Quality of Life Features
#### UI Enhancement Features (8 issues)
- [ ] * * #39 ** - Name field on UIDrawables - * Multiple Integrations *
- [ ] * * #40 ** - `only_one` arg for unique naming - * Multiple Integrations *
- [ ] * * #41 ** - `.find(name)` method for collections - * Multiple Integrations *
- [ ] * * #38 ** - `children` arg for Frame initialization - * Isolated Fix *
- [ ] * * #42 ** - Click callback arg for UIDrawable init - * Isolated Fix *
- [x] * * #27 ** - UIEntityCollection.extend() method - * Fixed *
- [ ] * * #28 ** - UICollectionIter for scene ui iteration - * Isolated Fix *
- [ ] * * #26 ** - UIEntityCollectionIter implementation - * Isolated Fix *
### 🧹 Refactoring & Cleanup
#### Code Cleanup (7 issues)
- [x] * * #3 ** ⚠️ **Alpha Blocker ** - Remove `McRFPy_API::player_input` - * Completed *
- [x] * * #2 ** ⚠️ **Alpha Blocker ** - Review `registerPyAction` necessity - * Completed *
- [ ] * * #7 ** - Remove unsafe no-argument constructors - * Multiple Integrations *
- [ ] * * #21 ** - PyUIGrid dealloc cleanup - * Isolated Fix *
- [ ] * * #75 ** - REPL thread separation from SFML window - * Multiple Integrations *
### 📚 Demo & Documentation
#### Documentation (2 issues)
feat: Phase 1 - safe constructors and _Drawable foundation
Closes #7 - Make all UI class constructors safe:
- Added safe default constructors for UISprite, UIGrid, UIEntity, UICaption
- Initialize all members to predictable values
- Made Python init functions accept no arguments
- Added x,y properties to UIEntity
Closes #71 - Create _Drawable Python base class:
- Created PyDrawable.h/cpp with base type (not yet inherited by UI types)
- Registered in module initialization
Closes #87 - Add visible property:
- Added bool visible=true to UIDrawable base class
- All render methods check visibility before drawing
Closes #88 - Add opacity property:
- Added float opacity=1.0 to UIDrawable base class
- UICaption and UISprite apply opacity to alpha channel
Closes #89 - Add get_bounds() method:
- Virtual method returns sf::FloatRect(x,y,w,h)
- Implemented in Frame, Caption, Sprite, Grid
Closes #98 - Add move() and resize() methods:
- move(dx,dy) for relative movement
- resize(w,h) for absolute sizing
- Caption resize is no-op (size controlled by font)
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-06 00:13:39 -04:00
- [x] * * #47 ** ⚠️ **Alpha Blocker ** - Alpha release README.md - * Isolated Fix *
2025-07-05 22:16:52 -04:00
- [ ] * * #48 ** - Dependency compilation documentation - * Isolated Fix *
#### Demo Projects (6 issues)
- [ ] * * #54 ** - Jupyter notebook integration demo - * Multiple Integrations *
- [ ] * * #55 ** - Hunt the Wumpus AI demo - * Multiple Integrations *
- [ ] * * #53 ** - Web interface input demo - * Multiple Integrations * * (New automation API could help) *
- [ ] * * #45 ** - Accessibility mode demos - * Multiple Integrations * * (New automation API could help test) *
- [ ] * * #36 ** - Dear ImGui integration tests - * Extensive Overhaul *
- [ ] * * #65 ** - Python Explorer scene (replaces uitest) - * Extensive Overhaul *
---
## 🎮 STRATEGIC DIRECTION
### Engine Philosophy Maintained
- **C++ First**: Performance-critical code stays in C++
- **Python Close Behind**: Rich scripting without frame-rate impact
- **Game-Ready**: Each improvement should benefit actual game development
### Architecture Goals
1. **Clean Inheritance ** : Drawable → UI components, proper type preservation
2. **Collection Consistency ** : Uniform iteration, indexing, and search patterns
3. **Resource Management ** : RAII everywhere, proper lifecycle handling
4. **Multi-Platform ** : Windows/Linux feature parity maintained
---
## 📚 REFERENCES & CONTEXT
**Issue Dependencies** (Key Chains):
- Iterator System: Grid points → #73 → #69 (Alpha Blocker)
- UI Hierarchy: #71 → #63 (Alpha Blocker)
- Rendering: #6 (Alpha Blocker) → #8 , #9 → #10
- Entity System: #30 → #16 → #67
- Window Management: #34 → #49 , #61 → #62
**Commit References**:
- 167636c: Iterator improvements (UICollection/UIEntityCollection complete)
- Recent work: 7DRL 2025 completion, RPATH updates, console improvements
**Architecture Files**:
- Iterator patterns: src/UICollection.cpp, src/UIGrid.cpp
- Python integration: src/McRFPy_API.cpp, src/PyObjectUtils.h
- Game implementation: src/scripts/ (Crypt of Sokoban complete game)
---
2025-07-08 10:09:37 -04:00
## 🔮 FUTURE VISION: Pure Python Extension Architecture
### Concept: McRogueFace as a Traditional Python Package
**Status**: Unscheduled - Long-term vision
**Complexity**: Major architectural overhaul
Instead of being a C++ application that embeds Python, McRogueFace could be redesigned as a pure Python extension module that can be installed via `pip install mcrogueface` .
### Technical Approach
1. **Separate Core Engine from Python Embedding **
- Extract SFML rendering, audio, and input into C++ extension modules
- Remove embedded CPython interpreter
- Use Python's C API to expose functionality
2. **Module Structure **
```
mcrfpy/
├── __init __ .py # Pure Python coordinator
├── _core.so # C++ rendering/game loop extension
├── _sfml.so # SFML bindings
├── _audio.so # Audio system bindings
└── engine.py # Python game engine logic
```
3. **Inverted Control Flow **
- Python drives the main loop instead of C++
- C++ extensions handle performance-critical operations
- Python manages game logic, scenes, and entity systems
### Benefits
- **Standard Python Packaging**: `pip install mcrogueface`
- **Virtual Environment Support**: Works with venv, conda, poetry
- **Better IDE Integration**: Standard Python development workflow
- **Easier Testing**: Use pytest, standard Python testing tools
- **Cross-Python Compatibility**: Support multiple Python versions
- **Modular Architecture**: Users can import only what they need
### Challenges
- **Major Refactoring**: Complete restructure of codebase
- **Performance Considerations**: Python-driven main loop overhead
- **Build Complexity**: Multiple extension modules to compile
- **Platform Support**: Need wheels for many platform/Python combinations
- **API Stability**: Would need careful design to maintain compatibility
### Implementation Phases (If Pursued)
1. **Proof of Concept ** : Simple SFML binding as Python extension
2. **Core Extraction ** : Separate rendering from Python embedding
3. **Module Design ** : Define clean API boundaries
4. **Incremental Migration ** : Move systems one at a time
5. **Compatibility Layer ** : Support existing games during transition
### Example Usage (Future Vision)
```python
import mcrfpy
from mcrfpy import Scene, Frame, Sprite, Grid
# Create game directly in Python
game = mcrfpy.Game(width=1024, height=768)
# Define scenes using Python classes
class MainMenu(Scene):
def on_enter(self):
self.ui.append(Frame(100, 100, 200, 50))
self.ui.append(Sprite("logo.png", x=400, y=100))
def on_keypress(self, key, pressed):
if key == "ENTER" and pressed:
self.game.set_scene("game")
# Run the game
game.add_scene("menu", MainMenu())
game.run()
```
This architecture would make McRogueFace a first-class Python citizen, following standard Python packaging conventions while maintaining high performance through C++ extensions.
---
*Last Updated: 2025-07-08*