451 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			451 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
#!/usr/bin/env python3
 | 
						|
"""Generate documentation screenshots for McRogueFace UI elements"""
 | 
						|
import mcrfpy
 | 
						|
from mcrfpy import automation
 | 
						|
import sys
 | 
						|
import os
 | 
						|
 | 
						|
# Crypt of Sokoban color scheme
 | 
						|
FRAME_COLOR = mcrfpy.Color(64, 64, 128)
 | 
						|
SHADOW_COLOR = mcrfpy.Color(64, 64, 86)
 | 
						|
BOX_COLOR = mcrfpy.Color(96, 96, 160)
 | 
						|
WHITE = mcrfpy.Color(255, 255, 255)
 | 
						|
BLACK = mcrfpy.Color(0, 0, 0)
 | 
						|
GREEN = mcrfpy.Color(0, 255, 0)
 | 
						|
RED = mcrfpy.Color(255, 0, 0)
 | 
						|
 | 
						|
# Create texture for sprites
 | 
						|
sprite_texture = mcrfpy.Texture("assets/kenney_TD_MR_IP.png", 16, 16)
 | 
						|
 | 
						|
# Output directory - create it during setup
 | 
						|
output_dir = "mcrogueface.github.io/images"
 | 
						|
if not os.path.exists(output_dir):
 | 
						|
    os.makedirs(output_dir)
 | 
						|
 | 
						|
def create_caption(x, y, text, font_size=16, text_color=WHITE, outline_color=BLACK):
 | 
						|
    """Helper function to create captions with common settings"""
 | 
						|
    caption = mcrfpy.Caption(mcrfpy.Vector(x, y), text=text)
 | 
						|
    caption.size = font_size
 | 
						|
    caption.fill_color = text_color
 | 
						|
    caption.outline_color = outline_color
 | 
						|
    return caption
 | 
						|
 | 
						|
def create_caption_example():
 | 
						|
    """Create a scene showing Caption UI element examples"""
 | 
						|
    mcrfpy.createScene("caption_example")
 | 
						|
    ui = mcrfpy.sceneUI("caption_example")
 | 
						|
    
 | 
						|
    # Background frame
 | 
						|
    bg = mcrfpy.Frame(0, 0, 800, 600, fill_color=FRAME_COLOR)
 | 
						|
    ui.append(bg)
 | 
						|
    
 | 
						|
    # Title caption
 | 
						|
    title = create_caption(200, 50, "Caption Examples", 32)
 | 
						|
    ui.append(title)
 | 
						|
    
 | 
						|
    # Different sized captions
 | 
						|
    caption1 = create_caption(100, 150, "Large Caption (24pt)", 24)
 | 
						|
    ui.append(caption1)
 | 
						|
    
 | 
						|
    caption2 = create_caption(100, 200, "Medium Caption (18pt)", 18, GREEN)
 | 
						|
    ui.append(caption2)
 | 
						|
    
 | 
						|
    caption3 = create_caption(100, 240, "Small Caption (14pt)", 14, RED)
 | 
						|
    ui.append(caption3)
 | 
						|
    
 | 
						|
    # Caption with background
 | 
						|
    caption_bg = mcrfpy.Frame(100, 300, 300, 50, fill_color=BOX_COLOR)
 | 
						|
    ui.append(caption_bg)
 | 
						|
    caption4 = create_caption(110, 315, "Caption with Background", 16)
 | 
						|
    ui.append(caption4)
 | 
						|
 | 
						|
