McRogueFace/docs/API_REFERENCE_COMPLETE.md

1157 lines
23 KiB
Markdown

# McRogueFace API Reference
## Overview
McRogueFace Python API
Core game engine interface for creating roguelike games with Python.
This module provides:
- Scene management (createScene, setScene, currentScene)
- UI components (Frame, Caption, Sprite, Grid)
- Entity system for game objects
- Audio playback (sound effects and music)
- Timer system for scheduled events
- Input handling
- Performance metrics
Example:
import mcrfpy
# Create a new scene
mcrfpy.createScene('game')
mcrfpy.setScene('game')
# Add UI elements
frame = mcrfpy.Frame(10, 10, 200, 100)
caption = mcrfpy.Caption('Hello World', 50, 50)
mcrfpy.sceneUI().extend([frame, caption])
## Table of Contents
- [Functions](#functions)
- [Scene Management](#scene-management)
- [Audio](#audio)
- [UI Utilities](#ui-utilities)
- [System](#system)
- [Classes](#classes)
- [UI Components](#ui-components)
- [Collections](#collections)
- [System Types](#system-types)
- [Other Classes](#other-classes)
- [Automation Module](#automation-module)
## Functions
### Scene Management
### `createScene(name: str) -> None`
Create a new empty scene with the given name.
**Arguments:**
- `name` (*str*): Unique name for the new scene
**Raises:** ValueError: If a scene with this name already exists
**Note:** The scene is created but not made active. Use setScene() to switch to it.
**Example:**
```python
mcrfpy.createScene("game_over")
```
---
### `setScene(scene: str, transition: str = None, duration: float = 0.0) -> None`
Switch to a different scene with optional transition effect.
**Arguments:**
- `scene` (*str*): Name of the scene to switch to
- `transition` (*str*): Transition type: "fade", "slide_left", "slide_right", "slide_up", "slide_down"
- `duration` (*float*): Transition duration in seconds (default: 0.0 for instant)
**Raises:** KeyError: If the scene doesn't exist
**Example:**
```python
mcrfpy.setScene("game", "fade", 0.5)
```
---
### `currentScene() -> str`
Get the name of the currently active scene.
**Returns:** str: Name of the current scene
**Example:**
```python
scene_name = mcrfpy.currentScene()
```
---
### `sceneUI(scene: str = None) -> UICollection`
Get all UI elements for a scene.
**Arguments:**
- `scene` (*str*): Scene name. If None, uses current scene
**Returns:** UICollection: All UI elements in the scene
**Raises:** KeyError: If the specified scene doesn't exist
**Example:**
```python
ui_elements = mcrfpy.sceneUI("game")
```
---
### `keypressScene(handler: callable) -> None`
Set the keyboard event handler for the current scene.
**Arguments:**
- `handler` (*callable*): Function that receives (key_name: str, is_pressed: bool)
**Example:**
```python
def on_key(key, pressed):
if key == "SPACE" and pressed:
player.jump()
mcrfpy.keypressScene(on_key)
```
---
### Audio
### `createSoundBuffer(filename: str) -> int`
Load a sound effect from a file and return its buffer ID.
**Arguments:**
- `filename` (*str*): Path to the sound file (WAV, OGG, FLAC)
**Returns:** int: Buffer ID for use with playSound()
**Raises:** RuntimeError: If the file cannot be loaded
**Example:**
```python
jump_sound = mcrfpy.createSoundBuffer("assets/jump.wav")
```
---
### `loadMusic(filename: str, loop: bool = True) -> None`
Load and immediately play background music from a file.
**Arguments:**
- `filename` (*str*): Path to the music file (WAV, OGG, FLAC)
- `loop` (*bool*): Whether to loop the music (default: True)
**Note:** Only one music track can play at a time. Loading new music stops the current track.
**Example:**
```python
mcrfpy.loadMusic("assets/background.ogg", True)
```
---
### `playSound(buffer_id: int) -> None`
Play a sound effect using a previously loaded buffer.
**Arguments:**
- `buffer_id` (*int*): Sound buffer ID returned by createSoundBuffer()
**Raises:** RuntimeError: If the buffer ID is invalid
**Example:**
```python
mcrfpy.playSound(jump_sound)
```
---
### `getMusicVolume() -> int`
Get the current music volume level.
**Returns:** int: Current volume (0-100)
**Example:**
```python
current_volume = mcrfpy.getMusicVolume()
```
---
### `getSoundVolume() -> int`
Get the current sound effects volume level.
**Returns:** int: Current volume (0-100)
**Example:**
```python
current_volume = mcrfpy.getSoundVolume()
```
---
### `setMusicVolume(volume: int) -> None`
Set the global music volume.
**Arguments:**
- `volume` (*int*): Volume level from 0 (silent) to 100 (full volume)
**Example:**
```python
mcrfpy.setMusicVolume(50) # Set to 50% volume
```
---
### `setSoundVolume(volume: int) -> None`
Set the global sound effects volume.
**Arguments:**
- `volume` (*int*): Volume level from 0 (silent) to 100 (full volume)
**Example:**
```python
mcrfpy.setSoundVolume(75) # Set to 75% volume
```
---
### UI Utilities
### `find(name: str, scene: str = None) -> UIDrawable | None`
Find the first UI element with the specified name.
**Arguments:**
- `name` (*str*): Exact name to search for
- `scene` (*str*): Scene to search in (default: current scene)
**Returns:** UIDrawable or None: The found element, or None if not found
**Note:** Searches scene UI elements and entities within grids.
**Example:**
```python
button = mcrfpy.find("start_button")
```
---
### `findAll(pattern: str, scene: str = None) -> list`
Find all UI elements matching a name pattern.
**Arguments:**
- `pattern` (*str*): Name pattern with optional wildcards (* matches any characters)
- `scene` (*str*): Scene to search in (default: current scene)
**Returns:** list: All matching UI elements and entities
**Example:**
```python
enemies = mcrfpy.findAll("enemy_*")
```
---
### System
### `exit() -> None`
Cleanly shut down the game engine and exit the application.
**Note:** This immediately closes the window and terminates the program.
**Example:**
```python
mcrfpy.exit()
```
---
### `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
**Example:**
```python
metrics = mcrfpy.getMetrics()
```
---
### `setTimer(name: str, handler: callable, interval: int) -> None`
Create or update a recurring timer.
**Arguments:**
- `name` (*str*): Unique identifier for the timer
- `handler` (*callable*): Function called with (runtime: float) parameter
- `interval` (*int*): Time between calls in milliseconds
**Note:** If a timer with this name exists, it will be replaced.
**Example:**
```python
def update_score(runtime):
score += 1
mcrfpy.setTimer("score_update", update_score, 1000)
```
---
### `delTimer(name: str) -> None`
Stop and remove a timer.
**Arguments:**
- `name` (*str*): Timer identifier to remove
**Note:** No error is raised if the timer doesn't exist.
**Example:**
```python
mcrfpy.delTimer("score_update")
```
---
### `setScale(multiplier: float) -> None`
Scale the game window size.
**Arguments:**
- `multiplier` (*float*): Scale factor (e.g., 2.0 for double size)
**Note:** The internal resolution remains 1024x768, but the window is scaled.
**Example:**
```python
mcrfpy.setScale(2.0) # Double the window size
```
---
## Classes
### UI Components
### class `Frame`
A rectangular frame UI element that can contain other drawable elements.
#### Methods
#### `get_bounds()`
Get the bounding rectangle of this drawable element.
**Returns:** tuple: (x, y, width, height) representing the element's bounds
**Note:** The bounds are in screen coordinates and account for current position and size.
#### `resize(width, height)`
Resize the element to new dimensions.
**Arguments:**
- `width` (*float*): New width in pixels
- `height` (*float*): New height in pixels
**Note:** For Caption and Sprite, this may not change actual size if determined by content.
#### `move(dx, dy)`
Move the element by a relative offset.
**Arguments:**
- `dx` (*float*): Horizontal offset in pixels
- `dy` (*float*): Vertical offset in pixels
**Note:** This modifies the x and y position properties by the given amounts.
---
### class `Caption`
A text display UI element with customizable font and styling.
#### Methods
#### `get_bounds()`
Get the bounding rectangle of this drawable element.
**Returns:** tuple: (x, y, width, height) representing the element's bounds
**Note:** The bounds are in screen coordinates and account for current position and size.
#### `resize(width, height)`
Resize the element to new dimensions.
**Arguments:**
- `width` (*float*): New width in pixels
- `height` (*float*): New height in pixels
**Note:** For Caption and Sprite, this may not change actual size if determined by content.
#### `move(dx, dy)`
Move the element by a relative offset.
**Arguments:**
- `dx` (*float*): Horizontal offset in pixels
- `dy` (*float*): Vertical offset in pixels
**Note:** This modifies the x and y position properties by the given amounts.
---
### class `Sprite`
A sprite UI element that displays a texture or portion of a texture atlas.
#### Methods
#### `get_bounds()`
Get the bounding rectangle of this drawable element.
**Returns:** tuple: (x, y, width, height) representing the element's bounds
**Note:** The bounds are in screen coordinates and account for current position and size.
#### `resize(width, height)`
Resize the element to new dimensions.
**Arguments:**
- `width` (*float*): New width in pixels
- `height` (*float*): New height in pixels
**Note:** For Caption and Sprite, this may not change actual size if determined by content.
#### `move(dx, dy)`
Move the element by a relative offset.
**Arguments:**
- `dx` (*float*): Horizontal offset in pixels
- `dy` (*float*): Vertical offset in pixels
**Note:** This modifies the x and y position properties by the given amounts.
---
### class `Grid`
A grid-based tilemap UI element for rendering tile-based levels and game worlds.
#### Methods
#### `at(x, y)`
Get the GridPoint at the specified grid coordinates.
**Arguments:**
- `x` (*int*): Grid x coordinate
- `y` (*int*): Grid y coordinate
**Returns:** GridPoint or None: The grid point at (x, y), or None if out of bounds
#### `get_bounds()`
Get the bounding rectangle of this drawable element.
**Returns:** tuple: (x, y, width, height) representing the element's bounds
**Note:** The bounds are in screen coordinates and account for current position and size.
#### `resize(width, height)`
Resize the element to new dimensions.
**Arguments:**
- `width` (*float*): New width in pixels
- `height` (*float*): New height in pixels
**Note:** For Caption and Sprite, this may not change actual size if determined by content.
#### `move(dx, dy)`
Move the element by a relative offset.
**Arguments:**
- `dx` (*float*): Horizontal offset in pixels
- `dy` (*float*): Vertical offset in pixels
**Note:** This modifies the x and y position properties by the given amounts.
---
### class `Entity`
Game entity that can be placed in a Grid.
#### Methods
#### `die()`
Remove this entity from its parent grid.
**Note:** The entity object remains valid but is no longer rendered or updated.
#### `move(dx, dy)`
Move the element by a relative offset.
**Arguments:**
- `dx` (*float*): Horizontal offset in pixels
- `dy` (*float*): Vertical offset in pixels
**Note:** This modifies the x and y position properties by the given amounts.
#### `at(x, y)`
Check if this entity is at the specified grid coordinates.
**Arguments:**
- `x` (*int*): Grid x coordinate to check
- `y` (*int*): Grid y coordinate to check
**Returns:** bool: True if entity is at position (x, y), False otherwise
#### `get_bounds()`
Get the bounding rectangle of this drawable element.
**Returns:** tuple: (x, y, width, height) representing the element's bounds
**Note:** The bounds are in screen coordinates and account for current position and size.
#### `index()`
Get the index of this entity in its parent grid's entity list.
**Returns:** int: Index position, or -1 if not in a grid
#### `resize(width, height)`
Resize the element to new dimensions.
**Arguments:**
- `width` (*float*): New width in pixels
- `height` (*float*): New height in pixels
**Note:** For Caption and Sprite, this may not change actual size if determined by content.
---
### Collections
### class `EntityCollection`
Container for Entity objects in a Grid. Supports iteration and indexing.
#### Methods
#### `append(entity)`
Add an entity to the end of the collection.
**Arguments:**
- `entity` (*Entity*): The entity to add
#### `remove(entity)`
Remove the first occurrence of an entity from the collection.
**Arguments:**
- `entity` (*Entity*): The entity to remove
**Raises:** ValueError: If entity is not in collection
#### `count(entity)`
Count the number of occurrences of an entity in the collection.
**Arguments:**
- `entity` (*Entity*): The entity to count
**Returns:** int: Number of times entity appears in collection
#### `index(entity)`
Find the index of the first occurrence of an entity.
**Arguments:**
- `entity` (*Entity*): The entity to find
**Returns:** int: Index of entity in collection
**Raises:** ValueError: If entity is not in collection
#### `extend(iterable)`
Add all entities from an iterable to the collection.
**Arguments:**
- `iterable` (*Iterable[Entity]*): Entities to add
---
### class `UICollection`
Container for UI drawable elements. Supports iteration and indexing.
#### Methods
#### `append(drawable)`
Add a drawable element to the end of the collection.
**Arguments:**
- `drawable` (*UIDrawable*): The drawable element to add
#### `remove(drawable)`
Remove the first occurrence of a drawable from the collection.
**Arguments:**
- `drawable` (*UIDrawable*): The drawable to remove
**Raises:** ValueError: If drawable is not in collection
#### `count(drawable)`
Count the number of occurrences of a drawable in the collection.
**Arguments:**
- `drawable` (*UIDrawable*): The drawable to count
**Returns:** int: Number of times drawable appears in collection
#### `index(drawable)`
Find the index of the first occurrence of a drawable.
**Arguments:**
- `drawable` (*UIDrawable*): The drawable to find
**Returns:** int: Index of drawable in collection
**Raises:** ValueError: If drawable is not in collection
#### `extend(iterable)`
Add all drawables from an iterable to the collection.
**Arguments:**
- `iterable` (*Iterable[UIDrawable]*): Drawables to add
---
### class `UICollectionIter`
Iterator for UICollection. Automatically created when iterating over a UICollection.
---
### class `UIEntityCollectionIter`
Iterator for EntityCollection. Automatically created when iterating over an EntityCollection.
---
### System Types
### class `Color`
RGBA color representation.
#### Methods
#### `from_hex(hex_string)`
Create a Color from a hexadecimal color string.
**Arguments:**
- `hex_string` (*str*): Hex color string (e.g., "#FF0000" or "FF0000")
**Returns:** Color: New Color object from hex string
**Example:**
```python
red = Color.from_hex("#FF0000")
```
#### `to_hex()`
Convert this Color to a hexadecimal string.
**Returns:** str: Hex color string in format "#RRGGBB"
**Example:**
```python
hex_str = color.to_hex() # Returns "#FF0000"
```
#### `lerp(other, t)`
Linearly interpolate between this color and another.
**Arguments:**
- `other` (*Color*): The color to interpolate towards
- `t` (*float*): Interpolation factor from 0.0 to 1.0
**Returns:** Color: New interpolated Color object
**Example:**
```python
mixed = red.lerp(blue, 0.5) # 50% between red and blue
```
---
### class `Vector`
2D vector for positions and directions.
#### Methods
#### `magnitude()`
Calculate the length/magnitude of this vector.
**Returns:** float: The magnitude of the vector
#### `distance_to(other)`
Calculate the distance to another vector.
**Arguments:**
- `other` (*Vector*): The other vector
**Returns:** float: Distance between the two vectors
#### `dot(other)`
Calculate the dot product with another vector.
**Arguments:**
- `other` (*Vector*): The other vector
**Returns:** float: Dot product of the two vectors
#### `angle()`
Get the angle of this vector in radians.
**Returns:** float: Angle in radians from positive x-axis
#### `magnitude_squared()`
Calculate the squared magnitude of this vector.
**Returns:** float: The squared magnitude (faster than magnitude())
**Note:** Use this for comparisons to avoid expensive square root calculation.
#### `copy()`
Create a copy of this vector.
**Returns:** Vector: New Vector object with same x and y values
#### `normalize()`
Return a unit vector in the same direction.
**Returns:** Vector: New normalized vector with magnitude 1.0
**Raises:** ValueError: If vector has zero magnitude
---
### class `Texture`
Texture object for image data.
---
### class `Font`
Font object for text rendering.
---
### Other Classes
### class `Animation`
Animate UI element properties over time.
#### Properties
- **`property`**: str: Name of the property being animated (e.g., "x", "y", "scale")
- **`duration`**: float: Total duration of the animation in seconds
- **`elapsed_time`**: float: Time elapsed since animation started (read-only)
- **`current_value`**: float: Current interpolated value of the animation (read-only)
- **`is_running`**: bool: True if animation is currently running (read-only)
- **`is_finished`**: bool: True if animation has completed (read-only)
#### Methods
#### `update(delta_time)`
Update the animation by the given time delta.
**Arguments:**
- `delta_time` (*float*): Time elapsed since last update in seconds
**Returns:** bool: True if animation is still running, False if finished
#### `start(target)`
Start the animation on a target UI element.
**Arguments:**
- `target` (*UIDrawable*): The UI element to animate
**Note:** The target must have the property specified in the animation constructor.
#### `get_current_value()`
Get the current interpolated value of the animation.
**Returns:** float: Current animation value between start and end
---
### class `Drawable`
Base class for all drawable UI elements.
#### Methods
#### `get_bounds()`
Get the bounding rectangle of this drawable element.
**Returns:** tuple: (x, y, width, height) representing the element's bounds
**Note:** The bounds are in screen coordinates and account for current position and size.
#### `resize(width, height)`
Resize the element to new dimensions.
**Arguments:**
- `width` (*float*): New width in pixels
- `height` (*float*): New height in pixels
**Note:** For Caption and Sprite, this may not change actual size if determined by content.
#### `move(dx, dy)`
Move the element by a relative offset.
**Arguments:**
- `dx` (*float*): Horizontal offset in pixels
- `dy` (*float*): Vertical offset in pixels
**Note:** This modifies the x and y position properties by the given amounts.
---
### class `GridPoint`
Represents a single tile in a Grid.
#### Properties
- **`x`**: int: Grid x coordinate of this point
- **`y`**: int: Grid y coordinate of this point
- **`texture_index`**: int: Index of the texture/sprite to display at this point
- **`solid`**: bool: Whether this point blocks movement
- **`transparent`**: bool: Whether this point allows light/vision through
- **`color`**: Color: Color tint applied to the texture at this point
---
### class `GridPointState`
State information for a GridPoint.
#### Properties
- **`visible`**: bool: Whether this point is currently visible to the player
- **`discovered`**: bool: Whether this point has been discovered/explored
- **`custom_flags`**: int: Bitfield for custom game-specific flags
---
### class `Scene`
Base class for object-oriented scenes.
#### Methods
#### `register_keyboard(callable)`
Register a keyboard event handler function for the scene.
**Arguments:**
- `callable` (*callable*): Function that takes (key: str, action: str) parameters
**Note:** Alternative to overriding the on_keypress method when subclassing Scene objects.
**Example:**
```python
def handle_keyboard(key, action):
print(f"Key '{key}' was {action}")
scene.register_keyboard(handle_keyboard)
```
#### `activate()`
Make this scene the active scene.
**Note:** Equivalent to calling setScene() with this scene's name.
#### `get_ui()`
Get the UI element collection for this scene.
**Returns:** UICollection: Collection of all UI elements in this scene
#### `keypress(handler)`
Register a keyboard handler function for this scene.
**Arguments:**
- `handler` (*callable*): Function that takes (key_name: str, is_pressed: bool)
**Note:** Alternative to overriding the on_keypress method.
---
### class `Timer`
Timer object for scheduled callbacks.
#### Methods
#### `restart()`
Restart the timer from the beginning.
**Note:** Resets the timer's internal clock to zero.
#### `cancel()`
Cancel the timer and remove it from the system.
**Note:** After cancelling, the timer object cannot be reused.
#### `pause()`
Pause the timer, stopping its callback execution.
**Note:** Use resume() to continue the timer from where it was paused.
#### `resume()`
Resume a paused timer.
**Note:** Has no effect if timer is not paused.
---
### class `Window`
Window singleton for accessing and modifying the game window properties.
#### Methods
#### `get()`
Get the Window singleton instance.
**Returns:** Window: The singleton window object
**Note:** This is a static method that returns the same instance every time.
#### `screenshot(filename)`
Take a screenshot and save it to a file.
**Arguments:**
- `filename` (*str*): Path where to save the screenshot
**Note:** Supports PNG, JPG, and BMP formats based on file extension.
#### `center()`
Center the window on the screen.
**Note:** Only works if the window is not fullscreen.
---
## Automation Module
The `mcrfpy.automation` module provides testing and automation capabilities.
### `automation.click`
Click at position
---
### `automation.doubleClick`
Double click at position
---
### `automation.dragRel`
Drag mouse relative to current position
---
### `automation.dragTo`
Drag mouse to position
---
### `automation.hotkey`
Press a hotkey combination (e.g., hotkey('ctrl', 'c'))
---
### `automation.keyDown`
Press and hold a key
---
### `automation.keyUp`
Release a key
---
### `automation.middleClick`
Middle click at position
---
### `automation.mouseDown`
Press mouse button
---
### `automation.mouseUp`
Release mouse button
---
### `automation.moveRel`
Move mouse relative to current position
---
### `automation.moveTo`
Move mouse to absolute position
---
### `automation.onScreen`
Check if coordinates are within screen bounds
---
### `automation.position`
Get current mouse position as (x, y) tuple
---
### `automation.rightClick`
Right click at position
---
### `automation.screenshot`
Save a screenshot to the specified file
---
### `automation.scroll`
Scroll wheel at position
---
### `automation.size`
Get screen size as (width, height) tuple
---
### `automation.tripleClick`
Triple click at position
---
### `automation.typewrite`
Type text with optional interval between keystrokes
---