Initial project structure: reusable isometric bot engine with D2R implementation

This commit is contained in:
Hoid 2026-02-14 08:50:36 +00:00
commit e0282a7111
44 changed files with 3433 additions and 0 deletions

34
engine/state/events.py Normal file
View file

@ -0,0 +1,34 @@
"""Event system for inter-component communication."""
from typing import Callable, Any, Dict, List
import logging
logger = logging.getLogger(__name__)
class EventBus:
"""Simple publish/subscribe event system."""
def __init__(self):
self._listeners: Dict[str, List[Callable]] = {}
def on(self, event: str, callback: Callable) -> None:
"""Subscribe to an event."""
self._listeners.setdefault(event, []).append(callback)
def off(self, event: str, callback: Callable) -> None:
"""Unsubscribe from an event."""
if event in self._listeners:
self._listeners[event] = [cb for cb in self._listeners[event] if cb != callback]
def emit(self, event: str, **data: Any) -> None:
"""Emit an event to all subscribers."""
for cb in self._listeners.get(event, []):
try:
cb(**data)
except Exception as e:
logger.error(f"Event handler error for '{event}': {e}")
def clear(self) -> None:
"""Remove all listeners."""
self._listeners.clear()