def create_sprite_example():
 | 
						|
    """Create a scene showing Sprite UI element examples"""
 | 
						|
    mcrfpy.createScene("sprite_example")
 | 
						|
    ui = mcrfpy.sceneUI("sprite_example")
 | 
						|
    
 | 
						|
    # Background frame
 | 
						|
    bg = mcrfpy.Frame(0, 0, 800, 600, fill_color=FRAME_COLOR)
 | 
						|
    ui.append(bg)
 | 
						|
    
 | 
						|
    # Title
 | 
						|
    title = create_caption(250, 50, "Sprite Examples", 32)
 | 
						|
    ui.append(title)
 | 
						|
    
 | 
						|
    # Create a grid background for sprites
 | 
						|
    sprite_bg = mcrfpy.Frame(100, 150, 600, 300, fill_color=BOX_COLOR)
 | 
						|
    ui.append(sprite_bg)
 | 
						|
    
 | 
						|
    # Player sprite (84)
 | 
						|
    player_label = create_caption(150, 180, "Player", 14)
 | 
						|
    ui.append(player_label)
 | 
						|
    player_sprite = mcrfpy.Sprite(150, 200, sprite_texture, 84, 3.0)
 | 
						|
    ui.append(player_sprite)
 | 
						|
    
 | 
						|
    # Enemy sprites
 | 
						|
    enemy_label = create_caption(250, 180, "Enemies", 14)
 | 
						|
    ui.append(enemy_label)
 | 
						|
    enemy1 = mcrfpy.Sprite(250, 200, sprite_texture, 123, 3.0)  # Basic enemy
 | 
						|
    ui.append(enemy1)
 | 
						|
    enemy2 = mcrfpy.Sprite(300, 200, sprite_texture, 107, 3.0)  # Different enemy
 | 
						|
    ui.append(enemy2)
 | 
						|
    
 | 
						|
    # Boulder sprite (66)
 | 
						|
    boulder_label = create_caption(400, 180, "Boulder", 14)
 | 
						|
    ui.append(boulder_label)
 | 
						|
    boulder_sprite = mcrfpy.Sprite(400, 200, sprite_texture, 66, 3.0)
 | 
						|
    ui.append(boulder_sprite)
 | 
						|
    
 | 
						|
    # Exit sprites
 | 
						|
    exit_label = create_caption(500, 180, "Exit States", 14)
 | 
						|
    ui.append(exit_label)
 | 
						|
    exit_locked = mcrfpy.Sprite(500, 200, sprite_texture, 45, 3.0)  # Locked
 | 
						|
    ui.append(exit_locked)
 | 
						|
    exit_open = mcrfpy.Sprite(550, 200, sprite_texture, 21, 3.0)  # Open
 | 
						|
    ui.append(exit_open)
 | 
						|
    
 | 
						|
    # Item sprites
 | 
						|
    item_label = create_caption(150, 300, "Items", 14)
 | 
						|
    ui.append(item_label)
 | 
						|
    treasure = mcrfpy.Sprite(150, 320, sprite_texture, 89, 3.0)  # Treasure
 | 
						|
    ui.append(treasure)
 | 
						|
    sword = mcrfpy.Sprite(200, 320, sprite_texture, 222, 3.0)  # Sword
 | 
						|
    ui.append(sword)
 | 
						|
    potion = mcrfpy.Sprite(250, 320, sprite_texture, 175, 3.0)  # Potion
 | 
						|
    ui.append(potion)
 | 
						|
    
 | 
						|
    # Button sprite
 | 
						|
    button_label = create_caption(350, 300, "Button", 14)
 | 
						|
    ui.append(button_label)
 | 
						|
    button = mcrfpy.Sprite(350, 320, sprite_texture, 250, 3.0)
 | 
						|
    ui.append(button)
 | 
						|
 | 
						|
