Games - Sorceress
🎮 GAMES
Preview and test your games on different screen sizes!
🖥️ Getting Started
- Go to Settings to configure your games folder
- Download and run the server script
- Come back here and click Refresh Games
- Click any game to play!
📁 Games folder structure:
YourGamesFolder/
├── game1/index.html
├── game2/index.html
└── platformer/index.html
'''
echo if '^' in content:
echo content = content.replace^('^', script + '^'^)
echo else:
echo content += script
echo self.send_response^(200^)
echo self.send_header^('Content-Type', 'text/html'^)
echo self.send_header^('Content-Length', len^(content.encode^('utf-8'^)^)^)
echo self.end_headers^(^)
echo self.wfile.write^(content.encode^('utf-8'^)^)
echo except Exception as ex:
echo print^(f' [ERROR] Inject failed: {ex}'^)
echo super^(^).do_GET^(^)
echo.
echo def do_POST^(self^):
echo content_len = int^(self.headers.get^('Content-Length', 0^)^)
echo body = self.rfile.read^(content_len^).decode^('utf-8'^)
echo try:
echo data = json.loads^(body^) if body else ^{^}
echo except:
echo data = ^{^}
echo.
echo if self.path == '/api/save-prefs':
echo self.handle_save_prefs^(data^)
echo elif self.path == '/api/save-image':
echo self.handle_save_image^(data^)
echo elif self.path == '/api/save-screenshot':
echo self.handle_save_screenshot^(data^)
echo else:
echo self.send_response^(404^)
echo self.end_headers^(^)
echo.
echo def handle_get_prefs^(self^):
echo filename = self.path.split^('/'^)[-1]
echo filepath = os.path.join^(PREFS_DIR, filename^)
echo if os.path.exists^(filepath^):
echo with open^(filepath, 'r'^) as f:
echo self.send_response^(200^)
echo self.send_header^('Content-Type', 'application/json'^)
echo self.end_headers^(^)
echo self.wfile.write^(f.read^(^).encode^(^)^)
echo else:
echo self.send_response^(200^)
echo self.send_header^('Content-Type', 'application/json'^)
echo self.end_headers^(^)
echo self.wfile.write^(b'^{^}'^)
echo.
echo def handle_save_prefs^(self, data^):
echo filename = data.get^('file', 'default.json'^)
echo prefs = data.get^('data', ^{^}^)
echo filepath = os.path.join^(PREFS_DIR, filename^)
echo with open^(filepath, 'w'^) as f:
echo json.dump^(prefs, f, indent=2^)
echo print^(f' [SAVED] Prefs: {filename}'^)
echo self.send_response^(200^)
echo self.send_header^('Content-Type', 'application/json'^)
echo self.end_headers^(^)
echo self.wfile.write^(json.dumps^(^{'success': True^}^).encode^(^)^)
echo.
echo def handle_save_image^(self, data^):
echo image_url = data.get^('imageUrl'^)
echo model_name = data.get^('modelName', 'unknown'^)
echo prompt = data.get^('prompt', ''^)[:100]
echo timestamp = datetime.now^(^).strftime^('%%Y%%m%%d_%%H%%M%%S'^)
echo safe_model = ''.join^(c if c.isalnum^(^) else '_' for c in model_name^)
echo filename = f'{timestamp}_{safe_model}.png'
echo filepath = os.path.join^(IMAGES_DIR, filename^)
echo try:
echo urllib.request.urlretrieve^(image_url, filepath^)
echo meta = ^{'prompt': data.get^('prompt'^), 'model': model_name, 'timestamp': timestamp, 'url': image_url^}
echo with open^(filepath + '.json', 'w'^) as f:
echo json.dump^(meta, f, indent=2^)
echo print^(f' [SAVED] Image: {filename}'^)
echo self.send_response^(200^)
echo self.send_header^('Content-Type', 'application/json'^)
echo self.end_headers^(^)
echo self.wfile.write^(json.dumps^(^{'success': True, 'path': filepath^}^).encode^(^)^)
echo except Exception as e:
echo print^(f' [ERROR] Save image failed: {e}'^)
echo self.send_response^(500^)
echo self.end_headers^(^)
echo.
echo def handle_list_images^(self^):
echo images = []
echo if os.path.exists^(IMAGES_DIR^):
echo for f in os.listdir^(IMAGES_DIR^):
echo if f.endswith^('.png'^):
echo meta_path = os.path.join^(IMAGES_DIR, f + '.json'^)
echo meta = ^{^}
echo if os.path.exists^(meta_path^):
echo with open^(meta_path^) as mf:
echo meta = json.load^(mf^)
echo images.append^(^{'filename': f, 'path': f'/sorceress-data/images/^{f^}', **meta^}^)
echo images.sort^(key=lambda x: x.get^('timestamp', ''^), reverse=True^)
echo self.send_response^(200^)
echo self.send_header^('Content-Type', 'application/json'^)
echo self.end_headers^(^)
echo self.wfile.write^(json.dumps^(images^).encode^(^)^)
echo.
echo def handle_save_screenshot^(self, data^):
echo base64_data = data.get^('image', ''^)
echo game_name = data.get^('game', 'screenshot'^)
echo size_name = data.get^('size', ''^)
echo timestamp = datetime.now^(^).strftime^('%%Y%%m%%d_%%H%%M%%S'^)
echo safe_game = ''.join^(c if c.isalnum^(^) else '_' for c in game_name^)
echo filename = f'{safe_game}_{size_name}_{timestamp}.png'
echo screenshots_dir = os.path.join^(DATA_DIR, 'screenshots'^)
echo os.makedirs^(screenshots_dir, exist_ok=True^)
echo filepath = os.path.join^(screenshots_dir, filename^)
echo try:
echo if base64_data.startswith^('data:'^):
echo base64_data = base64_data.split^(',', 1^)[1]
echo image_bytes = base64.b64decode^(base64_data^)
echo with open^(filepath, 'wb'^) as f:
echo f.write^(image_bytes^)
echo print^(f' [SAVED] Screenshot: {filename}'^)
echo self.send_response^(200^)
echo self.send_header^('Content-Type', 'application/json'^)
echo self.send_header^('Access-Control-Allow-Origin', '*'^)
echo self.end_headers^(^)
echo self.wfile.write^(json.dumps^(^{'success': True, 'path': filepath, 'filename': filename^}^).encode^(^)^)
echo except Exception as e:
echo print^(f' [ERROR] Save screenshot failed: {e}'^)
echo self.send_response^(500^)
echo self.end_headers^(^)
echo.
echo print^(''^)
echo print^(' SORCERESS LOCAL SERVER'^)
echo print^(' ======================'^)
echo print^(f' Games: {DIRECTORY}'^)
echo print^(f' Data: {DATA_DIR}'^)
echo print^(f' URL: http://localhost:{PORT}'^)
echo print^(''^)
echo print^(' API Endpoints:'^)
echo print^(' GET /api/prefs/[file] - Load preferences'^)
echo print^(' POST /api/save-prefs - Save preferences'^)
echo print^(' POST /api/save-image - Save generated image'^)
echo print^(' POST /api/save-screenshot - Save screenshot (base64)'^)
echo print^(' GET /api/images - List saved images'^)
echo print^(''^)
echo print^(' Press Ctrl+C to stop'^)
echo print^(''^)
echo.
echo with socketserver.TCPServer^(^('127.0.0.1', PORT^), SorceressHandler^) as httpd:
echo httpd.serve_forever^(^)
) > "%TEMP%\\sorceress_server.py"
echo Starting CORS-enabled server...
echo.
echo ----------------------------------------
echo http://localhost:${port}
echo ----------------------------------------
echo.
echo Click SCAN in Sorceress Games page
echo Press Ctrl+C to stop the server
echo.
:: Run the server (pause on error)
python "%TEMP%\\sorceress_server.py"
if %errorlevel% neq 0 (
echo.
echo ========================================
echo [ERROR] Server failed to start!
echo ========================================
echo.
echo Common fixes:
echo 1. Port ${port} may already be in use
echo - Open Task Manager, end any Python process
echo - Or generate a new script with different port
echo.
echo 2. Firewall may be blocking the port
echo - Allow Python through Windows Firewall
echo.
pause
)
`;
}
function generateUnixSh(folderPath, port) {
return `#!/bin/bash
echo ""
echo "========================================"
echo " SORCERESS LOCAL GAME SERVER"
echo "========================================"
echo ""
echo " Games Folder: ${folderPath}"
echo " Port: ${port}"
echo ""
# Check if Python is installed
if ! command -v python3 &> /dev/null; then
if ! command -v python &> /dev/null; then
echo "[ERROR] Python is not installed!"
echo ""
echo "Install Python:"
echo " Mac: brew install python3"
echo " Linux: sudo apt install python3"
echo ""
exit 1
fi
PYTHON_CMD="python"
else
PYTHON_CMD="python3"
fi
# Check if folder exists
if [ ! -d "${folderPath}" ]; then
echo "[ERROR] Games folder not found:"
echo "${folderPath}"
echo ""
echo "Please check the path and regenerate the script."
echo ""
exit 1
fi
echo "----------------------------------------"
echo " Server running at:"
echo " http://localhost:${port}"
echo "----------------------------------------"
echo ""
echo "Go to Sorceress Games page and click SCAN"
echo ""
echo "Press Ctrl+C to stop the server."
echo ""
# Create data directories
mkdir -p "${folderPath}/sorceress-data/prefs"
mkdir -p "${folderPath}/sorceress-data/images"
# Run Python with full Sorceress server
$PYTHON_CMD -c "
import http.server
import socketserver
import json
import os
import urllib.request
from datetime import datetime
from urllib.parse import urlparse
PORT = ${port}
DIRECTORY = '${folderPath}'
DATA_DIR = os.path.join(DIRECTORY, 'sorceress-data')
PREFS_DIR = os.path.join(DATA_DIR, 'prefs')
IMAGES_DIR = os.path.join(DATA_DIR, 'images')
class SorceressHandler(http.server.SimpleHTTPRequestHandler):
def __init__(self, *args, **kwargs):
super().__init__(*args, directory=DIRECTORY, **kwargs)
def end_headers(self):
self.send_header('Access-Control-Allow-Origin', '*')
self.send_header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS')
self.send_header('Access-Control-Allow-Headers', '*')
self.send_header('Cache-Control', 'no-store')
super().end_headers()
def do_OPTIONS(self):
self.send_response(200)
self.end_headers()
def do_GET(self):
if self.path.startswith('/api/prefs/'):
self.handle_get_prefs()
elif self.path == '/api/images':
self.handle_list_images()
else:
# Check if requesting HTML - inject screenshot script
path = self.path.split('?')[0]
if path.endswith('.html') or path.endswith('/'):
self.serve_with_screenshot_script()
else:
super().do_GET()
def serve_with_screenshot_script(self):
# Serve HTML with injected screenshot capture script
path = self.translate_path(self.path)
if os.path.isdir(path):
path = os.path.join(path, 'index.html')
if not os.path.exists(path):
super().do_GET()
return
try:
with open(path, 'r', encoding='utf-8') as f:
content = f.read()
# Inject screenshot capture script before
screenshot_script = '''