summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rw-r--r--scripts/build_dev.bat104
-rw-r--r--scripts/build_dev.sh101
-rw-r--r--scripts/build_release.bat148
-rw-r--r--scripts/build_release.sh155
-rw-r--r--scripts/embed_assets.py116
-rw-r--r--scripts/embed_font.py57
-rw-r--r--scripts/embed_logo.py64
-rw-r--r--scripts/embed_lua.py92
8 files changed, 837 insertions, 0 deletions
diff --git a/scripts/build_dev.bat b/scripts/build_dev.bat
new file mode 100644
index 0000000..40f394e
--- /dev/null
+++ b/scripts/build_dev.bat
@@ -0,0 +1,104 @@
+@echo off
+REM ReiLua Development Build Script
+REM Run this from w64devkit shell or CMD with MinGW in PATH
+
+echo ================================
+echo ReiLua - Development Build
+echo ================================
+echo.
+
+REM Get script directory and navigate to project root
+cd /d "%~dp0.."
+
+REM Create and navigate to build directory
+if not exist "build" mkdir build
+cd build
+if errorlevel 1 (
+ echo ERROR: Cannot access build directory
+ exit /b 1
+)
+
+REM Clean old embedded files (important for dev builds!)
+echo Cleaning old embedded files...
+del /Q embedded_main.h embedded_assets.h 2>nul
+
+REM Warn about Lua files in build directory
+dir /b *.lua >nul 2>&1
+if not errorlevel 1 (
+ echo.
+ echo WARNING: Found Lua files in build directory!
+ echo Development builds should load from file system, not embed.
+ echo.
+ dir /b *.lua
+ echo.
+ set /p REMOVE="Remove these files from build directory? (Y/n): "
+ if /i not "%REMOVE%"=="n" (
+ del /Q *.lua
+ echo Lua files removed.
+ )
+ echo.
+)
+
+REM Warn about assets folder in build directory
+if exist "assets" (
+ echo.
+ echo WARNING: Found assets folder in build directory!
+ echo Development builds should load from file system, not embed.
+ echo.
+ set /p REMOVE="Remove assets folder from build directory? (Y/n): "
+ if /i not "%REMOVE%"=="n" (
+ rmdir /S /Q assets
+ echo Assets folder removed.
+ )
+ echo.
+)
+
+REM Clean old configuration if requested
+if "%1"=="clean" (
+ echo Cleaning build directory...
+ del /Q CMakeCache.txt *.o *.a 2>nul
+ rmdir /S /Q CMakeFiles 2>nul
+ echo Clean complete!
+ echo.
+)
+
+REM Configure with MinGW
+echo Configuring CMake for development...
+cmake -G "MinGW Makefiles" ..
+
+if errorlevel 1 (
+ echo.
+ echo ERROR: CMake configuration failed!
+ exit /b 1
+)
+
+echo.
+echo Building ReiLua...
+mingw32-make
+
+if errorlevel 1 (
+ echo.
+ echo ERROR: Build failed!
+ exit /b 1
+)
+
+echo.
+echo ================================
+echo Build Complete!
+echo ================================
+echo.
+echo Development build created successfully!
+echo.
+echo To run your game:
+echo cd \path\to\your\game
+echo \path\to\ReiLua\build\ReiLua.exe
+echo.
+echo To run with console logging:
+echo \path\to\ReiLua\build\ReiLua.exe --log
+echo.
+echo Features:
+echo - Lua files load from file system
+echo - Assets load from file system
+echo - Fast iteration - edit and reload
+echo.
+pause
diff --git a/scripts/build_dev.sh b/scripts/build_dev.sh
new file mode 100644
index 0000000..ed5079d
--- /dev/null
+++ b/scripts/build_dev.sh
@@ -0,0 +1,101 @@
+#!/bin/bash
+# ReiLua Development Build Script
+# Run this from w64devkit shell
+
+echo "================================"
+echo "ReiLua - Development Build"
+echo "================================"
+echo ""
+
+# Get the script directory and navigate to project root
+SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+cd "$SCRIPT_DIR/.." || exit 1
+
+# Create and navigate to build directory
+mkdir -p build
+cd build || exit 1
+
+# Clean old embedded files (important for dev builds!)
+echo "Cleaning old embedded files..."
+rm -f embedded_main.h embedded_assets.h
+
+# Warn about Lua files in build directory
+LUA_COUNT=$(ls *.lua 2>/dev/null | wc -l)
+if [ "$LUA_COUNT" -gt 0 ]; then
+ echo ""
+ echo "WARNING: Found Lua files in build directory!"
+ echo "Development builds should load from file system, not embed."
+ echo ""
+ ls -1 *.lua
+ echo ""
+ read -p "Remove these files from build directory? (Y/n): " -n 1 -r
+ echo ""
+ if [[ ! $REPLY =~ ^[Nn]$ ]]; then
+ rm -f *.lua
+ echo "Lua files removed."
+ fi
+ echo ""
+fi
+
+# Warn about assets folder in build directory
+if [ -d "assets" ]; then
+ echo ""
+ echo "WARNING: Found assets folder in build directory!"
+ echo "Development builds should load from file system, not embed."
+ echo ""
+ read -p "Remove assets folder from build directory? (Y/n): " -n 1 -r
+ echo ""
+ if [[ ! $REPLY =~ ^[Nn]$ ]]; then
+ rm -rf assets
+ echo "Assets folder removed."
+ fi
+ echo ""
+fi
+
+# Clean old configuration if requested
+if [ "$1" == "clean" ]; then
+ echo "Cleaning build directory..."
+ rm -rf CMakeCache.txt CMakeFiles/ *.o *.a
+ echo "Clean complete!"
+ echo ""
+fi
+
+# Configure with MinGW
+echo "Configuring CMake for development..."
+cmake -G "MinGW Makefiles" ..
+
+if [ $? -ne 0 ]; then
+ echo ""
+ echo "ERROR: CMake configuration failed!"
+ exit 1
+fi
+
+echo ""
+echo "Building ReiLua..."
+make
+
+if [ $? -ne 0 ]; then
+ echo ""
+ echo "ERROR: Build failed!"
+ exit 1
+fi
+
+echo ""
+echo "================================"
+echo "Build Complete!"
+echo "================================"
+echo ""
+echo "Development build created successfully!"
+echo ""
+echo "To run your game:"
+echo " cd /path/to/your/game"
+echo " /path/to/ReiLua/build/ReiLua.exe"
+echo ""
+echo "To run with console logging:"
+echo " /path/to/ReiLua/build/ReiLua.exe --log"
+echo ""
+echo "Features:"
+echo " - Lua files load from file system"
+echo " - Assets load from file system"
+echo " - Fast iteration - edit and reload"
+echo ""
diff --git a/scripts/build_release.bat b/scripts/build_release.bat
new file mode 100644
index 0000000..a1a08c0
--- /dev/null
+++ b/scripts/build_release.bat
@@ -0,0 +1,148 @@
+@echo off
+REM ReiLua Release Build Script
+REM Run this from w64devkit shell or CMD with MinGW in PATH
+
+echo ================================
+echo ReiLua - Release Build
+echo ================================
+echo.
+
+REM Get script directory and navigate to project root
+cd /d "%~dp0.."
+
+REM Check if we're in the right directory
+if not exist "CMakeLists.txt" (
+ echo ERROR: Cannot find CMakeLists.txt in project root
+ exit /b 1
+)
+
+REM Create and navigate to build directory
+if not exist "build" mkdir build
+cd build
+if errorlevel 1 (
+ echo ERROR: Cannot access build directory
+ exit /b 1
+)
+
+REM Clean old embedded files
+echo Cleaning old embedded files...
+del /Q embedded_main.h embedded_assets.h 2>nul
+
+REM Check for Lua files
+echo.
+echo Checking for Lua files...
+dir /b *.lua >nul 2>&1
+if errorlevel 1 (
+ echo.
+ echo WARNING: No Lua files found in build directory!
+ echo.
+ echo Please copy your Lua files:
+ echo cd build
+ echo copy ..\your_game\*.lua .
+ echo.
+ set /p CONTINUE="Do you want to continue anyway? (y/N): "
+ if /i not "%CONTINUE%"=="y" exit /b 1
+) else (
+ echo Found Lua files:
+ dir /b *.lua
+)
+
+REM Check for assets folder
+echo.
+echo Checking for assets...
+if not exist "assets" (
+ echo.
+ echo WARNING: No assets folder found!
+ echo.
+ echo To embed assets, create the folder and copy files:
+ echo cd build
+ echo mkdir assets
+ echo copy ..\your_game\assets\* assets\
+ echo.
+ set /p CONTINUE="Do you want to continue without assets? (y/N): "
+ if /i not "%CONTINUE%"=="y" exit /b 1
+ set EMBED_ASSETS=OFF
+) else (
+ echo Found assets folder
+ set EMBED_ASSETS=ON
+)
+
+echo.
+echo ================================
+echo Build Configuration
+echo ================================
+echo Lua Embedding: ON
+echo Asset Embedding: %EMBED_ASSETS%
+echo Build Type: Release
+echo ================================
+echo.
+pause
+
+REM Clean CMake cache
+echo.
+echo Cleaning CMake cache...
+del /Q CMakeCache.txt 2>nul
+rmdir /S /Q CMakeFiles 2>nul
+
+REM Configure with embedding enabled
+echo.
+echo Configuring CMake for release...
+cmake -G "MinGW Makefiles" .. -DEMBED_MAIN=ON -DEMBED_ASSETS=%EMBED_ASSETS% -DCMAKE_BUILD_TYPE=Release
+
+if errorlevel 1 (
+ echo.
+ echo ERROR: CMake configuration failed!
+ pause
+ exit /b 1
+)
+
+REM Build
+echo.
+echo Building ReiLua Release...
+mingw32-make
+
+if errorlevel 1 (
+ echo.
+ echo ERROR: Build failed!
+ pause
+ exit /b 1
+)
+
+REM Show summary
+echo.
+echo ================================
+echo Embedded Files Summary
+echo ================================
+
+if exist "embedded_main.h" (
+ echo.
+ echo Embedded Lua files:
+ findstr /C:"Embedded file:" embedded_main.h
+)
+
+if exist "embedded_assets.h" (
+ echo.
+ echo Embedded assets:
+ findstr /C:"Embedded asset:" embedded_assets.h
+)
+
+echo.
+echo ================================
+echo Build Complete!
+echo ================================
+echo.
+echo Executable: ReiLua.exe
+echo Location: %CD%\ReiLua.exe
+echo.
+echo Your game is ready for distribution!
+echo.
+echo To test the release build:
+echo ReiLua.exe --log (with console)
+echo ReiLua.exe (production mode)
+echo.
+echo To distribute:
+echo - Copy ReiLua.exe to your distribution folder
+echo - Rename it to your game name (optional)
+echo - That's it! Single file distribution!
+echo.
+pause
diff --git a/scripts/build_release.sh b/scripts/build_release.sh
new file mode 100644
index 0000000..cccdefe
--- /dev/null
+++ b/scripts/build_release.sh
@@ -0,0 +1,155 @@
+#!/bin/bash
+# ReiLua Release Build Script
+# Run this from w64devkit shell
+
+echo "================================"
+echo "ReiLua - Release Build"
+echo "================================"
+echo ""
+
+# Get the script directory and navigate to project root
+SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+cd "$SCRIPT_DIR/.." || exit 1
+
+# Check if we're in the right directory
+if [ ! -f "CMakeLists.txt" ]; then
+ echo "ERROR: Cannot find CMakeLists.txt in project root"
+ exit 1
+fi
+
+# Create and navigate to build directory
+mkdir -p build
+cd build || exit 1
+
+# Clean old embedded files
+echo "Cleaning old embedded files..."
+rm -f embedded_main.h embedded_assets.h
+
+# Check for Lua files
+echo ""
+echo "Checking for Lua files..."
+LUA_FILES=$(ls *.lua 2>/dev/null | wc -l)
+
+if [ "$LUA_FILES" -eq 0 ]; then
+ echo ""
+ echo "WARNING: No Lua files found in build directory!"
+ echo ""
+ echo "Please copy your Lua files:"
+ echo " cd build"
+ echo " cp ../your_game/*.lua ."
+ echo ""
+ read -p "Do you want to continue anyway? (y/N): " -n 1 -r
+ echo ""
+ if [[ ! $REPLY =~ ^[Yy]$ ]]; then
+ exit 1
+ fi
+else
+ echo "Found $LUA_FILES Lua file(s):"
+ ls -1 *.lua
+fi
+
+# Check for assets folder
+echo ""
+echo "Checking for assets..."
+if [ ! -d "assets" ]; then
+ echo ""
+ echo "WARNING: No assets folder found!"
+ echo ""
+ echo "To embed assets, create the folder and copy files:"
+ echo " cd build"
+ echo " mkdir assets"
+ echo " cp ../your_game/assets/* assets/"
+ echo ""
+ read -p "Do you want to continue without assets? (y/N): " -n 1 -r
+ echo ""
+ if [[ ! $REPLY =~ ^[Yy]$ ]]; then
+ exit 1
+ fi
+ EMBED_ASSETS="OFF"
+else
+ ASSET_FILES=$(find assets -type f 2>/dev/null | wc -l)
+ echo "Found $ASSET_FILES asset file(s) in assets folder"
+ EMBED_ASSETS="ON"
+fi
+
+echo ""
+echo "================================"
+echo "Build Configuration"
+echo "================================"
+echo "Lua Embedding: ON"
+echo "Asset Embedding: $EMBED_ASSETS"
+echo "Build Type: Release"
+echo "================================"
+echo ""
+read -p "Press Enter to continue or Ctrl+C to cancel..."
+
+# Clean CMake cache to ensure fresh configuration
+echo ""
+echo "Cleaning CMake cache..."
+rm -rf CMakeCache.txt CMakeFiles/
+
+# Configure with embedding enabled
+echo ""
+echo "Configuring CMake for release..."
+cmake -G "MinGW Makefiles" .. -DEMBED_MAIN=ON -DEMBED_ASSETS=$EMBED_ASSETS -DCMAKE_BUILD_TYPE=Release
+
+if [ $? -ne 0 ]; then
+ echo ""
+ echo "ERROR: CMake configuration failed!"
+ exit 1
+fi
+
+# Build
+echo ""
+echo "Building ReiLua Release..."
+make
+
+if [ $? -ne 0 ]; then
+ echo ""
+ echo "ERROR: Build failed!"
+ exit 1
+fi
+
+# Show embedded file info
+echo ""
+echo "================================"
+echo "Embedded Files Summary"
+echo "================================"
+
+if [ -f "embedded_main.h" ]; then
+ echo ""
+ echo "Embedded Lua files:"
+ grep 'Embedded file:' embedded_main.h | sed 's/.*Embedded file: / - /'
+else
+ echo "No Lua files embedded"
+fi
+
+if [ -f "embedded_assets.h" ]; then
+ echo ""
+ echo "Embedded assets:"
+ grep 'Embedded asset:' embedded_assets.h | sed 's/.*Embedded asset: / - /' | sed 's/ (.*//'
+else
+ echo "No assets embedded"
+fi
+
+# Get executable size
+echo ""
+echo "================================"
+echo "Build Complete!"
+echo "================================"
+EXESIZE=$(du -h ReiLua.exe | cut -f1)
+echo ""
+echo "Executable: ReiLua.exe ($EXESIZE)"
+echo "Location: $(pwd)/ReiLua.exe"
+echo ""
+echo "Your game is ready for distribution!"
+echo ""
+echo "To test the release build:"
+echo " ./ReiLua.exe --log (with console)"
+echo " ./ReiLua.exe (production mode)"
+echo ""
+echo "To distribute:"
+echo " - Copy ReiLua.exe to your distribution folder"
+echo " - Rename it to your game name (optional)"
+echo " - That's it! Single file distribution!"
+echo ""
diff --git a/scripts/embed_assets.py b/scripts/embed_assets.py
new file mode 100644
index 0000000..52309ef
--- /dev/null
+++ b/scripts/embed_assets.py
@@ -0,0 +1,116 @@
+#!/usr/bin/env python3
+"""
+Embed asset files (images, sounds, fonts, etc.) into a C header file.
+Usage: python embed_assets.py <output.h> <file1.png> [file2.wav] [file3.ttf] ...
+
+Embeds all specified asset files into a C header for inclusion in the executable.
+"""
+import sys
+import os
+
+def sanitize_name(filename):
+ """Convert filename to valid C identifier"""
+ name = os.path.basename(filename)
+ # Remove or replace all non-alphanumeric characters (except underscore)
+ valid_chars = []
+ for char in name:
+ if char.isalnum() or char == '_':
+ valid_chars.append(char)
+ else:
+ valid_chars.append('_')
+ name = ''.join(valid_chars)
+ # Ensure it doesn't start with a digit
+ if name and name[0].isdigit():
+ name = '_' + name
+ return name
+
+def get_file_extension(filename):
+ """Get the file extension"""
+ return os.path.splitext(filename)[1].lower()
+
+def embed_files(output_file, input_files):
+ with open(output_file, 'w') as f:
+ f.write('#ifndef EMBEDDED_ASSETS_H\n')
+ f.write('#define EMBEDDED_ASSETS_H\n\n')
+ f.write('/* Auto-generated file - do not edit manually */\n\n')
+
+ # Embed each file as a separate array
+ for idx, input_file in enumerate(input_files):
+ with open(input_file, 'rb') as inf:
+ data = inf.read()
+
+ var_name = sanitize_name(input_file)
+ # Extract relative path from 'assets/' onwards if present
+ if 'assets' in input_file.replace('\\', '/'):
+ parts = input_file.replace('\\', '/').split('assets/')
+ if len(parts) > 1:
+ relative_name = 'assets/' + parts[-1]
+ else:
+ relative_name = os.path.basename(input_file)
+ else:
+ relative_name = os.path.basename(input_file)
+
+ f.write(f'/* Embedded asset: {input_file} ({len(data)} bytes) */\n')
+ f.write(f'static const unsigned char embedded_asset_{idx}_{var_name}[] = {{\n')
+
+ for i, byte in enumerate(data):
+ if i % 12 == 0:
+ f.write(' ')
+ f.write(f'0x{byte:02x}')
+ if i < len(data) - 1:
+ f.write(',')
+ if (i + 1) % 12 == 0:
+ f.write('\n')
+ else:
+ f.write(' ')
+
+ f.write('\n};\n')
+ f.write(f'static const unsigned int embedded_asset_{idx}_{var_name}_len = {len(data)};\n\n')
+
+ # Create the asset table
+ f.write('/* Asset table for virtual filesystem */\n')
+ f.write('typedef struct {\n')
+ f.write(' const char* name;\n')
+ f.write(' const unsigned char* data;\n')
+ f.write(' unsigned int size;\n')
+ f.write('} EmbeddedAsset;\n\n')
+
+ f.write('static const EmbeddedAsset embedded_assets[] = {\n')
+ for idx, input_file in enumerate(input_files):
+ var_name = sanitize_name(input_file)
+ # Extract relative path from 'assets/' onwards if present
+ if 'assets' in input_file.replace('\\', '/'):
+ parts = input_file.replace('\\', '/').split('assets/')
+ if len(parts) > 1:
+ relative_name = 'assets/' + parts[-1]
+ else:
+ relative_name = os.path.basename(input_file)
+ else:
+ relative_name = os.path.basename(input_file)
+ f.write(f' {{ "{relative_name}", embedded_asset_{idx}_{var_name}, embedded_asset_{idx}_{var_name}_len }},\n')
+ f.write('};\n\n')
+
+ f.write(f'static const int embedded_asset_count = {len(input_files)};\n\n')
+ f.write('#endif /* EMBEDDED_ASSETS_H */\n')
+
+if __name__ == '__main__':
+ if len(sys.argv) < 3:
+ print('Usage: python embed_assets.py <output.h> <asset1> [asset2] ...')
+ print(' Embeds images, sounds, fonts, and other asset files into a C header.')
+ print(' Supported: .png, .jpg, .wav, .ogg, .mp3, .ttf, .otf, etc.')
+ sys.exit(1)
+
+ output_file = sys.argv[1]
+ input_files = sys.argv[2:]
+
+ # Check all input files exist
+ for f in input_files:
+ if not os.path.exists(f):
+ print(f'Error: File not found: {f}')
+ sys.exit(1)
+
+ embed_files(output_file, input_files)
+ print(f'Embedded {len(input_files)} asset file(s) into {output_file}')
+ for f in input_files:
+ size = os.path.getsize(f)
+ print(f' - {f} ({size} bytes)')
diff --git a/scripts/embed_font.py b/scripts/embed_font.py
new file mode 100644
index 0000000..8144718
--- /dev/null
+++ b/scripts/embed_font.py
@@ -0,0 +1,57 @@
+#!/usr/bin/env python3
+"""
+Embed font file into C header.
+Usage: python embed_font.py <output.h> <font.ttf>
+"""
+
+import sys
+import os
+
+def embed_file(file_path, var_name):
+ """Convert a file to a C byte array"""
+ with open(file_path, 'rb') as f:
+ data = f.read()
+
+ output = f"/* {os.path.basename(file_path)} */\n"
+ output += f"static const unsigned char {var_name}[] = {{\n"
+
+ # Write bytes in rows of 16
+ for i in range(0, len(data), 16):
+ chunk = data[i:i+16]
+ hex_values = ', '.join(f'0x{b:02x}' for b in chunk)
+ output += f" {hex_values},\n"
+
+ output += "};\n"
+ output += f"static const unsigned int {var_name}_size = {len(data)};\n\n"
+
+ return output
+
+def main():
+ if len(sys.argv) != 3:
+ print("Usage: python embed_font.py <output.h> <font.ttf>")
+ sys.exit(1)
+
+ output_file = sys.argv[1]
+ font_file = sys.argv[2]
+
+ # Check if file exists
+ if not os.path.exists(font_file):
+ print(f"Error: {font_file} not found!")
+ sys.exit(1)
+
+ # Generate header content
+ header_content = "/* Auto-generated embedded font file */\n"
+ header_content += "#pragma once\n\n"
+
+ # Embed font file
+ header_content += embed_file(font_file, "embedded_font_data")
+
+ # Write to output file
+ with open(output_file, 'w') as f:
+ f.write(header_content)
+
+ print(f"Generated {output_file}")
+ print(f" - Embedded {font_file} ({os.path.getsize(font_file)} bytes)")
+
+if __name__ == "__main__":
+ main()
diff --git a/scripts/embed_logo.py b/scripts/embed_logo.py
new file mode 100644
index 0000000..e6b645e
--- /dev/null
+++ b/scripts/embed_logo.py
@@ -0,0 +1,64 @@
+#!/usr/bin/env python3
+"""
+Embed logo image files into C header for splash screens.
+Usage: python embed_logo.py <output.h> <raylib_logo.png> <reilua_logo.png>
+"""
+
+import sys
+import os
+
+def embed_file(file_path, var_name):
+ """Convert a file to a C byte array"""
+ with open(file_path, 'rb') as f:
+ data = f.read()
+
+ output = f"/* {os.path.basename(file_path)} */\n"
+ output += f"static const unsigned char {var_name}[] = {{\n"
+
+ # Write bytes in rows of 16
+ for i in range(0, len(data), 16):
+ chunk = data[i:i+16]
+ hex_values = ', '.join(f'0x{b:02x}' for b in chunk)
+ output += f" {hex_values},\n"
+
+ output += "};\n"
+ output += f"static const unsigned int {var_name}_size = {len(data)};\n\n"
+
+ return output
+
+def main():
+ if len(sys.argv) != 4:
+ print("Usage: python embed_logo.py <output.h> <raylib_logo.png> <reilua_logo.png>")
+ sys.exit(1)
+
+ output_file = sys.argv[1]
+ raylib_logo = sys.argv[2]
+ reilua_logo = sys.argv[3]
+
+ # Check if files exist
+ if not os.path.exists(raylib_logo):
+ print(f"Error: {raylib_logo} not found!")
+ sys.exit(1)
+
+ if not os.path.exists(reilua_logo):
+ print(f"Error: {reilua_logo} not found!")
+ sys.exit(1)
+
+ # Generate header content
+ header_content = "/* Auto-generated embedded logo files */\n"
+ header_content += "#pragma once\n\n"
+
+ # Embed both logo files
+ header_content += embed_file(raylib_logo, "embedded_raylib_logo")
+ header_content += embed_file(reilua_logo, "embedded_reilua_logo")
+
+ # Write to output file
+ with open(output_file, 'w') as f:
+ f.write(header_content)
+
+ print(f"Generated {output_file}")
+ print(f" - Embedded {raylib_logo} ({os.path.getsize(raylib_logo)} bytes)")
+ print(f" - Embedded {reilua_logo} ({os.path.getsize(reilua_logo)} bytes)")
+
+if __name__ == "__main__":
+ main()
diff --git a/scripts/embed_lua.py b/scripts/embed_lua.py
new file mode 100644
index 0000000..9562354
--- /dev/null
+++ b/scripts/embed_lua.py
@@ -0,0 +1,92 @@
+#!/usr/bin/env python3
+"""
+Embed multiple Lua files into a C header file for inclusion in the executable.
+Usage: python embed_lua.py <output.h> <file1.lua> [file2.lua] [file3.lua] ...
+
+Embeds all specified Lua files into a C header with a virtual filesystem.
+The first file is treated as main.lua (entry point).
+"""
+import sys
+import os
+
+def sanitize_name(filename):
+ """Convert filename to valid C identifier"""
+ name = os.path.basename(filename)
+ name = name.replace('.', '_').replace('-', '_').replace('/', '_').replace('\\', '_')
+ return name
+
+def embed_files(output_file, input_files):
+ with open(output_file, 'w') as f:
+ f.write('#ifndef EMBEDDED_MAIN_H\n')
+ f.write('#define EMBEDDED_MAIN_H\n\n')
+ f.write('/* Auto-generated file - do not edit manually */\n\n')
+
+ # Embed each file as a separate array
+ for idx, input_file in enumerate(input_files):
+ with open(input_file, 'rb') as inf:
+ data = inf.read()
+
+ var_name = sanitize_name(input_file)
+ f.write(f'/* Embedded file: {input_file} */\n')
+ f.write(f'static const unsigned char embedded_lua_{idx}_{var_name}[] = {{\n')
+
+ for i, byte in enumerate(data):
+ if i % 12 == 0:
+ f.write(' ')
+ f.write(f'0x{byte:02x}')
+ if i < len(data) - 1:
+ f.write(',')
+ if (i + 1) % 12 == 0:
+ f.write('\n')
+ else:
+ f.write(' ')
+
+ f.write('\n};\n')
+ f.write(f'static const unsigned int embedded_lua_{idx}_{var_name}_len = {len(data)};\n\n')
+
+ # Create the file table
+ f.write('/* File table for virtual filesystem */\n')
+ f.write('typedef struct {\n')
+ f.write(' const char* name;\n')
+ f.write(' const unsigned char* data;\n')
+ f.write(' unsigned int size;\n')
+ f.write('} EmbeddedLuaFile;\n\n')
+
+ f.write('static const EmbeddedLuaFile embedded_lua_files[] = {\n')
+ for idx, input_file in enumerate(input_files):
+ var_name = sanitize_name(input_file)
+ # Store both original filename and basename for require compatibility
+ basename = os.path.basename(input_file)
+ f.write(f' {{ "{basename}", embedded_lua_{idx}_{var_name}, embedded_lua_{idx}_{var_name}_len }},\n')
+ f.write('};\n\n')
+
+ f.write(f'static const int embedded_lua_file_count = {len(input_files)};\n\n')
+
+ # Main entry point (first file)
+ var_name = sanitize_name(input_files[0])
+ f.write('/* Main entry point */\n')
+ f.write(f'#define embedded_main_lua embedded_lua_0_{var_name}\n')
+ f.write(f'#define embedded_main_lua_len embedded_lua_0_{var_name}_len\n\n')
+
+ f.write('#endif /* EMBEDDED_MAIN_H */\n')
+
+if __name__ == '__main__':
+ if len(sys.argv) < 3:
+ print('Usage: python embed_lua.py <output.h> <file1.lua> [file2.lua] ...')
+ print(' The first Lua file is treated as the main entry point.')
+ sys.exit(1)
+
+ output_file = sys.argv[1]
+ input_files = sys.argv[2:]
+
+ # Check all input files exist
+ for f in input_files:
+ if not os.path.exists(f):
+ print(f'Error: File not found: {f}')
+ sys.exit(1)
+
+ embed_files(output_file, input_files)
+ print(f'Embedded {len(input_files)} file(s) into {output_file}')
+ for f in input_files:
+ print(f' - {f}')
+