def create_frame_example():
 | 
						|
    """Create a scene showing Frame UI element examples"""
 | 
						|
    mcrfpy.createScene("frame_example")
 | 
						|
    ui = mcrfpy.sceneUI("frame_example")
 | 
						|
    
 | 
						|
    # Background
 | 
						|
    bg = mcrfpy.Frame(0, 0, 800, 600, fill_color=SHADOW_COLOR)
 | 
						|
    ui.append(bg)
 | 
						|
    
 | 
						|
    # Title
 | 
						|
    title = create_caption(250, 30, "Frame Examples", 32)
 | 
						|
    ui.append(title)
 | 
						|
    
 | 
						|
    # Basic frame
 | 
						|
    frame1 = mcrfpy.Frame(50, 100, 200, 150, fill_color=FRAME_COLOR)
 | 
						|
    ui.append(frame1)
 | 
						|
    label1 = create_caption(60, 110, "Basic Frame", 16)
 | 
						|
    ui.append(label1)
 | 
						|
    
 | 
						|
    # Frame with outline
 | 
						|
    frame2 = mcrfpy.Frame(300, 100, 200, 150, fill_color=BOX_COLOR, 
 | 
						|
                         outline_color=WHITE, outline=2.0)
 | 
						|
    ui.append(frame2)
 | 
						|
    label2 = create_caption(310, 110, "Frame with Outline", 16)
 | 
						|
    ui.append(label2)
 | 
						|
    
 | 
						|
    # Nested frames
 | 
						|
    frame3 = mcrfpy.Frame(550, 100, 200, 150, fill_color=FRAME_COLOR,
 | 
						|
                         outline_color=WHITE, outline=1)
 | 
						|
    ui.append(frame3)
 | 
						|
    inner_frame = mcrfpy.Frame(570, 130, 160, 90, fill_color=BOX_COLOR)
 | 
						|
    ui.append(inner_frame)
 | 
						|
    label3 = create_caption(560, 110, "Nested Frames", 16)
 | 
						|
    ui.append(label3)
 | 
						|
    
 | 
						|
    # Complex layout with frames
 | 
						|
    main_frame = mcrfpy.Frame(50, 300, 700, 250, fill_color=FRAME_COLOR,
 | 
						|
                             outline_color=WHITE, outline=2)
 | 
						|
    ui.append(main_frame)
 | 
						|
    
 | 
						|
    # Add some UI elements inside
 | 
						|
    ui_label = create_caption(60, 310, "Complex UI Layout", 18)
 | 
						|
    ui.append(ui_label)
 | 
						|
    
 | 
						|
    # Status panel
 | 
						|
    status_frame = mcrfpy.Frame(70, 350, 150, 180, fill_color=BOX_COLOR)
 | 
						|
    ui.append(status_frame)
 | 
						|
    status_label = create_caption(80, 360, "Status", 14)
 | 
						|
    ui.append(status_label)
 | 
						|
    
 | 
						|
    # Inventory panel
 | 
						|
    inv_frame = mcrfpy.Frame(240, 350, 300, 180, fill_color=BOX_COLOR)
 | 
						|
    ui.append(inv_frame)
 | 
						|
    inv_label = create_caption(250, 360, "Inventory", 14)
 | 
						|
    ui.append(inv_label)
 | 
						|
    
 | 
						|
    # Actions panel
 | 
						|
    action_frame = mcrfpy.Frame(560, 350, 170, 180, fill_color=BOX_COLOR)
 | 
						|
    ui.append(action_frame)
 | 
						|
    action_label = create_caption(570, 360, "Actions", 14)
 | 
						|
    ui.append(action_label)
 | 
						|
 | 
						|
def create_grid_example():
 | 
						|
    """Create a scene showing Grid UI element examples"""
 | 
						|
    mcrfpy.createScene("grid_example")
 | 
						|
    ui = mcrfpy.sceneUI("grid_example")
 | 
						|
    
 | 
						|
    # Background
 | 
						|
    bg = mcrfpy.Frame(0, 0, 800, 600, fill_color=FRAME_COLOR)
 | 
						|
    ui.append(bg)
 | 
						|
    
 | 
						|
    # Title
 | 
						|
    title = create_caption(250, 30, "Grid Example", 32)
 | 
						|
    ui.append(title)
 | 
						|
    
 | 
						|
    # Create a grid showing a small dungeon
 | 
						|
    grid = mcrfpy.Grid(20, 15, sprite_texture, 
 | 
						|
                      mcrfpy.Vector(100, 100), mcrfpy.Vector(320, 240))
 | 
						|
    
 | 
						|
    # Set up dungeon tiles
 | 
						|
    # Floor tiles (index 48)
 | 
						|
    # Wall tiles (index 3)
 | 
						|
    for x in range(20):
 | 
						|
        for y in range(15):
 | 
						|
            if x == 0 or x == 19 or y == 0 or y == 14:
 | 
						|
                # Walls around edge
 | 
						|
                grid.at((x, y)).tilesprite = 3
 | 
						|
                grid.at((x, y)).walkable = False
 | 
						|
            else:
 | 
						|
                # Floor
 | 
						|
                grid.at((x, y)).tilesprite = 48
 | 
						|
                grid.at((x, y)).walkable = True
 | 
						|
    
 | 
						|
    # Add some internal walls
 | 
						|
    for x in range(5, 15):
 | 
						|
        grid.at((x, 7)).tilesprite = 3
 | 
						|
        grid.at((x, 7)).walkable = False
 | 
						|
    for y in range(3, 8):
 | 
						|
        grid.at((10, y)).tilesprite = 3
 | 
						|
        grid.at((10, y)).walkable = False
 | 
						|
    
 | 
						|
    # Add a door
 | 
						|
    grid.at((10, 7)).tilesprite = 131  # Door tile
 | 
						|
    grid.at((10, 7)).walkable = True
 | 
						|
    
 | 
						|
    # Add to UI
 | 
						|
    ui.append(grid)
 | 
						|
    
 | 
						|
    # Label
 | 
						|
    grid_label = create_caption(100, 480, "20x15 Grid with 2x scale - Simple Dungeon Layout", 16)
 | 
						|
    ui.append(grid_label)
 | 
						|
 | 
						|
