diff --git a/docs/API_REFERENCE_DYNAMIC.md b/docs/API_REFERENCE_DYNAMIC.md new file mode 100644 index 0000000..4cf6ae8 --- /dev/null +++ b/docs/API_REFERENCE_DYNAMIC.md @@ -0,0 +1,1607 @@ +# McRogueFace API Reference + +*Generated on 2025-12-28 14:29:42* + +*This documentation was dynamically generated from the compiled module.* + +## Table of Contents + +- [Functions](#functions) +- [Classes](#classes) + - [Animation](#animation) + - [Arc](#arc) + - [Caption](#caption) + - [Circle](#circle) + - [Color](#color) + - [ColorLayer](#colorlayer) + - [Drawable](#drawable) + - [Entity](#entity) + - [EntityCollection](#entitycollection) + - [FOV](#fov) + - [Font](#font) + - [Frame](#frame) + - [Grid](#grid) + - [GridPoint](#gridpoint) + - [GridPointState](#gridpointstate) + - [Line](#line) + - [Scene](#scene) + - [Sprite](#sprite) + - [Texture](#texture) + - [TileLayer](#tilelayer) + - [Timer](#timer) + - [UICollection](#uicollection) + - [UICollectionIter](#uicollectioniter) + - [UIEntityCollectionIter](#uientitycollectioniter) + - [Vector](#vector) + - [Window](#window) +- [Constants](#constants) + +## Functions + +### `createScene(name: str) -> None` + +Create a new empty scene. + +Note: + +**Arguments:** +- `name`: Unique name for the new scene + +**Returns:** None + +**Raises:** ValueError: If a scene with this name already exists The scene is created but not made active. Use setScene() to switch to it. + +### `createSoundBuffer(filename: str) -> int` + +Load a sound effect from a file and return its buffer ID. + +**Arguments:** +- `filename`: Path to the sound file (WAV, OGG, FLAC) + +**Returns:** int: Buffer ID for use with playSound() + +**Raises:** RuntimeError: If the file cannot be loaded + +### `currentScene() -> str` + +Get the name of the currently active scene. + +**Returns:** str: Name of the current scene + +### `delTimer(name: str) -> None` + +Stop and remove a timer. + +Note: + +**Arguments:** +- `name`: Timer identifier to remove + +**Returns:** None No error is raised if the timer doesn't exist. + +### `end_benchmark() -> str` + +Stop benchmark capture and write data to JSON file. + +Note: + +**Returns:** str: The filename of the written benchmark data + +**Raises:** RuntimeError: If no benchmark is currently running Returns the auto-generated filename (e.g., 'benchmark_12345_20250528_143022.json') + +### `exit() -> None` + +Cleanly shut down the game engine and exit the application. + +Note: + +**Returns:** None This immediately closes the window and terminates the program. + +### `find(name: str, scene: str = None) -> UIDrawable | None` + +Find the first UI element with the specified name. + +Note: + +**Arguments:** +- `name`: Exact name to search for +- `scene`: Scene to search in (default: current scene) + +**Returns:** Frame, Caption, Sprite, Grid, or Entity if found; None otherwise Searches scene UI elements and entities within grids. + +### `findAll(pattern: str, scene: str = None) -> list` + +Find all UI elements matching a name pattern. + +Note: + +**Arguments:** +- `pattern`: Name pattern with optional wildcards (* matches any characters) +- `scene`: Scene to search in (default: current scene) + +**Returns:** list: All matching UI elements and entities + +### `getMetrics() -> dict` + +Get current performance metrics. + +**Returns:** dict: Performance data with keys: frame_time (last frame duration in seconds), avg_frame_time (average frame time), fps (frames per second), draw_calls (number of draw calls), ui_elements (total UI element count), visible_elements (visible element count), current_frame (frame counter), runtime (total runtime in seconds) + +### `getMusicVolume() -> int` + +Get the current music volume level. + +**Returns:** int: Current volume (0-100) + +### `getSoundVolume() -> int` + +Get the current sound effects volume level. + +**Returns:** int: Current volume (0-100) + +### `keypressScene(handler: callable) -> None` + +Set the keyboard event handler for the current scene. + +Note: + +**Arguments:** +- `handler`: Callable that receives (key_name: str, is_pressed: bool) + +**Returns:** None + +### `loadMusic(filename: str) -> None` + +Load and immediately play background music from a file. + +Note: + +**Arguments:** +- `filename`: Path to the music file (WAV, OGG, FLAC) + +**Returns:** None Only one music track can play at a time. Loading new music stops the current track. + +### `log_benchmark(message: str) -> None` + +Add a log message to the current benchmark frame. + +Note: + +**Arguments:** +- `message`: Text to associate with the current frame + +**Returns:** None + +**Raises:** RuntimeError: If no benchmark is currently running Messages appear in the 'logs' array of each frame in the output JSON. + +### `playSound(buffer_id: int) -> None` + +Play a sound effect using a previously loaded buffer. + +**Arguments:** +- `buffer_id`: Sound buffer ID returned by createSoundBuffer() + +**Returns:** None + +**Raises:** RuntimeError: If the buffer ID is invalid + +### `sceneUI(scene: str = None) -> list` + +Get all UI elements for a scene. + +**Arguments:** +- `scene`: Scene name. If None, uses current scene + +**Returns:** list: All UI elements (Frame, Caption, Sprite, Grid) in the scene + +**Raises:** KeyError: If the specified scene doesn't exist + +### `setDevConsole(enabled: bool) -> None` + +Enable or disable the developer console overlay. + +Note: + +**Arguments:** +- `enabled`: True to enable the console (default), False to disable + +**Returns:** None When disabled, the grave/tilde key will not open the console. Use this to ship games without debug features. + +### `setMusicVolume(volume: int) -> None` + +Set the global music volume. + +**Arguments:** +- `volume`: Volume level from 0 (silent) to 100 (full volume) + +**Returns:** None + +### `setScale(multiplier: float) -> None` + +Scale the game window size. + +Note: + +**Arguments:** +- `multiplier`: Scale factor (e.g., 2.0 for double size) + +**Returns:** None The internal resolution remains 1024x768, but the window is scaled. This is deprecated - use Window.resolution instead. + +### `setScene(scene: str, transition: str = None, duration: float = 0.0) -> None` + +Switch to a different scene with optional transition effect. + +**Arguments:** +- `scene`: Name of the scene to switch to +- `transition`: Transition type ('fade', 'slide_left', 'slide_right', 'slide_up', 'slide_down') +- `duration`: Transition duration in seconds (default: 0.0 for instant) + +**Returns:** None + +**Raises:** KeyError: If the scene doesn't exist ValueError: If the transition type is invalid + +### `setSoundVolume(volume: int) -> None` + +Set the global sound effects volume. + +**Arguments:** +- `volume`: Volume level from 0 (silent) to 100 (full volume) + +**Returns:** None + +### `setTimer(name: str, handler: callable, interval: int) -> None` + +Create or update a recurring timer. + +Note: + +**Arguments:** +- `name`: Unique identifier for the timer +- `handler`: Function called with (runtime: float) parameter +- `interval`: Time between calls in milliseconds + +**Returns:** None If a timer with this name exists, it will be replaced. The handler receives the total runtime in seconds as its argument. + +### `start_benchmark() -> None` + +Start capturing benchmark data to a file. + +Note: + +**Returns:** None + +**Raises:** RuntimeError: If a benchmark is already running Benchmark filename is auto-generated from PID and timestamp. Use end_benchmark() to stop and get filename. + +### `step(dt: float = None) -> float` + +Advance simulation time (headless mode only). + +Note: + +**Arguments:** +- `dt`: Time to advance in seconds. If None, advances to the next scheduled event (timer/animation). + +**Returns:** float: Actual time advanced in seconds. Returns 0.0 in windowed mode. In windowed mode, this is a no-op and returns 0.0. Use this for deterministic simulation control in headless/testing scenarios. + +## Classes + +### Animation + +Animation object for animating UI properties + +**Methods:** + +#### `complete() -> None` + +Complete the animation immediately by jumping to the final value. + +Note: + +**Returns:** None Sets elapsed = duration and applies target value immediately. Completion callback will be called if set. + +#### `get_current_value() -> Any` + +Get the current interpolated value of the animation. + +Note: + +**Returns:** Any: Current value (type depends on property: float, int, Color tuple, Vector tuple, or str) Return type matches the target property type. For sprite_index returns int, for pos returns (x, y), for fill_color returns (r, g, b, a). + +#### `hasValidTarget() -> bool` + +Check if the animation still has a valid target. + +Note: + +**Returns:** bool: True if the target still exists, False if it was destroyed Animations automatically clean up when targets are destroyed. Use this to check if manual cleanup is needed. + +#### `start(target: UIDrawable, conflict_mode: str = 'replace') -> None` + +Start the animation on a target UI element. + +Note: + +**Arguments:** +- `target`: The UI element to animate (Frame, Caption, Sprite, Grid, or Entity) +- `conflict_mode`: How to handle conflicts if property is already animating: 'replace' (default) - complete existing animation and start new one; 'queue' - wait for existing animation to complete; 'error' - raise RuntimeError if property is busy + +**Returns:** None + +**Raises:** RuntimeError: When conflict_mode='error' and property is already animating The animation will automatically stop if the target is destroyed. + +#### `update(delta_time: float) -> bool` + +Update the animation by the given time delta. + +Note: + +**Arguments:** +- `delta_time`: Time elapsed since last update in seconds + +**Returns:** bool: True if animation is still running, False if complete Typically called by AnimationManager automatically. Manual calls only needed for custom animation control. + +### Arc + +*Inherits from: Drawable* + +Arc(center=None, radius=0, start_angle=0, end_angle=90, color=None, thickness=1, **kwargs) + +An arc UI element for drawing curved line segments. + +Args: + center (tuple, optional): Center position as (x, y). Default: (0, 0) + radius (float, optional): Arc radius in pixels. Default: 0 + start_angle (float, optional): Starting angle in degrees. Default: 0 + end_angle (float, optional): Ending angle in degrees. Default: 90 + color (Color, optional): Arc color. Default: White + thickness (float, optional): Line thickness. Default: 1.0 + +Keyword Args: + on_click (callable): Click handler. Default: None + visible (bool): Visibility state. Default: True + opacity (float): Opacity (0.0-1.0). Default: 1.0 + z_index (int): Rendering order. Default: 0 + name (str): Element name for finding. Default: None + +Attributes: + center (Vector): Center position + radius (float): Arc radius + start_angle (float): Starting angle in degrees + end_angle (float): Ending angle in degrees + color (Color): Arc color + thickness (float): Line thickness + visible (bool): Visibility state + opacity (float): Opacity value + z_index (int): Rendering order + name (str): Element name + + +**Methods:** + +#### `get_bounds() -> tuple` + +Get the bounding rectangle of this drawable element. + +Note: + +**Returns:** tuple: (x, y, width, height) representing the element's bounds The bounds are in screen coordinates and account for current position and size. + +#### `move(dx: float, dy: float) -> None` + +Move the element by a relative offset. + +Note: + +**Arguments:** +- `dx`: Horizontal offset in pixels +- `dy`: Vertical offset in pixels + +#### `resize(width: float, height: float) -> None` + +Resize the element to new dimensions. + +Note: + +**Arguments:** +- `width`: New width in pixels +- `height`: New height in pixels + +### Caption + +*Inherits from: Drawable* + +Caption(pos=None, font=None, text='', **kwargs) + +A text display UI element with customizable font and styling. + +Args: + pos (tuple, optional): Position as (x, y) tuple. Default: (0, 0) + font (Font, optional): Font object for text rendering. Default: engine default font + text (str, optional): The text content to display. Default: '' + +Keyword Args: + fill_color (Color): Text fill color. Default: (255, 255, 255, 255) + outline_color (Color): Text outline color. Default: (0, 0, 0, 255) + outline (float): Text outline thickness. Default: 0 + font_size (float): Font size in points. Default: 16 + click (callable): Click event handler. Default: None + visible (bool): Visibility state. Default: True + opacity (float): Opacity (0.0-1.0). Default: 1.0 + z_index (int): Rendering order. Default: 0 + name (str): Element name for finding. Default: None + x (float): X position override. Default: 0 + y (float): Y position override. Default: 0 + +Attributes: + text (str): The displayed text content + x, y (float): Position in pixels + pos (Vector): Position as a Vector object + font (Font): Font used for rendering + font_size (float): Font size in points + fill_color, outline_color (Color): Text appearance + outline (float): Outline thickness + click (callable): Click event handler + visible (bool): Visibility state + opacity (float): Opacity value + z_index (int): Rendering order + name (str): Element name + w, h (float): Read-only computed size based on text and font + +**Methods:** + +#### `get_bounds() -> tuple` + +Get the bounding rectangle of this drawable element. + +Note: + +**Returns:** tuple: (x, y, width, height) representing the element's bounds The bounds are in screen coordinates and account for current position and size. + +#### `move(dx: float, dy: float) -> None` + +Move the element by a relative offset. + +Note: + +**Arguments:** +- `dx`: Horizontal offset in pixels +- `dy`: Vertical offset in pixels + +#### `resize(width: float, height: float) -> None` + +Resize the element to new dimensions. + +Note: + +**Arguments:** +- `width`: New width in pixels +- `height`: New height in pixels + +### Circle + +*Inherits from: Drawable* + +Circle(radius=0, center=None, fill_color=None, outline_color=None, outline=0, **kwargs) + +A circle UI element for drawing filled or outlined circles. + +Args: + radius (float, optional): Circle radius in pixels. Default: 0 + center (tuple, optional): Center position as (x, y). Default: (0, 0) + fill_color (Color, optional): Fill color. Default: White + outline_color (Color, optional): Outline color. Default: Transparent + outline (float, optional): Outline thickness. Default: 0 (no outline) + +Keyword Args: + on_click (callable): Click handler. Default: None + visible (bool): Visibility state. Default: True + opacity (float): Opacity (0.0-1.0). Default: 1.0 + z_index (int): Rendering order. Default: 0 + name (str): Element name for finding. Default: None + +Attributes: + radius (float): Circle radius + center (Vector): Center position + fill_color (Color): Fill color + outline_color (Color): Outline color + outline (float): Outline thickness + visible (bool): Visibility state + opacity (float): Opacity value + z_index (int): Rendering order + name (str): Element name + + +**Methods:** + +#### `get_bounds() -> tuple` + +Get the bounding rectangle of this drawable element. + +Note: + +**Returns:** tuple: (x, y, width, height) representing the element's bounds The bounds are in screen coordinates and account for current position and size. + +#### `move(dx: float, dy: float) -> None` + +Move the element by a relative offset. + +Note: + +**Arguments:** +- `dx`: Horizontal offset in pixels +- `dy`: Vertical offset in pixels + +#### `resize(width: float, height: float) -> None` + +Resize the element to new dimensions. + +Note: + +**Arguments:** +- `width`: New width in pixels +- `height`: New height in pixels + +### Color + +SFML Color Object + +**Methods:** + +#### `from_hex(hex_string: str) -> Color` + +Create a Color from a hexadecimal string. + +Note: + +**Arguments:** +- `hex_string`: Hex color string (e.g., '#FF0000', 'FF0000', '#AABBCCDD' for RGBA) + +**Returns:** Color: New Color object with values from hex string + +**Raises:** ValueError: If hex string is not 6 or 8 characters (RGB or RGBA) This is a class method. Call as Color.from_hex('#FF0000') + +#### `lerp(other: Color, t: float) -> Color` + +Linearly interpolate between this color and another. + +Note: + +**Arguments:** +- `other`: The target Color to interpolate towards +- `t`: Interpolation factor (0.0 = this color, 1.0 = other color). Automatically clamped to [0.0, 1.0] + +**Returns:** Color: New Color representing the interpolated value All components (r, g, b, a) are interpolated independently + +#### `to_hex() -> str` + +Convert this Color to a hexadecimal string. + +Note: + +**Returns:** str: Hex string in format '#RRGGBB' or '#RRGGBBAA' (if alpha < 255) Alpha component is only included if not fully opaque (< 255) + +### ColorLayer + +ColorLayer(z_index=-1, grid_size=None) + +A grid layer that stores RGBA colors per cell. + +Args: + z_index (int): Render order. Negative = below entities. Default: -1 + grid_size (tuple): Dimensions as (width, height). Default: parent grid size + +Attributes: + z_index (int): Layer z-order relative to entities + visible (bool): Whether layer is rendered + grid_size (tuple): Layer dimensions (read-only) + +Methods: + at(x, y): Get color at cell position + set(x, y, color): Set color at cell position + fill(color): Fill entire layer with color + +**Methods:** + +#### `apply_perspective(entity, visible=None, discovered=None, unknown=None)` + +Bind this layer to an entity for automatic FOV updates. + +#### `at(x, y) -> Color` + +Get the color at cell position (x, y). + +#### `clear_perspective()` + +Remove the perspective binding from this layer. + +#### `draw_fov(source, radius=None, fov=None, visible=None, discovered=None, unknown=None)` + +Paint cells based on field-of-view visibility from source position. + +Note: Layer must be attached to a grid for FOV calculation. + +#### `fill(color)` + +Fill the entire layer with the specified color. + +#### `fill_rect(pos, size, color)` + +Fill a rectangular region with a color. + +**Arguments:** +- `color`: Color object or (r, g, b[, a]) tuple + +#### `set(x, y, color)` + +Set the color at cell position (x, y). + +#### `update_perspective()` + +Redraw FOV based on the bound entity's current position. +Call this after the entity moves to update the visibility layer. + +### Drawable + +Base class for all drawable UI elements + +**Methods:** + +#### `get_bounds() -> tuple` + +Get the bounding rectangle of this drawable element. + +Note: + +**Returns:** tuple: (x, y, width, height) representing the element's bounds The bounds are in screen coordinates and account for current position and size. + +#### `move(dx: float, dy: float) -> None` + +Move the element by a relative offset. + +Note: + +**Arguments:** +- `dx`: Horizontal offset in pixels +- `dy`: Vertical offset in pixels + +#### `resize(width: float, height: float) -> None` + +Resize the element to new dimensions. + +Note: + +**Arguments:** +- `width`: New width in pixels +- `height`: New height in pixels + +### Entity + +Entity(grid_pos=None, texture=None, sprite_index=0, **kwargs) + +A game entity that exists on a grid with sprite rendering. + +Args: + grid_pos (tuple, optional): Grid position as (x, y) tuple. Default: (0, 0) + texture (Texture, optional): Texture object for sprite. Default: default texture + sprite_index (int, optional): Index into texture atlas. Default: 0 + +Keyword Args: + grid (Grid): Grid to attach entity to. Default: None + visible (bool): Visibility state. Default: True + opacity (float): Opacity (0.0-1.0). Default: 1.0 + name (str): Element name for finding. Default: None + x (float): X grid position override. Default: 0 + y (float): Y grid position override. Default: 0 + +Attributes: + pos (tuple): Grid position as (x, y) tuple + x, y (float): Grid position coordinates + draw_pos (tuple): Pixel position for rendering + gridstate (GridPointState): Visibility state for grid points + sprite_index (int): Current sprite index + visible (bool): Visibility state + opacity (float): Opacity value + name (str): Element name + +**Methods:** + +#### `at(...)` + +#### `die(...)` + +Remove this entity from its grid + +#### `get_bounds() -> tuple` + +Get the bounding rectangle of this drawable element. + +Note: + +**Returns:** tuple: (x, y, width, height) representing the element's bounds The bounds are in screen coordinates and account for current position and size. + +#### `index(...)` + +Return the index of this entity in its grid's entity collection + +#### `move(dx: float, dy: float) -> None` + +Move the element by a relative offset. + +Note: + +**Arguments:** +- `dx`: Horizontal offset in pixels +- `dy`: Vertical offset in pixels + +#### `path_to(x: int, y: int) -> bool` + +Find and follow path to target position using A* pathfinding. + +**Arguments:** +- `x`: Target X coordinate +- `y`: Target Y coordinate + +**Returns:** True if a path was found and the entity started moving, False otherwise The entity will automatically move along the path over multiple frames. Call this again to change the target or repath. + +#### `resize(width: float, height: float) -> None` + +Resize the element to new dimensions. + +Note: + +**Arguments:** +- `width`: New width in pixels +- `height`: New height in pixels + +#### `update_visibility() -> None` + +Update entity's visibility state based on current FOV. +Recomputes which cells are visible from the entity's position and updates +the entity's gridstate to track explored areas. This is called automatically +when the entity moves if it has a grid with perspective set. + +#### `visible_entities(fov=None, radius=None) -> list[Entity]` + +Get list of other entities visible from this entity's position. + +**Returns:** List of Entity objects that are within field of view. Computes FOV from this entity's position and returns all other entities whose positions fall within the visible area. + +### EntityCollection + +Iterable, indexable collection of Entities + +**Methods:** + +#### `append(entity)` + +Add an entity to the end of the collection. + +#### `count(entity) -> int` + +Count occurrences of entity in the collection. + +#### `extend(iterable)` + +Add all entities from an iterable to the collection. + +#### `find(name) -> entity or list` + +Find entities by name. + +**Returns:** Single entity if exact match, list if wildcard, None if not found. + +#### `index(entity) -> int` + +Return index of first occurrence of entity. Raises ValueError if not found. + +#### `insert(index, entity)` + +Insert entity at index. Like list.insert(), indices past the end append. + +#### `pop([index]) -> entity` + +Remove and return entity at index (default: last entity). + +#### `remove(entity)` + +Remove first occurrence of entity. Raises ValueError if not found. + +### FOV + +*Inherits from: IntEnum* + +**Methods:** + +#### `as_integer_ratio(...)` + +Return a pair of integers, whose ratio is equal to the original int. +The ratio is in lowest terms and has a positive denominator. +>>> (10).as_integer_ratio() +(10, 1) +>>> (-10).as_integer_ratio() +(-10, 1) +>>> (0).as_integer_ratio() +(0, 1) + +#### `bit_count(...)` + +Number of ones in the binary representation of the absolute value of self. +Also known as the population count. +>>> bin(13) +'0b1101' +>>> (13).bit_count() +3 + +#### `bit_length(...)` + +Number of bits necessary to represent self in binary. +>>> bin(37) +'0b100101' +>>> (37).bit_length() +6 + +#### `conjugate(...)` + +Returns self, the complex conjugate of any int. + +#### `from_bytes(...)` + +Return the integer represented by the given array of bytes. + bytes + Holds the array of bytes to convert. The argument must either + support the buffer protocol or be an iterable object producing bytes. + Bytes and bytearray are examples of built-in objects that support the + buffer protocol. + byteorder + The byte order used to represent the integer. If byteorder is 'big', + the most significant byte is at the beginning of the byte array. If + byteorder is 'little', the most significant byte is at the end of the + byte array. To request the native byte order of the host system, use + sys.byteorder as the byte order value. Default is to use 'big'. + signed + Indicates whether two's complement is used to represent the integer. + +#### `is_integer(...)` + +Returns True. Exists for duck type compatibility with float.is_integer. + +#### `to_bytes(...)` + +Return an array of bytes representing an integer. + length + Length of bytes object to use. An OverflowError is raised if the + integer is not representable with the given number of bytes. Default + is length 1. + byteorder + The byte order used to represent the integer. If byteorder is 'big', + the most significant byte is at the beginning of the byte array. If + byteorder is 'little', the most significant byte is at the end of the + byte array. To request the native byte order of the host system, use + sys.byteorder as the byte order value. Default is to use 'big'. + signed + Determines whether two's complement is used to represent the integer. + If signed is False and a negative integer is given, an OverflowError + is raised. + +### Font + +SFML Font Object + +**Methods:** + +### Frame + +*Inherits from: Drawable* + +Frame(pos=None, size=None, **kwargs) + +A rectangular frame UI element that can contain other drawable elements. + +Args: + pos (tuple, optional): Position as (x, y) tuple. Default: (0, 0) + size (tuple, optional): Size as (width, height) tuple. Default: (0, 0) + +Keyword Args: + fill_color (Color): Background fill color. Default: (0, 0, 0, 128) + outline_color (Color): Border outline color. Default: (255, 255, 255, 255) + outline (float): Border outline thickness. Default: 0 + click (callable): Click event handler. Default: None + children (list): Initial list of child drawable elements. Default: None + visible (bool): Visibility state. Default: True + opacity (float): Opacity (0.0-1.0). Default: 1.0 + z_index (int): Rendering order. Default: 0 + name (str): Element name for finding. Default: None + x (float): X position override. Default: 0 + y (float): Y position override. Default: 0 + w (float): Width override. Default: 0 + h (float): Height override. Default: 0 + clip_children (bool): Whether to clip children to frame bounds. Default: False + cache_subtree (bool): Cache rendering to texture for performance. Default: False + +Attributes: + x, y (float): Position in pixels + w, h (float): Size in pixels + pos (Vector): Position as a Vector object + fill_color, outline_color (Color): Visual appearance + outline (float): Border thickness + click (callable): Click event handler + children (list): Collection of child drawable elements + visible (bool): Visibility state + opacity (float): Opacity value + z_index (int): Rendering order + name (str): Element name + clip_children (bool): Whether to clip children to frame bounds + cache_subtree (bool): Cache subtree rendering to texture + +**Methods:** + +#### `get_bounds() -> tuple` + +Get the bounding rectangle of this drawable element. + +Note: + +**Returns:** tuple: (x, y, width, height) representing the element's bounds The bounds are in screen coordinates and account for current position and size. + +#### `move(dx: float, dy: float) -> None` + +Move the element by a relative offset. + +Note: + +**Arguments:** +- `dx`: Horizontal offset in pixels +- `dy`: Vertical offset in pixels + +#### `resize(width: float, height: float) -> None` + +Resize the element to new dimensions. + +Note: + +**Arguments:** +- `width`: New width in pixels +- `height`: New height in pixels + +### Grid + +*Inherits from: Drawable* + +Grid(pos=None, size=None, grid_size=None, texture=None, **kwargs) + +A grid-based UI element for tile-based rendering and entity management. + +Args: + pos (tuple, optional): Position as (x, y) tuple. Default: (0, 0) + size (tuple, optional): Size as (width, height) tuple. Default: auto-calculated from grid_size + grid_size (tuple, optional): Grid dimensions as (grid_x, grid_y) tuple. Default: (2, 2) + texture (Texture, optional): Texture containing tile sprites. Default: default texture + +Keyword Args: + fill_color (Color): Background fill color. Default: None + click (callable): Click event handler. Default: None + center_x (float): X coordinate of center point. Default: 0 + center_y (float): Y coordinate of center point. Default: 0 + zoom (float): Zoom level for rendering. Default: 1.0 + perspective (int): Entity perspective index (-1 for omniscient). Default: -1 + visible (bool): Visibility state. Default: True + opacity (float): Opacity (0.0-1.0). Default: 1.0 + z_index (int): Rendering order. Default: 0 + name (str): Element name for finding. Default: None + x (float): X position override. Default: 0 + y (float): Y position override. Default: 0 + w (float): Width override. Default: auto-calculated + h (float): Height override. Default: auto-calculated + grid_x (int): Grid width override. Default: 2 + grid_y (int): Grid height override. Default: 2 + +Attributes: + x, y (float): Position in pixels + w, h (float): Size in pixels + pos (Vector): Position as a Vector object + size (tuple): Size as (width, height) tuple + center (tuple): Center point as (x, y) tuple + center_x, center_y (float): Center point coordinates + zoom (float): Zoom level for rendering + grid_size (tuple): Grid dimensions (width, height) in tiles + grid_x, grid_y (int): Grid dimensions + texture (Texture): Tile texture atlas + fill_color (Color): Background color + entities (EntityCollection): Collection of entities in the grid + perspective (int): Entity perspective index + click (callable): Click event handler + visible (bool): Visibility state + opacity (float): Opacity value + z_index (int): Rendering order + name (str): Element name + +**Methods:** + +#### `add_layer(type: str, z_index: int = -1, texture: Texture = None) -> ColorLayer | TileLayer` + +Add a new layer to the grid. + +**Arguments:** +- `type`: Layer type ('color' or 'tile') +- `z_index`: Render order. Negative = below entities, >= 0 = above entities. Default: -1 +- `texture`: Texture for tile layers. Required for 'tile' type. + +**Returns:** The created ColorLayer or TileLayer object. + +#### `at(...)` + +#### `compute_astar_path(x1: int, y1: int, x2: int, y2: int, diagonal_cost: float = 1.41) -> List[Tuple[int, int]]` + +Compute A* path between two points. + +**Arguments:** +- `x1`: Starting X coordinate +- `y1`: Starting Y coordinate +- `x2`: Target X coordinate +- `y2`: Target Y coordinate +- `diagonal_cost`: Cost of diagonal movement (default: 1.41) + +**Returns:** List of (x, y) tuples representing the path, empty list if no path exists Alternative A* implementation. Prefer find_path() for consistency. + +#### `compute_dijkstra(root_x: int, root_y: int, diagonal_cost: float = 1.41) -> None` + +Compute Dijkstra map from root position. + +**Arguments:** +- `root_x`: X coordinate of the root/target +- `root_y`: Y coordinate of the root/target +- `diagonal_cost`: Cost of diagonal movement (default: 1.41) + +#### `compute_fov(x: int, y: int, radius: int = 0, light_walls: bool = True, algorithm: int = FOV_BASIC) -> None` + +Compute field of view from a position. + +**Arguments:** +- `x`: X coordinate of the viewer +- `y`: Y coordinate of the viewer +- `radius`: Maximum view distance (0 = unlimited) +- `light_walls`: Whether walls are lit when visible +- `algorithm`: FOV algorithm to use (FOV_BASIC, FOV_DIAMOND, FOV_SHADOW, FOV_PERMISSIVE_0-8) + +#### `entities_in_radius(x: float, y: float, radius: float) -> list[Entity]` + +Query entities within radius using spatial hash (O(k) where k = nearby entities). + +**Arguments:** +- `x`: Center X coordinate +- `y`: Center Y coordinate +- `radius`: Search radius + +**Returns:** List of Entity objects within the radius. + +#### `find_path(x1: int, y1: int, x2: int, y2: int, diagonal_cost: float = 1.41) -> List[Tuple[int, int]]` + +Find A* path between two points. + +**Arguments:** +- `x1`: Starting X coordinate +- `y1`: Starting Y coordinate +- `x2`: Target X coordinate +- `y2`: Target Y coordinate +- `diagonal_cost`: Cost of diagonal movement (default: 1.41) + +**Returns:** List of (x, y) tuples representing the path, empty list if no path exists Uses A* algorithm with walkability from grid cells. + +#### `get_bounds() -> tuple` + +Get the bounding rectangle of this drawable element. + +Note: + +**Returns:** tuple: (x, y, width, height) representing the element's bounds The bounds are in screen coordinates and account for current position and size. + +#### `get_dijkstra_distance(x: int, y: int) -> Optional[float]` + +Get distance from Dijkstra root to position. + +**Arguments:** +- `x`: X coordinate to query +- `y`: Y coordinate to query + +**Returns:** Distance as float, or None if position is unreachable or invalid Must call compute_dijkstra() first. + +#### `get_dijkstra_path(x: int, y: int) -> List[Tuple[int, int]]` + +Get path from position to Dijkstra root. + +**Arguments:** +- `x`: Starting X coordinate +- `y`: Starting Y coordinate + +**Returns:** List of (x, y) tuples representing path to root, empty if unreachable Must call compute_dijkstra() first. Path includes start but not root position. + +#### `is_in_fov(x: int, y: int) -> bool` + +Check if a cell is in the field of view. + +**Arguments:** +- `x`: X coordinate to check +- `y`: Y coordinate to check + +**Returns:** True if the cell is visible, False otherwise Must call compute_fov() first to calculate visibility. + +#### `layer(z_index: int) -> ColorLayer | TileLayer | None` + +Get a layer by its z_index. + +**Arguments:** +- `z_index`: The z_index of the layer to find. + +**Returns:** The layer with the specified z_index, or None if not found. + +#### `move(dx: float, dy: float) -> None` + +Move the element by a relative offset. + +Note: + +**Arguments:** +- `dx`: Horizontal offset in pixels +- `dy`: Vertical offset in pixels + +#### `remove_layer(layer: ColorLayer | TileLayer) -> None` + +Remove a layer from the grid. + +**Arguments:** +- `layer`: The layer to remove. + +#### `resize(width: float, height: float) -> None` + +Resize the element to new dimensions. + +Note: + +**Arguments:** +- `width`: New width in pixels +- `height`: New height in pixels + +### GridPoint + +UIGridPoint object + +**Methods:** + +### GridPointState + +UIGridPointState object + +**Methods:** + +### Line + +*Inherits from: Drawable* + +Line(start=None, end=None, thickness=1.0, color=None, **kwargs) + +A line UI element for drawing straight lines between two points. + +Args: + start (tuple, optional): Starting point as (x, y). Default: (0, 0) + end (tuple, optional): Ending point as (x, y). Default: (0, 0) + thickness (float, optional): Line thickness in pixels. Default: 1.0 + color (Color, optional): Line color. Default: White + +Keyword Args: + on_click (callable): Click handler. Default: None + visible (bool): Visibility state. Default: True + opacity (float): Opacity (0.0-1.0). Default: 1.0 + z_index (int): Rendering order. Default: 0 + name (str): Element name for finding. Default: None + +Attributes: + start (Vector): Starting point + end (Vector): Ending point + thickness (float): Line thickness + color (Color): Line color + visible (bool): Visibility state + opacity (float): Opacity value + z_index (int): Rendering order + name (str): Element name + + +**Methods:** + +#### `get_bounds() -> tuple` + +Get the bounding rectangle of this drawable element. + +Note: + +**Returns:** tuple: (x, y, width, height) representing the element's bounds The bounds are in screen coordinates and account for current position and size. + +#### `move(dx: float, dy: float) -> None` + +Move the element by a relative offset. + +Note: + +**Arguments:** +- `dx`: Horizontal offset in pixels +- `dy`: Vertical offset in pixels + +#### `resize(width: float, height: float) -> None` + +Resize the element to new dimensions. + +Note: + +**Arguments:** +- `width`: New width in pixels +- `height`: New height in pixels + +### Scene + +Base class for object-oriented scenes + +**Methods:** + +#### `activate() -> None` + +Make this the active scene. + +Note: + +**Returns:** None Deactivates the current scene and activates this one. Scene transitions and lifecycle callbacks are triggered. + +#### `register_keyboard(callback: callable) -> None` + +Register a keyboard event handler function. + +Note: + +**Arguments:** +- `callback`: Function that receives (key: str, pressed: bool) when keyboard events occur + +**Returns:** None Alternative to setting on_key property. Handler is called for both key press and release events. + +### Sprite + +*Inherits from: Drawable* + +Sprite(pos=None, texture=None, sprite_index=0, **kwargs) + +A sprite UI element that displays a texture or portion of a texture atlas. + +Args: + pos (tuple, optional): Position as (x, y) tuple. Default: (0, 0) + texture (Texture, optional): Texture object to display. Default: default texture + sprite_index (int, optional): Index into texture atlas. Default: 0 + +Keyword Args: + scale (float): Uniform scale factor. Default: 1.0 + scale_x (float): Horizontal scale factor. Default: 1.0 + scale_y (float): Vertical scale factor. Default: 1.0 + click (callable): Click event handler. Default: None + visible (bool): Visibility state. Default: True + opacity (float): Opacity (0.0-1.0). Default: 1.0 + z_index (int): Rendering order. Default: 0 + name (str): Element name for finding. Default: None + x (float): X position override. Default: 0 + y (float): Y position override. Default: 0 + +Attributes: + x, y (float): Position in pixels + pos (Vector): Position as a Vector object + texture (Texture): The texture being displayed + sprite_index (int): Current sprite index in texture atlas + scale (float): Uniform scale factor + scale_x, scale_y (float): Individual scale factors + click (callable): Click event handler + visible (bool): Visibility state + opacity (float): Opacity value + z_index (int): Rendering order + name (str): Element name + w, h (float): Read-only computed size based on texture and scale + +**Methods:** + +#### `get_bounds() -> tuple` + +Get the bounding rectangle of this drawable element. + +Note: + +**Returns:** tuple: (x, y, width, height) representing the element's bounds The bounds are in screen coordinates and account for current position and size. + +#### `move(dx: float, dy: float) -> None` + +Move the element by a relative offset. + +Note: + +**Arguments:** +- `dx`: Horizontal offset in pixels +- `dy`: Vertical offset in pixels + +#### `resize(width: float, height: float) -> None` + +Resize the element to new dimensions. + +Note: + +**Arguments:** +- `width`: New width in pixels +- `height`: New height in pixels + +### Texture + +SFML Texture Object + +**Methods:** + +### TileLayer + +TileLayer(z_index=-1, texture=None, grid_size=None) + +A grid layer that stores sprite indices per cell. + +Args: + z_index (int): Render order. Negative = below entities. Default: -1 + texture (Texture): Sprite atlas for tile rendering. Default: None + grid_size (tuple): Dimensions as (width, height). Default: parent grid size + +Attributes: + z_index (int): Layer z-order relative to entities + visible (bool): Whether layer is rendered + texture (Texture): Tile sprite atlas + grid_size (tuple): Layer dimensions (read-only) + +Methods: + at(x, y): Get tile index at cell position + set(x, y, index): Set tile index at cell position + fill(index): Fill entire layer with tile index + +**Methods:** + +#### `at(x, y) -> int` + +Get the tile index at cell position (x, y). Returns -1 if no tile. + +#### `fill(index)` + +Fill the entire layer with the specified tile index. + +#### `fill_rect(pos, size, index)` + +Fill a rectangular region with a tile index. + +#### `set(x, y, index)` + +Set the tile index at cell position (x, y). Use -1 for no tile. + +### Timer + +Timer(name, callback, interval, once=False) + +Create a timer that calls a function at regular intervals. + +Args: + name (str): Unique identifier for the timer + callback (callable): Function to call - receives (timer, runtime) args + interval (int): Time between calls in milliseconds + once (bool): If True, timer stops after first call. Default: False + +Attributes: + interval (int): Time between calls in milliseconds + remaining (int): Time until next call in milliseconds (read-only) + paused (bool): Whether timer is paused (read-only) + active (bool): Whether timer is active and not paused (read-only) + callback (callable): The callback function + once (bool): Whether timer stops after firing once + +Methods: + pause(): Pause the timer, preserving time remaining + resume(): Resume a paused timer + cancel(): Stop and remove the timer + restart(): Reset timer to start from beginning + +Example: + def on_timer(timer, runtime): + print(f'Timer {timer} fired at {runtime}ms') + if runtime > 5000: + timer.cancel() + + timer = mcrfpy.Timer('my_timer', on_timer, 1000) + timer.pause() # Pause timer + timer.resume() # Resume timer + timer.once = True # Make it one-shot + +**Methods:** + +#### `cancel() -> None` + +Cancel the timer and remove it from the timer system. + +Note: + +**Returns:** None The timer will no longer fire and cannot be restarted. The callback will not be called again. + +#### `pause() -> None` + +Pause the timer, preserving the time remaining until next trigger. + +Note: + +**Returns:** None The timer can be resumed later with resume(). Time spent paused does not count toward the interval. + +#### `restart() -> None` + +Restart the timer from the beginning. + +Note: + +**Returns:** None Resets the timer to fire after a full interval from now, regardless of remaining time. + +#### `resume() -> None` + +Resume a paused timer from where it left off. + +Note: + +**Returns:** None Has no effect if the timer is not paused. Timer will fire after the remaining time elapses. + +### UICollection + +Iterable, indexable collection of UI objects + +**Methods:** + +#### `append(element)` + +Add an element to the end of the collection. + +#### `count(element) -> int` + +Count occurrences of element in the collection. + +#### `extend(iterable)` + +Add all elements from an iterable to the collection. + +#### `find(name, recursive=False) -> element or list` + +Find elements by name. + +**Returns:** Single element if exact match, list if wildcard, None if not found. + +#### `index(element) -> int` + +Return index of first occurrence of element. Raises ValueError if not found. + +#### `insert(index, element)` + +Insert element at index. Like list.insert(), indices past the end append. + +Note: If using z_index for sorting, insertion order may not persist after +the next render. Use name-based .find() for stable element access. + +#### `pop([index]) -> element` + +Remove and return element at index (default: last element). + +Note: If using z_index for sorting, indices may shift after render. +Use name-based .find() for stable element access. + +#### `remove(element)` + +Remove first occurrence of element. Raises ValueError if not found. + +### UICollectionIter + +Iterator for a collection of UI objects + +**Methods:** + +### UIEntityCollectionIter + +Iterator for a collection of UI objects + +**Methods:** + +### Vector + +SFML Vector Object + +**Methods:** + +#### `angle() -> float` + +Get the angle of this vector in radians. + +**Returns:** float: Angle in radians from positive x-axis + +#### `copy() -> Vector` + +Create a copy of this vector. + +**Returns:** Vector: New Vector object with same x and y values + +#### `distance_to(other: Vector) -> float` + +Calculate the distance to another vector. + +**Arguments:** +- `other`: The other vector + +**Returns:** float: Distance between the two vectors + +#### `dot(other: Vector) -> float` + +Calculate the dot product with another vector. + +**Arguments:** +- `other`: The other vector + +**Returns:** float: Dot product of the two vectors + +#### `floor() -> Vector` + +Return a new vector with floored (integer) coordinates. + +Note: + +**Returns:** Vector: New Vector with floor(x) and floor(y) Useful for grid-based positioning. For a hashable tuple, use the .int property instead. + +#### `magnitude() -> float` + +Calculate the length/magnitude of this vector. + +**Returns:** float: The magnitude of the vector + +#### `magnitude_squared() -> float` + +Calculate the squared magnitude of this vector. + +Note: + +**Returns:** float: The squared magnitude (faster than magnitude()) Use this for comparisons to avoid expensive square root calculation. + +#### `normalize() -> Vector` + +Return a unit vector in the same direction. + +Note: + +**Returns:** Vector: New normalized vector with magnitude 1.0 For zero vectors (magnitude 0.0), returns a zero vector rather than raising an exception + +### Window + +Window singleton for accessing and modifying the game window properties + +**Methods:** + +#### `center() -> None` + +Center the window on the screen. + +Note: + +**Returns:** None Only works in windowed mode. Has no effect when fullscreen or in headless mode. + +#### `get() -> Window` + +Get the Window singleton instance. + +Note: + +**Returns:** Window: The global window object This is a class method. Call as Window.get(). There is only one window instance per application. + +#### `screenshot(filename: str = None) -> bytes | None` + +Take a screenshot of the current window contents. + +Note: + +**Arguments:** +- `filename`: Optional path to save screenshot. If omitted, returns raw RGBA bytes. + +**Returns:** bytes | None: Raw RGBA pixel data if no filename given, otherwise None after saving Screenshot is taken at the actual window resolution. Use after render loop update for current frame. + +## Constants + diff --git a/docs/api_reference_dynamic.html b/docs/api_reference_dynamic.html index 14e58f6..d41d591 100644 --- a/docs/api_reference_dynamic.html +++ b/docs/api_reference_dynamic.html @@ -108,7 +108,7 @@
Generated on 2025-11-29 10:12:05
+Generated on 2025-12-28 14:29:42
This documentation was dynamically generated from the compiled module.
Raises: RuntimeError: If a benchmark is already running Benchmark filename is auto-generated from PID and timestamp. Use end_benchmark() to stop and get filename.
step(dt: float = None) -> floatAdvance simulation time (headless mode only). + +Note:
+Returns: float: Actual time advanced in seconds. Returns 0.0 in windowed mode. In windowed mode, this is a no-op and returns 0.0. Use this for deterministic simulation control in headless/testing scenarios.
+start(target: UIDrawable) -> Nonestart(target: UIDrawable, conflict_mode: str = 'replace') -> NoneStart the animation on a target UI element. Note:
Returns: None The animation will automatically stop if the target is destroyed. Call AnimationManager.update(delta_time) each frame to progress animations.
+Returns: None
+Raises: RuntimeError: When conflict_mode='error' and property is already animating The animation will automatically stop if the target is destroyed.
apply_perspective(entity, visible=None, discovered=None, unknown=None)Bind this layer to an entity for automatic FOV updates.
+at(x, y) -> ColorGet the color at cell position (x, y).
clear_perspective()Remove the perspective binding from this layer.
+draw_fov(source, radius=None, fov=None, visible=None, discovered=None, unknown=None)Paint cells based on field-of-view visibility from source position. + +Note: Layer must be attached to a grid for FOV calculation.
+fill(color)Fill the entire layer with the specified color.
fill_rect(pos, size, color)Fill a rectangular region with a color.
+set(x, y, color)Set the color at cell position (x, y).
update_perspective()Redraw FOV based on the bound entity's current position. +Call this after the entity moves to update the visibility layer.
+visible_entities(fov=None, radius=None) -> list[Entity]Get list of other entities visible from this entity's position.
+Returns: List of Entity objects that are within field of view. Computes FOV from this entity's position and returns all other entities whose positions fall within the visible area.
+Inherits from: IntEnum
+as_integer_ratio(...)Return a pair of integers, whose ratio is equal to the original int. +The ratio is in lowest terms and has a positive denominator. +>>> (10).as_integer_ratio() +(10, 1) +>>> (-10).as_integer_ratio() +(-10, 1) +>>> (0).as_integer_ratio() +(0, 1)
+bit_count(...)Number of ones in the binary representation of the absolute value of self. +Also known as the population count. +>>> bin(13) +'0b1101' +>>> (13).bit_count() +3
+bit_length(...)Number of bits necessary to represent self in binary. +>>> bin(37) +'0b100101' +>>> (37).bit_length() +6
+conjugate(...)Returns self, the complex conjugate of any int.
+from_bytes(...)Return the integer represented by the given array of bytes. + bytes + Holds the array of bytes to convert. The argument must either + support the buffer protocol or be an iterable object producing bytes. + Bytes and bytearray are examples of built-in objects that support the + buffer protocol. + byteorder + The byte order used to represent the integer. If byteorder is 'big', + the most significant byte is at the beginning of the byte array. If + byteorder is 'little', the most significant byte is at the end of the + byte array. To request the native byte order of the host system, use + sys.byteorder as the byte order value. Default is to use 'big'. + signed + Indicates whether two's complement is used to represent the integer.
+is_integer(...)Returns True. Exists for duck type compatibility with float.is_integer.
+to_bytes(...)Return an array of bytes representing an integer. + length + Length of bytes object to use. An OverflowError is raised if the + integer is not representable with the given number of bytes. Default + is length 1. + byteorder + The byte order used to represent the integer. If byteorder is 'big', + the most significant byte is at the beginning of the byte array. If + byteorder is 'little', the most significant byte is at the end of the + byte array. To request the native byte order of the host system, use + sys.byteorder as the byte order value. Default is to use 'big'. + signed + Determines whether two's complement is used to represent the integer. + If signed is False and a negative integer is given, an OverflowError + is raised.
+SFML Font Object
@@ -1084,6 +1220,17 @@ Attributes:entities_in_radius(x: float, y: float, radius: float) -> list[Entity]Query entities within radius using spatial hash (O(k) where k = nearby entities).
+Returns: List of Entity objects within the radius.
+find_path(x1: int, y1: int, x2: int, y2: int, diagonal_cost: float = 1.41) -> List[Tuple[int, int]]Find A* path between two points.
@@ -1201,7 +1348,7 @@ Args: color (Color, optional): Line color. Default: White Keyword Args: - click (callable): Click handler. Default: None + on_click (callable): Click handler. Default: None visible (bool): Visibility state. Default: True opacity (float): Opacity (0.0-1.0). Default: 1.0 z_index (int): Rendering order. Default: 0 @@ -1263,14 +1410,6 @@ Note:Returns: None Deactivates the current scene and activates this one. Scene transitions and lifecycle callbacks are triggered.
get_ui() -> UICollectionGet the UI element collection for this scene. - -Note:
-Returns: UICollection: Collection of UI elements (Frames, Captions, Sprites, Grids) in this scene Use to add, remove, or iterate over UI elements. Changes are reflected immediately.
-register_keyboard(callback: callable) -> NoneRegister a keyboard event handler function. @@ -1279,7 +1418,7 @@ Note:
Returns: None Alternative to overriding on_keypress() method. Handler is called for both key press and release events.
+Returns: None Alternative to setting on_key property. Handler is called for both key press and release events.
Fill the entire layer with the specified tile index.
+fill_rect(pos, size, index)Fill a rectangular region with a tile index.
+set(x, y, index)Set the tile index at cell position (x, y). Use -1 for no tile.
@@ -1635,19 +1779,6 @@ Note:FOV_BASIC (int): 0FOV_DIAMOND (int): 1FOV_PERMISSIVE_0 (int): 3FOV_PERMISSIVE_1 (int): 4FOV_PERMISSIVE_2 (int): 5FOV_PERMISSIVE_3 (int): 6FOV_PERMISSIVE_4 (int): 7FOV_PERMISSIVE_5 (int): 8FOV_PERMISSIVE_6 (int): 9FOV_PERMISSIVE_7 (int): 10FOV_PERMISSIVE_8 (int): 11FOV_RESTRICTIVE (int): 12FOV_SHADOW (int): 2