def create_entity_example():
 | 
						|
    """Create a scene showing Entity examples in a Grid"""
 | 
						|
    mcrfpy.createScene("entity_example")
 | 
						|
    ui = mcrfpy.sceneUI("entity_example")
 | 
						|
    
 | 
						|
    # Background
 | 
						|
    bg = mcrfpy.Frame(0, 0, 800, 600, fill_color=FRAME_COLOR)
 | 
						|
    ui.append(bg)
 | 
						|
    
 | 
						|
    # Title
 | 
						|
    title = create_caption(200, 30, "Entity Collection Example", 32)
 | 
						|
    ui.append(title)
 | 
						|
    
 | 
						|
    # Create a grid for the entities
 | 
						|
    grid = mcrfpy.Grid(15, 10, sprite_texture,
 | 
						|
                      mcrfpy.Vector(150, 100), mcrfpy.Vector(360, 240))
 | 
						|
    
 | 
						|
    # Set all tiles to floor
 | 
						|
    for x in range(15):
 | 
						|
        for y in range(10):
 | 
						|
            grid.at((x, y)).tilesprite = 48
 | 
						|
            grid.at((x, y)).walkable = True
 | 
						|
    
 | 
						|
    # Add walls
 | 
						|
    for x in range(15):
 | 
						|
        grid.at((x, 0)).tilesprite = 3
 | 
						|
        grid.at((x, 0)).walkable = False
 | 
						|
        grid.at((x, 9)).tilesprite = 3
 | 
						|
        grid.at((x, 9)).walkable = False
 | 
						|
    for y in range(10):
 | 
						|
        grid.at((0, y)).tilesprite = 3
 | 
						|
        grid.at((0, y)).walkable = False
 | 
						|
        grid.at((14, y)).tilesprite = 3
 | 
						|
        grid.at((14, y)).walkable = False
 | 
						|
    
 | 
						|
    ui.append(grid)
 | 
						|
    
 | 
						|
    # Add entities to the grid
 | 
						|
    # Player entity
 | 
						|
    player = mcrfpy.Entity(mcrfpy.Vector(3, 3), sprite_texture, 84, grid)
 | 
						|
    grid.entities.append(player)
 | 
						|
    
 | 
						|
    # Enemy entities
 | 
						|
    enemy1 = mcrfpy.Entity(mcrfpy.Vector(7, 4), sprite_texture, 123, grid)
 | 
						|
    grid.entities.append(enemy1)
 | 
						|
    
 | 
						|
    enemy2 = mcrfpy.Entity(mcrfpy.Vector(10, 6), sprite_texture, 107, grid)
 | 
						|
    grid.entities.append(enemy2)
 | 
						|
    
 | 
						|
    # Boulder
 | 
						|
    boulder = mcrfpy.Entity(mcrfpy.Vector(5, 5), sprite_texture, 66, grid)
 | 
						|
    grid.entities.append(boulder)
 | 
						|
    
 | 
						|
    # Treasure
 | 
						|
    treasure = mcrfpy.Entity(mcrfpy.Vector(12, 2), sprite_texture, 89, grid)
 | 
						|
    grid.entities.append(treasure)
 | 
						|
    
 | 
						|
    # Exit (locked)
 | 
						|
    exit_door = mcrfpy.Entity(mcrfpy.Vector(12, 8), sprite_texture, 45, grid)
 | 
						|
    grid.entities.append(exit_door)
 | 
						|
    
 | 
						|
    # Button
 | 
						|
    button = mcrfpy.Entity(mcrfpy.Vector(3, 7), sprite_texture, 250, grid)
 | 
						|
    grid.entities.append(button)
 | 
						|
    
 | 
						|
    # Items
 | 
						|
    sword = mcrfpy.Entity(mcrfpy.Vector(8, 2), sprite_texture, 222, grid)
 | 
						|
    grid.entities.append(sword)
 | 
						|
    
 | 
						|
    potion = mcrfpy.Entity(mcrfpy.Vector(6, 8), sprite_texture, 175, grid)
 | 
						|
    grid.entities.append(potion)
 | 
						|
    
 | 
						|
    # Label
 | 
						|
    entity_label = create_caption(150, 500, "Grid with Entity Collection - Game Objects", 16)
 | 
						|
    ui.append(entity_label)
 | 
						|
 | 
						|
def create_combined_example():
 | 
						|
    """Create a scene showing all UI elements combined"""
 | 
						|
    mcrfpy.createScene("combined_example")
 | 
						|
    ui = mcrfpy.sceneUI("combined_example")
 | 
						|
    
 | 
						|
    # Background
 | 
						|
    bg = mcrfpy.Frame(0, 0, 800, 600, fill_color=SHADOW_COLOR)
 | 
						|
    ui.append(bg)
 | 
						|
    
 | 
						|
    # Title
 | 
						|
    title = create_caption(200, 20, "McRogueFace UI Elements", 28)
 | 
						|
    ui.append(title)
 | 
						|
    
 | 
						|
    # Main game area frame
 | 
						|
    game_frame = mcrfpy.Frame(20, 70, 500, 400, fill_color=FRAME_COLOR,
 | 
						|
                             outline_color=WHITE, outline=2)
 | 
						|
    ui.append(game_frame)
 | 
						|
    
 | 
						|
    # Grid inside game frame
 | 
						|
    grid = mcrfpy.Grid(12, 10, sprite_texture,
 | 
						|
                      mcrfpy.Vector(30, 80), mcrfpy.Vector(480, 400))
 | 
						|
    for x in range(12):
 | 
						|
        for y in range(10):
 | 
						|
            if x == 0 or x == 11 or y == 0 or y == 9:
 | 
						|
                grid.at((x, y)).tilesprite = 3
 | 
						|
                grid.at((x, y)).walkable = False
 | 
						|
            else:
 | 
						|
                grid.at((x, y)).tilesprite = 48
 | 
						|
                grid.at((x, y)).walkable = True
 | 
						|
    
 | 
						|
    # Add some entities
 | 
						|
    player = mcrfpy.Entity(mcrfpy.Vector(2, 2), sprite_texture, 84, grid)
 | 
						|
    grid.entities.append(player)
 | 
						|
    enemy = mcrfpy.Entity(mcrfpy.Vector(8, 6), sprite_texture, 123, grid)
 | 
						|
    grid.entities.append(enemy)
 | 
						|
    boulder = mcrfpy.Entity(mcrfpy.Vector(5, 4), sprite_texture, 66, grid)
 | 
						|
    grid.entities.append(boulder)
 | 
						|
    
 | 
						|
    ui.append(grid)
 | 
						|
    
 | 
						|
    # Status panel
 | 
						|
    status_frame = mcrfpy.Frame(540, 70, 240, 200, fill_color=BOX_COLOR,
 | 
						|
                               outline_color=WHITE, outline=1)
 | 
						|
    ui.append(status_frame)
 | 
						|
    
 | 
						|
    status_title = create_caption(550, 80, "Status", 20)
 | 
						|
    ui.append(status_title)
 | 
						|
    
 | 
						|
    hp_label = create_caption(550, 120, "HP: 10/10", 16, GREEN)
 | 
						|
    ui.append(hp_label)
 | 
						|
    
 | 
						|
    level_label = create_caption(550, 150, "Level: 1", 16)
 | 
						|
    ui.append(level_label)
 | 
						|
    
 | 
						|
    # Inventory panel
 | 
						|
    inv_frame = mcrfpy.Frame(540, 290, 240, 180, fill_color=BOX_COLOR,
 | 
						|
                            outline_color=WHITE, outline=1)
 | 
						|
    ui.append(inv_frame)
 | 
						|
    
 | 
						|
    inv_title = create_caption(550, 300, "Inventory", 20)
 | 
						|
    ui.append(inv_title)
 | 
						|
    
 | 
						|
    # Add some item sprites
 | 
						|
    item1 = mcrfpy.Sprite(560, 340, sprite_texture, 222, 2.0)
 | 
						|
    ui.append(item1)
 | 
						|
    item2 = mcrfpy.Sprite(610, 340, sprite_texture, 175, 2.0)
 | 
						|
    ui.append(item2)
 | 
						|
    
 | 
						|
    # Message log
 | 
						|
    log_frame = mcrfpy.Frame(20, 490, 760, 90, fill_color=BOX_COLOR,
 | 
						|
                            outline_color=WHITE, outline=1)
 | 
						|
    ui.append(log_frame)
 | 
						|
    
 | 
						|
    log_msg = create_caption(30, 500, "Welcome to McRogueFace!", 14)
 | 
						|
    ui.append(log_msg)
 | 
						|
 | 
						|
# Set up all the scenes
 | 
						|
print("Creating UI example scenes...")
 | 
						|
create_caption_example()
 | 
						|
create_sprite_example()
 | 
						|
create_frame_example()
 | 
						|
create_grid_example()
 | 
						|
create_entity_example()
 | 
						|
create_combined_example()
 | 
						|
 | 
						|
# Screenshot state
 | 
						|
current_screenshot = 0
 | 
						|
screenshots = [
 | 
						|
    ("caption_example", "ui_caption_example.png"),
 | 
						|
    ("sprite_example", "ui_sprite_example.png"),
 | 
						|
    ("frame_example", "ui_frame_example.png"),
 | 
						|
    ("grid_example", "ui_grid_example.png"),
 | 
						|
    ("entity_example", "ui_entity_example.png"),
 | 
						|
    ("combined_example", "ui_combined_example.png")
 | 
						|
]
 | 
						|
 | 
						|
def take_screenshots(runtime):
 | 
						|
    """Timer callback to take screenshots sequentially"""
 | 
						|
    global current_screenshot
 | 
						|
    
 | 
						|
    if current_screenshot >= len(screenshots):
 | 
						|
        print("\nAll screenshots captured successfully!")
 | 
						|
        print(f"Screenshots saved to: {output_dir}/")
 | 
						|
        mcrfpy.exit()
 | 
						|
        return
 | 
						|
    
 | 
						|
    scene_name, filename = screenshots[current_screenshot]
 | 
						|
    
 | 
						|
    # Switch to the scene
 | 
						|
    mcrfpy.setScene(scene_name)
 | 
						|
    
 | 
						|
    # Take screenshot after a short delay to ensure rendering
 | 
						|
    def capture():
 | 
						|
        global current_screenshot
 | 
						|
        full_path = f"{output_dir}/{filename}"
 | 
						|
        result = automation.screenshot(full_path)
 | 
						|
        print(f"Screenshot {current_screenshot + 1}/{len(screenshots)}: {filename} - {'Success' if result else 'Failed'}")
 | 
						|
        
 | 
						|
        current_screenshot += 1
 | 
						|
        
 | 
						|
        # Schedule next screenshot
 | 
						|
        mcrfpy.setTimer("next_screenshot", take_screenshots, 200)
 | 
						|
    
 | 
						|
    # Give scene time to render
 | 
						|
    mcrfpy.setTimer("capture", lambda r: capture(), 100)
 | 
						|
 | 
						|
# Start with the first scene
 | 
						|
mcrfpy.setScene("caption_example")
 | 
						|
 | 
						|
# Start the screenshot process
 | 
						|
print(f"\nStarting screenshot capture of {len(screenshots)} scenes...")
 | 
						|
mcrfpy.setTimer("start", take_screenshots, 500)
 | 
						|
 | 
						|
# Safety timeout
 | 
						|
def safety_exit(runtime):
 | 
						|
    print("\nERROR: Safety timeout reached! Exiting...")
 | 
						|
    mcrfpy.exit()
 | 
						|
 | 
						|
mcrfpy.setTimer("safety", safety_exit, 30000)
 | 
						|
 | 
						|
print("Setup complete. Game loop starting...") |