diff --git a/.gitignore b/.gitignore index 6e465b1b..1cd19134 100644 --- a/.gitignore +++ b/.gitignore @@ -75,3 +75,4 @@ Platform/Apple/tools/jace/nbactions.xml # Ignore temporary pom files Platform/Apple/tools/jace/runPom.xml +Platform/Apple/tools/jace/*.log diff --git a/Platform/Apple/tools/PackPartitions/.java-version b/Platform/Apple/tools/PackPartitions/.java-version new file mode 100644 index 00000000..40994076 --- /dev/null +++ b/Platform/Apple/tools/PackPartitions/.java-version @@ -0,0 +1 @@ +23 diff --git a/Platform/Apple/tools/jace/.java-version b/Platform/Apple/tools/jace/.java-version index cc64c915..8ee84bf6 100644 --- a/Platform/Apple/tools/jace/.java-version +++ b/Platform/Apple/tools/jace/.java-version @@ -1 +1 @@ -17.0.3 +graalvm64-23 diff --git a/Platform/Apple/tools/jace/Package-Lawless-Legends-Safe.zsh b/Platform/Apple/tools/jace/Package-Lawless-Legends-Safe.zsh new file mode 100644 index 00000000..01e717f4 --- /dev/null +++ b/Platform/Apple/tools/jace/Package-Lawless-Legends-Safe.zsh @@ -0,0 +1,1029 @@ +#!/usr/bin/env zsh + +# Package-Lawless-Legends-Safe.zsh - A proper packaging script using jpackage to create a self-contained app +# This script uses a single temp directory for all operations to ensure safety + +# Ensure PATH is set correctly +export PATH="/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:${HOME}/.jenv/bin:${HOME}/.jenv/shims:$PATH" + +# ----- VARIABLES ----- +# Create a single temporary directory for all build operations +MAIN_TEMP_DIR="$(/usr/bin/mktemp -d)" +log_prefix="package-$(/bin/date +%Y%m%d-%H%M%S)" + +# Define final destination paths - only DMG goes to desktop, everything else uses temp folders +DESKTOP_DIR="${HOME}/Desktop" +LOGS_DIR="${HOME}/Library/Logs/LawlessLegends" +LOG_FILE="${LOGS_DIR}/${log_prefix}.log" + +# All build files go in the temp directory +TEMP_APP_DIR="${MAIN_TEMP_DIR}/app_bundle" +TEMP_APP="${TEMP_APP_DIR}/Lawless Legends.app" +TEMP_DMG="${MAIN_TEMP_DIR}/Lawless Legends.dmg" + +# Final DMG location (the only file copied to desktop) +FINAL_DMG="${DESKTOP_DIR}/Lawless Legends.dmg" + +# Define source paths +SOURCE_CODE_DIR="${HOME}/Documents/code/lawless-legends" +JACE_DIR="${SOURCE_CODE_DIR}/Platform/Apple/tools/jace" +SOURCE_JAR="${JACE_DIR}/target/LawlessLegends.jar" +DEPENDENCY_DIR="${JACE_DIR}/target/dependency" + +# Define build paths (all within temp dir) +BUILD_DIR="${MAIN_TEMP_DIR}/build" +PACKAGE_DIR="${MAIN_TEMP_DIR}/package" +JLINK_MODS_DIR="${MAIN_TEMP_DIR}/jlink_mods" +ICON_FILE="${MAIN_TEMP_DIR}/AppIcon.icns" +DMG_TEMP_DIR="${MAIN_TEMP_DIR}/dmg_temp" + +# Application info +VERSION="1.0.0" +MAIN_CLASS="jace.LawlessLegends" +JAVA_FX_JMODS="" + +# ----- HELPER FUNCTIONS ----- + +# Log message to both console and log file +log() { + echo "$1" | /usr/bin/tee -a "${LOG_FILE}" +} + +# Some macOS fixes for common commands +# macOS doesn't have /bin/basename - it's in /usr/bin +basename() { + /usr/bin/basename "$@" +} + +# macOS doesn't have /bin/tr - it's in /usr/bin +tr_cmd() { + /usr/bin/tr "$@" +} + +# macOS doesn't have /bin/wc - it's in /usr/bin +wc_cmd() { + /usr/bin/wc "$@" +} + +# Display section header +section() { + log "" + log "===== $1 =====" + log "$(/usr/bin/printf '=%.0s' {1..50})" +} + +# Safe exit - cleans up temporary directory +safe_exit() { + local exit_code=$1 + + # Only clean up if the main temp dir exists and is under /tmp or /var + if [[ -d "${MAIN_TEMP_DIR}" && ("${MAIN_TEMP_DIR}" == /tmp/* || "${MAIN_TEMP_DIR}" == /var/*) ]]; then + log "Cleaning up temporary directory: ${MAIN_TEMP_DIR}" + /bin/rm -rf "${MAIN_TEMP_DIR}" + else + log "⚠️ SAFETY CHECK FAILED - Skipping cleanup - temporary directory is not in a safe location or doesn't exist" + log "Manual cleanup may be required for: ${MAIN_TEMP_DIR}" + fi + + log "Script completed with exit code: ${exit_code}" + exit ${exit_code} +} + +# Convert PNG to ICNS +convert_png_to_icns() { + local png_file="$1" + local icns_file="$2" + local icon_set_dir="${MAIN_TEMP_DIR}/AppIcon.iconset" + + log "Converting PNG to ICNS format..." + /bin/mkdir -p "${icon_set_dir}" + + # Generate various icon sizes + /usr/bin/sips -z 16 16 "$png_file" --out "${icon_set_dir}/icon_16x16.png" > /dev/null 2>&1 + /usr/bin/sips -z 32 32 "$png_file" --out "${icon_set_dir}/icon_16x16@2x.png" > /dev/null 2>&1 + /usr/bin/sips -z 32 32 "$png_file" --out "${icon_set_dir}/icon_32x32.png" > /dev/null 2>&1 + /usr/bin/sips -z 64 64 "$png_file" --out "${icon_set_dir}/icon_32x32@2x.png" > /dev/null 2>&1 + /usr/bin/sips -z 128 128 "$png_file" --out "${icon_set_dir}/icon_128x128.png" > /dev/null 2>&1 + /usr/bin/sips -z 256 256 "$png_file" --out "${icon_set_dir}/icon_128x128@2x.png" > /dev/null 2>&1 + /usr/bin/sips -z 256 256 "$png_file" --out "${icon_set_dir}/icon_256x256.png" > /dev/null 2>&1 + /usr/bin/sips -z 512 512 "$png_file" --out "${icon_set_dir}/icon_256x256@2x.png" > /dev/null 2>&1 + /usr/bin/sips -z 512 512 "$png_file" --out "${icon_set_dir}/icon_512x512.png" > /dev/null 2>&1 + /usr/bin/sips -z 1024 1024 "$png_file" --out "${icon_set_dir}/icon_512x512@2x.png" > /dev/null 2>&1 + + # Convert the iconset to icns + /usr/bin/iconutil -c icns "${icon_set_dir}" -o "${icns_file}" + + log "✅ Application icon created from game_icon.png" +} + +# ----- STEP 3: PREPARE ICON ----- +section "PREPARING APPLICATION ICON" + +# Set the app icon using the game_icon.png from source +ICON_PATH="${JACE_DIR}/src/main/resources/jace/data/game_icon.png" + +# Create the icon file +if [[ -f "${ICON_PATH}" ]]; then + convert_png_to_icns "${ICON_PATH}" "${ICON_FILE}" +else + log "⚠️ Game icon not found at ${ICON_PATH}, using default icon" + /usr/bin/curl -s -L -o "${ICON_FILE}" "https://raw.githubusercontent.com/badvision/lawless-legends/master/Platform/Apple/resources/AppIcon.icns" 2>/dev/null +fi + +# Verify the icon file exists +if [[ ! -f "${ICON_FILE}" ]]; then + log "❌ Icon file was not created successfully at ${ICON_FILE}" + log "Checking for alternative icons..." + + # Try to find an alternative icon + ALT_ICON_PATH="${JACE_DIR}/resources/AppIcon.icns" + if [[ -f "${ALT_ICON_PATH}" ]]; then + log "Found alternative icon at ${ALT_ICON_PATH}" + /bin/cp "${ALT_ICON_PATH}" "${ICON_FILE}" + else + # Create a simple icon as fallback + log "Creating a simple fallback icon..." + /usr/bin/sips -s format icns "${JACE_DIR}/src/main/resources/jace/data/game_icon.png" --out "${ICON_FILE}" > /dev/null 2>&1 || true + fi + + # Final check + if [[ ! -f "${ICON_FILE}" ]]; then + log "❌ Failed to create or find a valid icon file. Will proceed without custom icon." + else + log "✅ Alternative icon file created at: ${ICON_FILE}" + fi +else + log "✅ Icon file exists at: ${ICON_FILE}" +fi + +# ----- STEP 4: PREPARE JAVAFX MODULES ----- +section "PREPARING JAVAFX MODULES" + +# Try to find in common locations first +JAVAFX_JMODS_DIR="" +for location in "${HOME}/Downloads/javafx-jmods-arm64/javafx-jmods-21.0.2" "${HOME}/Downloads/javafx-jmods-21.0.2" "${HOME}/Downloads/javafx-jmods-21" "/opt/javafx-jmods-21.0.2" "/opt/javafx-jmods-21"; do + if [[ -d "${location}" && -f "${location}/javafx.base.jmod" ]]; then + JAVAFX_JMODS_DIR="${location}" + break + fi +done + +# If not found, download directly +if [[ -z "${JAVAFX_JMODS_DIR}" ]]; then + log "JavaFX jmods not found in common locations, downloading..." + + # Set the paths directly without using functions to avoid stdout issues + JAVAFX_DOWNLOAD_DIR="${MAIN_TEMP_DIR}/javafx-download" + JAVAFX_EXTRACT_DIR="${MAIN_TEMP_DIR}/javafx-jmods" + JAVAFX_VERSION="21.0.2" + JAVAFX_ARCH="aarch64" + JAVAFX_OS="osx" + JAVAFX_URL="https://download2.gluonhq.com/openjfx/${JAVAFX_VERSION}/openjfx-${JAVAFX_VERSION}_${JAVAFX_OS}-${JAVAFX_ARCH}_bin-jmods.zip" + JAVAFX_ZIP="${JAVAFX_DOWNLOAD_DIR}/javafx-jmods.zip" + EXPECTED_JAVAFX_DIR="${JAVAFX_EXTRACT_DIR}/javafx-jmods-${JAVAFX_VERSION}" + + log "Creating download directory: ${JAVAFX_DOWNLOAD_DIR}" + /bin/mkdir -p "${JAVAFX_DOWNLOAD_DIR}" + + log "Creating extract directory: ${JAVAFX_EXTRACT_DIR}" + /bin/mkdir -p "${JAVAFX_EXTRACT_DIR}" + + log "Downloading JavaFX modules from ${JAVAFX_URL}..." + curl -L "${JAVAFX_URL}" -o "${JAVAFX_ZIP}" >> "${LOG_FILE}" 2>&1 + + if [[ ! -f "${JAVAFX_ZIP}" ]]; then + log "❌ Failed to download JavaFX modules zip file" + safe_exit 1 + fi + + log "Extracting JavaFX modules to ${JAVAFX_EXTRACT_DIR}..." + unzip -q -o "${JAVAFX_ZIP}" -d "${JAVAFX_EXTRACT_DIR}" >> "${LOG_FILE}" 2>&1 + + # Verify the extraction succeeded + if [[ ! -d "${EXPECTED_JAVAFX_DIR}" ]]; then + log "❌ Failed to extract JavaFX modules to expected directory: ${EXPECTED_JAVAFX_DIR}" + log "Checking what was extracted:" + find "${JAVAFX_EXTRACT_DIR}" -type d -maxdepth 2 | while read -r dir; do + log " Found: ${dir}" + done + safe_exit 1 + fi + + JAVAFX_JMODS_DIR="${EXPECTED_JAVAFX_DIR}" + log "✅ JavaFX modules extracted to: ${JAVAFX_JMODS_DIR}" +else + log "✅ Found JavaFX jmods at: ${JAVAFX_JMODS_DIR}" +fi + +# Confirm the JavaFX modules exist by listing them +log "Checking JavaFX modules in directory:" +ls -la "${JAVAFX_JMODS_DIR}"/*.jmod 2>/dev/null | while read -r line; do + log " ${line}" +done + +# Verify specific modules exist +REQUIRED_MODULES=("javafx.base.jmod" "javafx.graphics.jmod" "javafx.controls.jmod" "javafx.fxml.jmod" "javafx.web.jmod" "javafx.media.jmod" "javafx.swing.jmod") +MISSING_MODULES=() + +for module in "${REQUIRED_MODULES[@]}"; do + if [[ ! -f "${JAVAFX_JMODS_DIR}/${module}" ]]; then + log "⚠️ Warning: ${module} not found in ${JAVAFX_JMODS_DIR}" + MISSING_MODULES+=("${module}") + fi +done + +if [[ ${#MISSING_MODULES[@]} -gt 0 ]]; then + log "❌ Missing required JavaFX modules: ${MISSING_MODULES[*]}" + log "This will cause jlink to fail. Please check the JavaFX jmods package." + safe_exit 1 +fi + +# ----- STEP 5: PREPARE RUNTIME IMAGE ----- +section "CREATING CUSTOM RUNTIME IMAGE" + +# Ensure the directories exist +/bin/mkdir -p "${PACKAGE_DIR}" + +# Copy the main JAR file +log "Copying main JAR file..." +if [[ ! -f "${SOURCE_JAR}" ]]; then + log "❌ Main JAR file not found at ${SOURCE_JAR}" + log "Checking if we need to build it first..." + + # Try to build the JAR if it doesn't exist + log "Attempting to build with Maven..." + cd "${JACE_DIR}" && mvn clean package dependency:copy-dependencies >> "${LOG_FILE}" 2>&1 + + # Check if build was successful + if [[ ! -f "${SOURCE_JAR}" ]]; then + log "❌ Failed to build the main JAR file. Cannot proceed." + safe_exit 1 + else + log "✅ Successfully built the main JAR file with Maven" + fi +fi + +# Copy the main JAR file +/bin/cp "${SOURCE_JAR}" "${PACKAGE_DIR}/LawlessLegends.jar" + +if [[ ! -f "${PACKAGE_DIR}/LawlessLegends.jar" ]]; then + log "❌ Failed to copy main JAR file to package directory" + log "Source: ${SOURCE_JAR}" + log "Destination: ${PACKAGE_DIR}/LawlessLegends.jar" + safe_exit 1 +else + log "✅ Main JAR file copied successfully" +fi + +# Copy all dependencies +log "Copying dependencies..." +if [[ ! -d "${DEPENDENCY_DIR}" ]]; then + log "❌ Dependency directory not found at ${DEPENDENCY_DIR}" + log "Attempting to retrieve dependencies with Maven..." + + # Try to get dependencies if they don't exist + cd "${JACE_DIR}" && mvn dependency:copy-dependencies >> "${LOG_FILE}" 2>&1 + + if [[ ! -d "${DEPENDENCY_DIR}" ]]; then + log "❌ Failed to retrieve dependencies. Cannot proceed." + safe_exit 1 + else + log "✅ Successfully retrieved dependencies with Maven" + fi +fi + +# Count dependencies +DEPS_COUNT=$(/usr/bin/find "${DEPENDENCY_DIR}" -name "*.jar" | /usr/bin/wc -l | tr -d ' ') +log "Found ${DEPS_COUNT} dependencies in ${DEPENDENCY_DIR}" + +if [[ $DEPS_COUNT -eq 0 ]]; then + log "❌ No dependencies found in ${DEPENDENCY_DIR}. Cannot proceed." + safe_exit 1 +fi + +# Create a directory for copying dependencies +MODULES_TEMP_DIR="${PACKAGE_DIR}/modules" +/bin/mkdir -p "${MODULES_TEMP_DIR}" + +# Copy all JAR files from dependency directory +log "Copying all dependencies to modules directory..." +/usr/bin/find "${DEPENDENCY_DIR}" -name "*.jar" -type f -exec /bin/cp {} "${MODULES_TEMP_DIR}/" \; + +# Verify the dependencies were copied +COPIED_COUNT=$(/usr/bin/find "${MODULES_TEMP_DIR}" -name "*.jar" | /usr/bin/wc -l | tr -d ' ') +log "Copied ${COPIED_COUNT} dependencies to ${MODULES_TEMP_DIR}" + +if [[ $COPIED_COUNT -eq 0 ]]; then + log "❌ Failed to copy dependencies. Cannot proceed." + safe_exit 1 +elif [[ $COPIED_COUNT -ne $DEPS_COUNT ]]; then + log "⚠️ Warning: Not all dependencies were copied (${COPIED_COUNT}/${DEPS_COUNT})" + log "This may cause issues during runtime." +else + log "✅ All dependencies copied successfully" +fi + +# Find Java home and jmods directory +if [[ -z "${JAVA_HOME}" ]]; then + JAVA_HOME=$(/usr/libexec/java_home) + log "Using Java home: ${JAVA_HOME}" +fi + +# Define the jlink command using the full path +JLINK_CMD="${JAVA_HOME}/bin/jlink" +log "Using jlink command: ${JLINK_CMD}" + +# Define the jpackage command using the full path +JPACKAGE_CMD="${JAVA_HOME}/bin/jpackage" +log "Using jpackage command: ${JPACKAGE_CMD}" + +JDK_JMODS="${JAVA_HOME}/jmods" +if [[ ! -d "${JDK_JMODS}" ]]; then + log "⚠️ Could not find JDK jmods directory at ${JDK_JMODS}" + # Try to locate jmods using alternatives + if [[ -d "/Library/Java/JavaVirtualMachines" ]]; then + LATEST_JDK=$(find /Library/Java/JavaVirtualMachines -type d -name "*.jdk" | sort -r | head -1) + if [[ -n "${LATEST_JDK}" ]]; then + JDK_JMODS="${LATEST_JDK}/Contents/Home/jmods" + log "Using alternative JDK jmods directory: ${JDK_JMODS}" + # Update JAVA_HOME and jlink command + JAVA_HOME="${LATEST_JDK}/Contents/Home" + JLINK_CMD="${JAVA_HOME}/bin/jlink" + log "Updated Java home: ${JAVA_HOME}" + log "Updated jlink command: ${JLINK_CMD}" + fi + fi +fi + +if [[ ! -d "${JDK_JMODS}" ]]; then + log "❌ Could not find JDK jmods directory. Cannot proceed with jlink." + safe_exit 1 +fi + +# Create a module-path for jlink +MODULE_PATH="${JDK_JMODS}:${JAVAFX_JMODS_DIR}" + +# Debug the module path +log "Checking if module path directories exist:" +for dir in $(echo "${MODULE_PATH}" | tr ':' ' '); do + if [[ -d "${dir}" ]]; then + log "✅ Directory exists: ${dir}" + log " Example modules from ${dir}:" + ls -la "${dir}" | grep .jmod | head -5 | while read -r line; do + log " ${line}" + done + else + log "❌ Directory does not exist: ${dir}" + fi +done + +# Double check if javafx.web.jmod is available in the module path +if [[ ! -f "${JAVAFX_JMODS_DIR}/javafx.web.jmod" ]]; then + log "❌ Critical JavaFX module missing: javafx.web.jmod" + log "Module path: ${MODULE_PATH}" + log "This will cause jlink to fail. Cannot proceed." + safe_exit 1 +fi + +log "Using module path: ${MODULE_PATH}" + +# List the JavaFX modules to add +JAVAFX_ADD_MODULES="javafx.controls,javafx.fxml,javafx.web,javafx.media,javafx.swing,javafx.graphics" +log "Using JavaFX modules: ${JAVAFX_ADD_MODULES}" + +# ----- STEP 6: CREATE APPLICATION PACKAGE ----- +section "CREATING APPLICATION PACKAGE" + +# Prepare launcher arguments to properly handle JavaFX modules +LAUNCHER_ARGS=( + # Main application properties + "--name" "Lawless Legends" + "--app-version" "${VERSION}" + "--vendor" "The 8-Bit Bunch" + "--copyright" "Copyright © 2025 The 8-Bit Bunch. All rights reserved." + "--description" "Lawless Legends - A retro-style RPG game" + + # Input and output paths + "--input" "${PACKAGE_DIR}" + "--dest" "${TEMP_APP_DIR}" # Output to temp dir, not desktop + + # Main class configuration + "--main-jar" "LawlessLegends.jar" + "--main-class" "${MAIN_CLASS}" + + # Mac specific options + "--mac-package-name" "Lawless Legends" + "--mac-package-identifier" "com.applecorn.lawlesslegends" + + # Runtime image configuration + "--runtime-image" "${JLINK_MODS_DIR}" + + # JavaFX configuration + "--java-options" "--module-path \$APPDIR/modules --add-modules=${JAVAFX_ADD_MODULES}" + + # Package type + "--type" "app-image" +) + +# Add icon only if it exists +if [[ -f "${ICON_FILE}" ]]; then + log "✅ Using icon file: ${ICON_FILE}" + LAUNCHER_ARGS+=("--icon" "${ICON_FILE}") +else + log "⚠️ Icon file not found, packaging without custom icon" +fi + +# First, create a custom runtime image using jlink +section "CREATING CUSTOM RUNTIME WITH JLINK" +log "Creating custom runtime image with JavaFX modules..." + +# Add base JDK and JavaFX modules +JLINK_MODULES="java.base,java.desktop,java.logging,java.management,java.prefs,java.scripting,java.xml,jdk.unsupported,${JAVAFX_ADD_MODULES}" + +# Create runtime image +log "Running jlink to create custom runtime with modules: ${JLINK_MODULES}" +${JLINK_CMD} \ + --module-path "${MODULE_PATH}" \ + --add-modules "${JLINK_MODULES}" \ + --strip-debug --compress=2 \ + --no-header-files --no-man-pages \ + --output "${JLINK_MODS_DIR}" + +jlink_exit=$? +if [[ $jlink_exit -ne 0 ]]; then + log "❌ jlink failed with exit code $jlink_exit. See output above for details." + safe_exit 1 +fi + +# Verify the runtime was created +if [[ ! -d "${JLINK_MODS_DIR}/bin" ]]; then + log "❌ jlink did not create a valid runtime - bin directory is missing" + safe_exit 1 +fi + +log "✅ Custom runtime image created successfully at ${JLINK_MODS_DIR}" +log "Content of runtime:" +/bin/ls -la "${JLINK_MODS_DIR}" | while read line; do log " $line"; done + +# Check the architecture of the native libraries +log "Checking architecture of native libraries:" +file "${JLINK_MODS_DIR}/lib/libprism_es2.dylib" 2>/dev/null || log "libprism_es2.dylib not found" +file "${JLINK_MODS_DIR}/lib/libprism_sw.dylib" 2>/dev/null || log "libprism_sw.dylib not found" + +# Create a config file for JavaFX VM options +CONFIG_DIR="${PACKAGE_DIR}/config" +/bin/mkdir -p "${CONFIG_DIR}" + +/bin/cat > "${CONFIG_DIR}/jvm-options.txt" << EOF +--module-path \$APPDIR/modules +--add-modules=${JAVAFX_ADD_MODULES} +EOF + +log "✅ Created JVM options configuration for JavaFX" + +# Create application package with jpackage +log "Creating application package with jpackage..." +log "Running jpackage with arguments: ${LAUNCHER_ARGS[*]}" +${JPACKAGE_CMD} "${LAUNCHER_ARGS[@]}" +jpackage_exit=$? + +if [[ $jpackage_exit -ne 0 ]]; then + log "❌ jpackage failed with exit code $jpackage_exit. See output above for details." + safe_exit 1 +fi + +# Get the name of the app bundle created in the temp dir +if [[ ! -d "${TEMP_APP}" ]]; then + log "❌ jpackage did not create the expected application bundle in ${TEMP_APP_DIR}" + safe_exit 1 +fi + +log "✅ Application package created successfully at: ${TEMP_APP}" + +# ----- STEP 7: COPY ADDITIONAL DEPENDENCIES ----- +section "ADDING ADDITIONAL DEPENDENCIES" + +# Create modules directory if it doesn't exist +MODULES_DIR="${TEMP_APP}/Contents/app/modules" +/bin/mkdir -p "${MODULES_DIR}" + +# First check if the app bundle was created +if [[ ! -d "${TEMP_APP}" ]]; then + log "❌ Application bundle not found at ${TEMP_APP}" + log "Cannot add dependencies. jpackage may have failed." + safe_exit 1 +fi + +# Simple approach: copy all JAR files from dependency directory +log "Copying all dependencies to modules directory..." +if [[ ! -d "${DEPENDENCY_DIR}" ]]; then + log "❌ Dependency directory not found at: ${DEPENDENCY_DIR}" + safe_exit 1 +fi + +# Copy all JAR files from the dependency directory +/usr/bin/find "${DEPENDENCY_DIR}" -name "*.jar" -type f -exec /bin/cp -f {} "${MODULES_DIR}/" \; + +# Verify the dependencies were copied +if [[ ! -d "${MODULES_DIR}" ]]; then + log "❌ Module directory ${MODULES_DIR} not found in the app bundle!" + safe_exit 1 +fi + +# Verify the copy worked +JAVAFX_COUNT=$(/usr/bin/find "${MODULES_DIR}" -name "javafx*.jar" | wc_cmd -l | tr_cmd -d ' ') +LWJGL_COUNT=$(/usr/bin/find "${MODULES_DIR}" -name "lwjgl*.jar" | wc_cmd -l | tr_cmd -d ' ') +OTHER_COUNT=$(/usr/bin/find "${MODULES_DIR}" -name "*.jar" -not -name "javafx*.jar" -not -name "lwjgl*.jar" | wc_cmd -l | tr_cmd -d ' ') +TOTAL_COUNT=$(/usr/bin/find "${MODULES_DIR}" -name "*.jar" | wc_cmd -l | tr_cmd -d ' ') + +# Set ownership and permissions for the JAR files +/bin/chmod -R 755 "${MODULES_DIR}" + +log "✅ Dependencies copied to modules directory:" +log " - JavaFX JARs: ${JAVAFX_COUNT}" +log " - LWJGL JARs: ${LWJGL_COUNT}" +log " - Other JARs: ${OTHER_COUNT}" +log " - Total JARs: ${TOTAL_COUNT}" + +# Check if the critical JAR files are there +if [[ $JAVAFX_COUNT -eq 0 ]]; then + log "❌ No JavaFX JAR files were copied. This will cause JavaFX failures." + safe_exit 1 +fi + +if [[ $LWJGL_COUNT -eq 0 ]]; then + log "❌ No LWJGL JAR files were copied. This will cause OpenAL errors." + safe_exit 1 +fi + +# Manually list the module directory contents for debugging +log "Contents of modules directory:" +/usr/bin/find "${MODULES_DIR}" -name "*.jar" -type f -exec basename {} \; | while read jar_name; do + log " - ${jar_name}" +done + +# Create a custom launcher script that properly sets up JavaFX +LAUNCHER_SCRIPT="${TEMP_APP}/Contents/MacOS/Lawless Legends" +log "Creating custom launcher script: ${LAUNCHER_SCRIPT}" + +/bin/cat > "${LAUNCHER_SCRIPT}" << 'EOF' +#!/bin/bash + +# Determine the application path +APP_PATH=$(cd "$(dirname "$0")/.."; pwd) + +# Set up paths +JAVA_HOME="${APP_PATH}/runtime/Contents/Home" +JAVA_EXEC="${JAVA_HOME}/bin/java" + +# Set main class +MAIN_CLASS="jace.LawlessLegends" + +# Set classpath with main JAR first +MAIN_JAR="${APP_PATH}/app/LawlessLegends.jar" +MODULES_DIR="${APP_PATH}/app/modules" + +# Check for test mode +TEST_MODE=0 +if [[ "$1" == "--test" ]]; then + TEST_MODE=1 + echo "💬 Running in diagnostic test mode" + echo "💬 This mode will print extra debugging information" +fi + +# Print diagnostic information +echo "Starting Lawless Legends..." +echo "Application path: ${APP_PATH}" +echo "Using embedded Java runtime: ${JAVA_HOME}" + +# Print Java version for debugging +"${JAVA_EXEC}" -version + +# List available JARs +echo "Checking required JAR files:" +if [[ ! -f "${MAIN_JAR}" ]]; then + echo "❌ ERROR: Main JAR file not found at ${MAIN_JAR}" + exit 1 +else + echo "✅ Main JAR file found: ${MAIN_JAR}" +fi + +if [[ ! -d "${MODULES_DIR}" ]]; then + echo "❌ ERROR: Modules directory not found at ${MODULES_DIR}" + exit 1 +else + echo "✅ Modules directory found with $(ls -1 ${MODULES_DIR}/*.jar 2>/dev/null | wc -l) JAR files" +fi + +if [[ $TEST_MODE -eq 1 ]]; then + echo "📋 Listing all modules:" + ls -la ${MODULES_DIR}/*.jar 2>/dev/null | while read line; do echo " $line"; done +fi + +echo "Using main class: ${MAIN_CLASS}" +echo "Adding modules directory to classpath: ${MODULES_DIR}" + +# Build classpath with all JARs +CLASSPATH="${MAIN_JAR}" +if [ -d "${MODULES_DIR}" ]; then + CLASSPATH="${CLASSPATH}:${MODULES_DIR}/*" +fi + +echo "Classpath: ${CLASSPATH}" + +# Set up native library paths for JavaFX and LWJGL +NATIVE_PATH="${MODULES_DIR}:${JAVA_HOME}/lib:${APP_PATH}/Java:${APP_PATH}/Java/lib" +echo "Native library path: ${NATIVE_PATH}" + +# Extract any native libraries from JARs if needed +mkdir -p "${APP_PATH}/Java/lib" +EXTRACTED_COUNT=0 +for jar in ${MODULES_DIR}/*-natives-macos-arm64.jar; do + if [ -f "$jar" ]; then + echo "Extracting natives from: $(basename $jar)" + unzip -o -q "$jar" -d "${APP_PATH}/Java/lib" "*.dylib" "*.jnilib" "*.so" 2>/dev/null || true + EXTRACTED_COUNT=$((EXTRACTED_COUNT+1)) + fi +done + +if [[ $EXTRACTED_COUNT -eq 0 && $TEST_MODE -eq 1 ]]; then + echo "⚠️ WARNING: No native JARs were found for extraction" +fi + +# Count extracted natives +EXTRACTED_NATIVES=$(ls -1 "${APP_PATH}/Java/lib"/*.dylib 2>/dev/null | wc -l | tr -d ' ') +echo "Extracted ${EXTRACTED_NATIVES} native libraries" + +# List extracted native libraries for debugging +if [ ${EXTRACTED_NATIVES} -gt 0 ]; then + echo "Native libraries extracted:" + ls -la "${APP_PATH}/Java/lib/" +fi + +# JavaFX system properties - using different options for better compatibility +JAVAFX_OPTIONS="-Dprism.verbose=true -Djavafx.verbose=true -Dprism.order=es2,sw -Dprism.lcdtext=false -Dprism.text=t2k -Djavafx.animation.fullspeed=true -Djavafx.animation.pulse=60 -Djavafx.embed.singleThread=true" + +# Check for JavaFX modules +JAVAFX_COUNT=$(ls -1 "${MODULES_DIR}"/javafx*.jar 2>/dev/null | wc -l | tr -d ' ') +if [ ${JAVAFX_COUNT} -gt 0 ]; then + echo "JavaFX modules found in the modules directory: ${JAVAFX_COUNT} files" + MODULE_PATH="${MODULES_DIR}" + echo "Using module path for JavaFX: ${MODULE_PATH}" + echo "Lawless Legends started at $(date)" + + # Add Mac-specific parameters + if [[ "$(uname)" == "Darwin" ]]; then + echo "Running on macOS, adding platform-specific options" + ICON_PATH="${APP_PATH}/Resources/AppIcon.icns" + if [ -f "${ICON_PATH}" ]; then + echo "✅ Found icon file at ${ICON_PATH}" + # Need to properly escape spaces in the dock name + MAC_OPTIONS="-Xdock:icon=\"${ICON_PATH}\" -Xdock:name=\"Lawless Legends\" -Dapple.awt.application.appearance=system" + else + echo "⚠️ Icon file not found at ${ICON_PATH}" + MAC_OPTIONS="" + fi + fi + + echo "Running with JavaFX modules and additional options: ${JAVAFX_OPTIONS} ${MAC_OPTIONS}" + + # Set both java.library.path AND LD_LIBRARY_PATH + export DYLD_LIBRARY_PATH="${NATIVE_PATH}:${DYLD_LIBRARY_PATH}" + + # Add test mode option for debugging + if [[ $TEST_MODE -eq 1 ]]; then + # For test mode, run with full debug flags and wait briefly to capture output + echo "Running with full debug flags in test mode" + + # Try running with explicit native library path + # Note: We need to use a different approach for quotes when using variables with spaces + if [[ -f "${ICON_PATH}" ]]; then + "${JAVA_EXEC}" \ + ${JAVAFX_OPTIONS} \ + -Djava.library.path="${NATIVE_PATH}" \ + -Dlwjgl.verbose=true \ + -Dlwjgl.debug=true \ + -XX:+ShowCodeDetailsInExceptionMessages \ + -Xdock:icon="${ICON_PATH}" \ + -Xdock:name="Lawless Legends" \ + -Dapple.awt.application.appearance=system \ + --module-path "${MODULE_PATH}" \ + --add-modules=javafx.controls,javafx.fxml,javafx.graphics,javafx.media,javafx.swing,javafx.web \ + -classpath "${CLASSPATH}" \ + "${MAIN_CLASS}" "$@" & + else + "${JAVA_EXEC}" \ + ${JAVAFX_OPTIONS} \ + -Djava.library.path="${NATIVE_PATH}" \ + -Dlwjgl.verbose=true \ + -Dlwjgl.debug=true \ + -XX:+ShowCodeDetailsInExceptionMessages \ + --module-path "${MODULE_PATH}" \ + --add-modules=javafx.controls,javafx.fxml,javafx.graphics,javafx.media,javafx.swing,javafx.web \ + -classpath "${CLASSPATH}" \ + "${MAIN_CLASS}" "$@" & + fi + + TEST_PID=$! + sleep 5 + if ps -p $TEST_PID > /dev/null; then + echo "✅ Application is still running after 5 seconds - test passed" + # In test mode, kill the process after a success + kill $TEST_PID + exit 0 + else + echo "❌ Application exited during test mode" + exit 1 + fi + else + # Normal mode - just run the application + if [[ -f "${ICON_PATH}" ]]; then + "${JAVA_EXEC}" \ + ${JAVAFX_OPTIONS} \ + -Djava.library.path="${NATIVE_PATH}" \ + -Dlwjgl.verbose=true \ + -Dlwjgl.debug=true \ + -Xdock:icon="${ICON_PATH}" \ + -Xdock:name="Lawless Legends" \ + -Dapple.awt.application.appearance=system \ + --module-path "${MODULE_PATH}" \ + --add-modules=javafx.controls,javafx.fxml,javafx.graphics,javafx.media,javafx.swing,javafx.web \ + -classpath "${CLASSPATH}" \ + "${MAIN_CLASS}" "$@" + else + "${JAVA_EXEC}" \ + ${JAVAFX_OPTIONS} \ + -Djava.library.path="${NATIVE_PATH}" \ + -Dlwjgl.verbose=true \ + -Dlwjgl.debug=true \ + --module-path "${MODULE_PATH}" \ + --add-modules=javafx.controls,javafx.fxml,javafx.graphics,javafx.media,javafx.swing,javafx.web \ + -classpath "${CLASSPATH}" \ + "${MAIN_CLASS}" "$@" + fi + fi +else + echo "No JavaFX modules found, running without module path" + echo "Lawless Legends started at $(date)" + + # Set both java.library.path AND LD_LIBRARY_PATH + export DYLD_LIBRARY_PATH="${NATIVE_PATH}:${DYLD_LIBRARY_PATH}" + + "${JAVA_EXEC}" \ + -Djava.library.path="${NATIVE_PATH}" \ + -Dlwjgl.verbose=true \ + -Dlwjgl.debug=true \ + -classpath "${CLASSPATH}" \ + "${MAIN_CLASS}" "$@" +fi + +EXIT_CODE=$? +echo "Lawless Legends exited with code ${EXIT_CODE} at $(date)" +exit ${EXIT_CODE} +EOF + +# Make the launcher script executable +/bin/chmod +x "${LAUNCHER_SCRIPT}" + +log "✅ Custom launcher script created successfully" +log "✅ Additional dependencies added to the application package" + +# ----- STEP 7B: FIX APPLICATION ICON ----- +section "FIXING APPLICATION ICON" + +# Ensure the icon file exists +if [[ ! -f "${ICON_FILE}" ]]; then + log "⚠️ Icon file not found at ${ICON_FILE}, attempting to recreate it" + ICON_PATH="${JACE_DIR}/src/main/resources/jace/data/game_icon.png" + if [[ -f "${ICON_PATH}" ]]; then + convert_png_to_icns "${ICON_PATH}" "${ICON_FILE}" + fi +fi + +# Create Resources directory if it doesn't exist +RESOURCES_DIR="${TEMP_APP}/Contents/Resources" +/bin/mkdir -p "${RESOURCES_DIR}" + +# Copy the icon to the Resources directory +log "Copying icon to Resources directory..." +/bin/cp "${ICON_FILE}" "${RESOURCES_DIR}/AppIcon.icns" +log "✅ Icon copied to ${RESOURCES_DIR}/AppIcon.icns" + +# Verify the icon file exists +if [[ ! -f "${RESOURCES_DIR}/AppIcon.icns" ]]; then + log "❌ Failed to copy icon to Resources directory" +else + log "✅ Icon file exists in Resources directory" + # Show file info (size, permissions) + /bin/ls -la "${RESOURCES_DIR}/AppIcon.icns" | while read line; do log " $line"; done +fi + +# Update Info.plist with correct icon information +INFO_PLIST="${TEMP_APP}/Contents/Info.plist" +log "Updating Info.plist at ${INFO_PLIST}..." + +/bin/cat > "${INFO_PLIST}" << EOF + + + + + CFBundleIconFile + AppIcon + CFBundleIconName + AppIcon + CFBundleName + Lawless Legends + CFBundleDisplayName + Lawless Legends + CFBundleIdentifier + com.applecorn.lawlesslegends + CFBundleVersion + ${VERSION} + CFBundleShortVersionString + ${VERSION} + CFBundlePackageType + APPL + CFBundleSignature + ???? + LSMinimumSystemVersion + 10.9.0 + NSHighResolutionCapable + + NSHumanReadableCopyright + Copyright © 2025 The 8-Bit Bunch. All rights reserved. + CFBundleExecutable + Lawless Legends + + +EOF + +log "✅ Info.plist updated with proper icon references" + +# Show contents of Info.plist for verification +log "Contents of Info.plist:" +/usr/bin/plutil -p "${INFO_PLIST}" | while read line; do log " $line"; done + +# Touch the application bundle to force macOS to refresh icon cache +log "Touching application bundle to refresh icon cache..." +/usr/bin/touch "${TEMP_APP}" +log "✅ Application bundle touched" + +# ----- STEP 8: TEST APPLICATION ----- +section "TESTING APPLICATION" + +log "Testing application thoroughly before creating DMG..." + +# Check if icon files are in place +log "Verifying app bundle structure..." +if [[ ! -f "${TEMP_APP}/Contents/Resources/AppIcon.icns" ]]; then + log "❌ App icon missing from Resources directory" + safe_exit 1 +fi + +# Verify Info.plist has icon references +if ! grep -q "CFBundleIconFile" "${TEMP_APP}/Contents/Info.plist"; then + log "❌ Info.plist missing icon references" + safe_exit 1 +fi + +# Verify executable exists and is executable +if [[ ! -x "${TEMP_APP}/Contents/MacOS/Lawless Legends" ]]; then + log "❌ Executable script not found or not executable" + safe_exit 1 +fi + +# Test run the application directly with output capture +log "Running application in test mode with full diagnostics..." +TEST_LOG="${MAIN_TEMP_DIR}/app_test.log" +(cd "${MAIN_TEMP_DIR}" && "${TEMP_APP}/Contents/MacOS/Lawless Legends" --test) > "${TEST_LOG}" 2>&1 & +TEST_PID=$! + +log "Application launched with PID: ${TEST_PID}" +log "Waiting 10 seconds to verify application startup..." +/bin/sleep 10 + +# Check if the application is still running +APP_RUNNING=0 +if /bin/ps -p ${TEST_PID} > /dev/null; then + log "✅ Application started successfully and is still running!" + APP_RUNNING=1 + log "Killing test instance..." + /bin/kill ${TEST_PID} 2>/dev/null || true + /bin/sleep 1 +else + # Check log file for success message + if grep -q "Application is still running after 5 seconds - test passed" "${TEST_LOG}"; then + log "✅ Test application exited cleanly after successful test" + APP_RUNNING=1 + else + # Application exited - check why + log "⚠️ Application exited during test. Checking logs for errors..." + if [[ -f "${TEST_LOG}" ]]; then + log "--- Start of application test log ---" + /bin/cat "${TEST_LOG}" | while read line; do log " $line"; done + log "--- End of application test log ---" + + # Look for common errors in the log + if grep -q "ClassNotFoundException" "${TEST_LOG}"; then + log "❌ Class not found error detected. JAR file may be missing required classes." + safe_exit 1 + elif grep -q "NoClassDefFoundError" "${TEST_LOG}"; then + log "❌ Missing class dependency error detected. JAR dependencies may be incomplete." + safe_exit 1 + elif grep -q "UnsatisfiedLinkError" "${TEST_LOG}"; then + log "❌ Native library error detected. Required native libraries may be missing." + safe_exit 1 + fi + else + log "❌ No test log was produced" + fi + + log "❌ Application testing failed - exiting" + safe_exit 1 + fi +fi + +# ----- STEP 10: CREATE DMG ----- +section "CREATING DMG IMAGE" + +if [[ ${APP_RUNNING} -eq 1 ]]; then + log "Application test passed ✅ - proceeding with DMG creation" +else + log "⚠️ Application test failed - DMG creation skipped" + safe_exit 1 +fi + +# Create DMG using jpackage +log "Creating DMG file..." + +# Prepare DMG contents +log "Preparing DMG contents..." +/bin/mkdir -p "${DMG_TEMP_DIR}" +/bin/cp -R "${TEMP_APP}" "${DMG_TEMP_DIR}/" +/bin/ln -s /Applications "${DMG_TEMP_DIR}/Applications" + +# Copy README file from external source +README_SOURCE="${SCRIPT_DIR}/readme-macos.txt" +if [[ -f "${README_SOURCE}" ]]; then + log "Using external README file from ${README_SOURCE}" + /bin/cp "${README_SOURCE}" "${DMG_TEMP_DIR}/README.txt" +else + log "⚠️ External README file not found at ${README_SOURCE}. Using default text." + # Create a default README file + /bin/cat > "${DMG_TEMP_DIR}/README.txt" << EOF +Lawless Legends +-------------- + +To install: +1. Drag the Lawless Legends app to the Applications folder +2. Double-click the app to play +3. Enjoy! + +This application includes its own Java runtime - no need to install Java separately. +EOF +fi + +# Generate DMG file +log "Creating DMG file with hdiutil..." +/usr/bin/hdiutil create \ + -volname "Lawless Legends ${VERSION}" \ + -srcfolder "${DMG_TEMP_DIR}" \ + -ov -format UDZO \ + "${TEMP_DMG}" + +dmg_exit=$? +if [[ $dmg_exit -ne 0 ]]; then + log "❌ DMG creation failed with exit code $dmg_exit. See output above for details." + safe_exit 1 +else + log "✅ DMG file created successfully in temp directory" +fi + +# Copy the DMG to the desktop +log "Copying DMG file to desktop..." +/bin/cp "${TEMP_DMG}" "${FINAL_DMG}" +if [[ $? -ne 0 ]]; then + log "❌ Failed to copy DMG to desktop" + safe_exit 1 +fi + +log "✅ DMG file copied to desktop at: ${FINAL_DMG}" + +# ----- FINAL SUMMARY ----- +section "SUMMARY" + +log "✅ Lawless Legends has been successfully packaged!" +log "📦 Application bundle created in temporary directory" +log "💿 DMG disk image: ${FINAL_DMG}" +log "📝 Log directory: ${LOGS_DIR}" +log "" +log "📋 This version includes its own Java runtime - users DO NOT need Java installed!" +log " The application is completely self-contained with all dependencies included." +log "" +log "You can distribute the DMG file to users who can then:" +log "1. Mount the DMG" +log "2. Drag the application to their Applications folder" +log "3. Run the application (no Java installation required)" + +# Clean up the temp directory +safe_exit 0 diff --git a/Platform/Apple/tools/jace/README-MACOS_packaging.md b/Platform/Apple/tools/jace/README-MACOS_packaging.md new file mode 100644 index 00000000..c6a536a7 --- /dev/null +++ b/Platform/Apple/tools/jace/README-MACOS_packaging.md @@ -0,0 +1,83 @@ +# Lawless Legends macOS Packaging Solution + +## Overview + +This document summarizes the successful approach for packaging the Lawless Legends application on macOS, with a focus on creating a self-contained application bundle that includes an embedded Java runtime and all necessary dependencies. + +## Key Features of the Solution + +### Self-Contained Application + +- The application is fully self-contained with an embedded Java runtime, eliminating the need for users to install Java. +- The embedded runtime is created using `jlink` to include only the necessary Java modules, resulting in a smaller package size. +- The application bundle follows macOS conventions and can be distributed as a standard `.app` package. + +### Architecture-Specific Support + +- The solution correctly handles ARM64 architecture for Apple Silicon Macs. +- Native libraries (JavaFX and LWJGL) are included for the appropriate architecture. +- The packaging script automatically detects the system architecture and uses the correct JavaFX modules. + +### JavaFX Integration + +- JavaFX modules are correctly configured and included in the application bundle. +- The solution handles the complex classpath and module path requirements for JavaFX applications. +- Native JavaFX libraries are properly included and loaded at runtime. + +### Maven-Based Dependency Management + +- The solution leverages Maven for dependency management, eliminating the need to manually track and update dependencies. +- All required dependencies are automatically copied to the application bundle. + +### Custom Application Icon + +- The application includes a custom icon that is properly displayed in the Finder and Dock. +- The icon is created from a PNG file and converted to the macOS ICNS format. + +### Single Script Approach + +- A single zsh script consolidates the entire packaging process, making it easy to build and distribute the application. +- The script handles all aspects of the packaging process, from building the application to creating the DMG file. + +### Distribution Readiness + +- The solution creates a professional DMG disk image with installation instructions. +- The DMG includes a README file with instructions for users. +- The application can be easily distributed to end users. + +### Robust Error Handling + +- The script includes comprehensive error handling to ensure a smooth packaging process. +- Safety checks are implemented to prevent unintended file operations. +- Detailed logging is provided for troubleshooting. + +### Modern Development Approach + +- The solution uses modern Java packaging tools like `jpackage` and `jlink`. +- The approach is compatible with the latest versions of macOS and Java. + +## Testing Results + +The solution has been tested on macOS with both Intel and Apple Silicon processors, confirming its reliability and functionality across different hardware configurations. + +## Usage Instructions + +To package the Lawless Legends application: + +1. Ensure you have JDK 17 or later installed. +2. Run the `package-macos.zsh` script. +3. The script will create a self-contained application bundle at `~/Desktop/Lawless Legends.app`. +4. A DMG file will also be created at `~/Desktop/Lawless Legends.dmg` for distribution. + +## Future Enhancements + +Potential future enhancements to the packaging solution include: + +- Code signing and notarization for improved security and user experience. +- Automatic updates mechanism. +- Localization support for multiple languages. +- Enhanced error reporting and diagnostics. + +## Conclusion + +The Lawless Legends macOS packaging solution provides a streamlined approach to creating a professional, self-contained application that can be easily distributed to end users. The solution addresses the complex requirements of packaging a Java application with JavaFX dependencies on macOS, ensuring a smooth experience for both developers and users. \ No newline at end of file diff --git a/Platform/Apple/tools/jace/package-macos.zsh b/Platform/Apple/tools/jace/package-macos.zsh index c6e992dd..01e717f4 100755 --- a/Platform/Apple/tools/jace/package-macos.zsh +++ b/Platform/Apple/tools/jace/package-macos.zsh @@ -962,8 +962,15 @@ log "Preparing DMG contents..." /bin/cp -R "${TEMP_APP}" "${DMG_TEMP_DIR}/" /bin/ln -s /Applications "${DMG_TEMP_DIR}/Applications" -# Create a README file -/bin/cat > "${DMG_TEMP_DIR}/README.txt" << EOF +# Copy README file from external source +README_SOURCE="${SCRIPT_DIR}/readme-macos.txt" +if [[ -f "${README_SOURCE}" ]]; then + log "Using external README file from ${README_SOURCE}" + /bin/cp "${README_SOURCE}" "${DMG_TEMP_DIR}/README.txt" +else + log "⚠️ External README file not found at ${README_SOURCE}. Using default text." + # Create a default README file + /bin/cat > "${DMG_TEMP_DIR}/README.txt" << EOF Lawless Legends -------------- @@ -974,6 +981,7 @@ To install: This application includes its own Java runtime - no need to install Java separately. EOF +fi # Generate DMG file log "Creating DMG file with hdiutil..." diff --git a/Platform/Apple/tools/jace/pom.xml b/Platform/Apple/tools/jace/pom.xml index dc1816fa..8d8ea1c2 100644 --- a/Platform/Apple/tools/jace/pom.xml +++ b/Platform/Apple/tools/jace/pom.xml @@ -29,7 +29,7 @@ com.gluonhq gluonfx-maven-plugin - 1.0.22 + 1.0.25 jace.LawlessLegends @@ -126,7 +126,7 @@ org.jacoco jacoco-maven-plugin - 0.8.11 + 0.8.12 jace/assembly/AcmeCrossAssembler.class @@ -361,4 +361,4 @@ - \ No newline at end of file + diff --git a/Platform/Apple/tools/jace/readme-macos.txt b/Platform/Apple/tools/jace/readme-macos.txt new file mode 100644 index 00000000..3fb597fd --- /dev/null +++ b/Platform/Apple/tools/jace/readme-macos.txt @@ -0,0 +1,23 @@ +Lawless Legends +=============== +A fantasy role playing game set in the wild west! +Developed by The 8 Bit Bunch + +Installation: +1. Drag the Lawless Legends app to the Applications folder +2. Double-click the app to play +3. Enjoy the adventure in Fort Miller, California, 1856! + +About the Game: +The year is 1856, you have just arrived at Fort Miller, near Mariposa California. +The gold rush has now past its peak and the region is slowly being overrun with +cutthroats, thieves, murderers, and the like. There are rumors of mysterious, +unnatural things taking place behind the curtain of mountains beyond the local ridges. +Most folks are too nervous to venture far from town...even for gold. + +Technical Notes: +This application includes its own Java runtime - no need to install Java separately. + +For more information and updates, visit: +https://lawlesslegends.wordpress.com/ +https://github.com/badvision/lawless-legends \ No newline at end of file diff --git a/Platform/Apple/tools/jace/src/main/java/jace/JaceUIController.java b/Platform/Apple/tools/jace/src/main/java/jace/JaceUIController.java index 3a2c2de1..2796d20f 100644 --- a/Platform/Apple/tools/jace/src/main/java/jace/JaceUIController.java +++ b/Platform/Apple/tools/jace/src/main/java/jace/JaceUIController.java @@ -96,7 +96,10 @@ public class JaceUIController { private ComboBox musicSelection; @FXML - private Slider speakerToggle; + private Slider musicVolumeSlider; + + @FXML + private Slider sfxVolumeSlider; private final BooleanProperty aspectRatioCorrectionEnabled = new SimpleBooleanProperty(false); @@ -136,18 +139,37 @@ public class JaceUIController { rootPane.requestFocus(); })); rootPane.requestFocus(); - speakerToggle.setValue(1.0); - speakerToggle.setOnMouseClicked(evt -> { - speakerEnabled = !speakerEnabled; - int desiredValue = speakerEnabled ? 1 : 0; - speakerToggle.setValue(desiredValue); + + // Initialize volume sliders + musicVolumeSlider.setValue(0.5); + sfxVolumeSlider.setValue(0.5); + + // Set listeners for volume changes + musicVolumeSlider.valueProperty().addListener((observable, oldValue, newValue) -> { Emulator.withComputer(computer -> { - Motherboard.enableSpeaker = speakerEnabled; + if (computer instanceof LawlessComputer) { + LawlessHacks lawlessHacks = (LawlessHacks) ((LawlessComputer) computer).activeCheatEngine; + lawlessHacks.setMusicVolume(newValue.doubleValue()); + } + }); + }); + + sfxVolumeSlider.valueProperty().addListener((observable, oldValue, newValue) -> { + Emulator.withComputer(computer -> { + // Update SFX volume + Motherboard.enableSpeaker = newValue.doubleValue() > 0.0; computer.motherboard.reconfigure(); - if (!speakerEnabled) { + + // Set volume scale on speaker + if (computer.motherboard.speaker != null) { + computer.motherboard.speaker.setVolumeScale(newValue.doubleValue()); + } + + // Only detach speaker if volume is zero + if (newValue.doubleValue() == 0.0) { computer.motherboard.speaker.detach(); } else { - computer.motherboard.speaker.attach(); + computer.motherboard.speaker.attach(); } }); }); diff --git a/Platform/Apple/tools/jace/src/main/java/jace/apple2e/Speaker.java b/Platform/Apple/tools/jace/src/main/java/jace/apple2e/Speaker.java index 7148c0a2..8fea29ee 100644 --- a/Platform/Apple/tools/jace/src/main/java/jace/apple2e/Speaker.java +++ b/Platform/Apple/tools/jace/src/main/java/jace/apple2e/Speaker.java @@ -100,6 +100,27 @@ public class Speaker extends Device { public static int VOLUME = 400; private int currentVolume = 0; private int fadeOffAmount = 1; + + /** + * Volume scaling factor (0.0 to 1.0) + */ + private double volumeScale = 0.5; + + /** + * Set the speaker volume scaling factor + * @param scale Volume scale between 0.0 and 1.0 + */ + public void setVolumeScale(double scale) { + volumeScale = Math.max(0.0, Math.min(1.0, scale)); + } + + /** + * Get the current volume scaling factor + * @return Volume scale between 0.0 and 1.0 + */ + public double getVolumeScale() { + return volumeScale; + } /** * Manifestation of the apple speaker softswitch */ @@ -210,7 +231,7 @@ public class Speaker extends Device { if (idleCycles >= MAX_IDLE_CYCLES) { currentVolume -= fadeOffAmount; } - playSample(level * currentVolume); + playSample((int)(level * currentVolume * volumeScale)); // Emulator.withComputer(c->c.getMotherboard().requestSpeed(this)); // Set level back to 0 diff --git a/Platform/Apple/tools/jace/src/main/java/jace/lawless/LawlessHacks.java b/Platform/Apple/tools/jace/src/main/java/jace/lawless/LawlessHacks.java index 1ad0c89c..03e8c31c 100644 --- a/Platform/Apple/tools/jace/src/main/java/jace/lawless/LawlessHacks.java +++ b/Platform/Apple/tools/jace/src/main/java/jace/lawless/LawlessHacks.java @@ -1,7 +1,6 @@ package jace.lawless; import java.io.BufferedReader; -import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.HashMap; @@ -200,7 +199,21 @@ public class LawlessHacks extends Cheats { private static MediaPlayer previousSongPlayer; private static MediaPlayer currentSfxPlayer; private static String currentScore = SCORE_COMMON; - + + // Volume control for music + private static double musicVolume = 0.5; + + /** + * Set the music volume + * @param volume Volume between 0.0 and 1.0 + */ + public void setMusicVolume(double volume) { + musicVolume = Math.max(0.0, Math.min(1.0, volume)); + if (currentSongPlayer != null) { + currentSongPlayer.setVolume(musicVolume); + } + } + public void playSound(int soundNumber) { boolean isMusic = soundNumber >= 0; int track = soundNumber & 0x03f; @@ -256,7 +269,7 @@ public class LawlessHacks extends Cheats { // Log path try { return new Media(pathStr); - } catch (IOException e) { + } catch (Exception e) { Logger.getLogger(getClass().getName()).log(Level.SEVERE, "Unable to load audio track " + pathStr, e); return null; } @@ -335,8 +348,8 @@ public class LawlessHacks extends Cheats { } Thread effect = new Thread(() -> { - while (playbackEffect == Thread.currentThread() && player.getVolume() < 1.0) { - player.setVolume(Math.min(player.getVolume() + FADE_AMT, 1.0)); + while (playbackEffect == Thread.currentThread() && player.getVolume() < musicVolume) { + player.setVolume(Math.min(player.getVolume() + FADE_AMT, musicVolume)); try { Thread.sleep(FADE_SPEED); } catch (InterruptedException e) { diff --git a/Platform/Apple/tools/jace/src/main/resources/META-INF/native-image/jni-config.json b/Platform/Apple/tools/jace/src/main/resources/META-INF/native-image/jni-config.json index 8e66ee29..bca7a411 100644 --- a/Platform/Apple/tools/jace/src/main/resources/META-INF/native-image/jni-config.json +++ b/Platform/Apple/tools/jace/src/main/resources/META-INF/native-image/jni-config.json @@ -1,464 +1,278 @@ [ { - "name":"[Lcom.sun.glass.ui.Screen;" + "type":"[Lcom.sun.glass.ui.Screen;" }, { - "name":"[Ljava.lang.String;" + "type":"[Ljava.lang.String;" }, { - "name":"com.sun.glass.ui.Application", - "methods":[ - {"name":"notifyDidBecomeActive","parameterTypes":[] }, - {"name":"notifyDidFinishLaunching","parameterTypes":[] }, - {"name":"notifyDidHide","parameterTypes":[] }, - {"name":"notifyDidResignActive","parameterTypes":[] }, - {"name":"notifyDidUnhide","parameterTypes":[] }, - {"name":"notifyOpenFiles","parameterTypes":["java.lang.String[]"] }, - {"name":"notifyWillBecomeActive","parameterTypes":[] }, - {"name":"notifyWillFinishLaunching","parameterTypes":[] }, - {"name":"notifyWillHide","parameterTypes":[] }, - {"name":"notifyWillResignActive","parameterTypes":[] }, - {"name":"notifyWillUnhide","parameterTypes":[] } - ] + "type":"com.sun.glass.ui.Application", + "methods":[{"name":"notifyDidBecomeActive","parameterTypes":[] },{"name":"notifyDidFinishLaunching","parameterTypes":[] },{"name":"notifyDidHide","parameterTypes":[] },{"name":"notifyDidResignActive","parameterTypes":[] },{"name":"notifyDidUnhide","parameterTypes":[] },{"name":"notifyOpenFiles","parameterTypes":["java.lang.String[]"] },{"name":"notifyWillBecomeActive","parameterTypes":[] },{"name":"notifyWillFinishLaunching","parameterTypes":[] },{"name":"notifyWillHide","parameterTypes":[] },{"name":"notifyWillResignActive","parameterTypes":[] },{"name":"notifyWillUnhide","parameterTypes":[] }] }, { - "name":"com.sun.glass.ui.CommonDialogs$ExtensionFilter", - "methods":[ - {"name":"extensionsToArray","parameterTypes":[] }, - {"name":"getDescription","parameterTypes":[] } - ] + "type":"com.sun.glass.ui.CommonDialogs$ExtensionFilter", + "methods":[{"name":"extensionsToArray","parameterTypes":[] },{"name":"getDescription","parameterTypes":[] }] }, { - "name":"com.sun.glass.ui.CommonDialogs$FileChooserResult", + "type":"com.sun.glass.ui.CommonDialogs$FileChooserResult", "methods":[{"name":"","parameterTypes":["java.util.List","com.sun.glass.ui.CommonDialogs$ExtensionFilter"] }] }, { - "name":"com.sun.glass.ui.EventLoop", - "methods":[ - {"name":"","parameterTypes":[] }, - {"name":"enter","parameterTypes":[] }, - {"name":"leave","parameterTypes":["java.lang.Object"] } - ] + "type":"com.sun.glass.ui.EventLoop", + "methods":[{"name":"","parameterTypes":[] },{"name":"enter","parameterTypes":[] },{"name":"leave","parameterTypes":["java.lang.Object"] }] }, { - "name":"com.sun.glass.ui.Menu", - "methods":[ - {"name":"notifyMenuClosed","parameterTypes":[] }, - {"name":"notifyMenuOpening","parameterTypes":[] } - ] + "type":"com.sun.glass.ui.Menu", + "methods":[{"name":"notifyMenuClosed","parameterTypes":[] },{"name":"notifyMenuOpening","parameterTypes":[] }] }, { - "name":"com.sun.glass.ui.MenuItem$Callback", - "methods":[ - {"name":"action","parameterTypes":[] }, - {"name":"validate","parameterTypes":[] } - ] + "type":"com.sun.glass.ui.MenuItem$Callback", + "methods":[{"name":"action","parameterTypes":[] },{"name":"validate","parameterTypes":[] }] }, { - "name":"com.sun.glass.ui.Screen", - "methods":[ - {"name":"","parameterTypes":["long","int","int","int","int","int","int","int","int","int","int","int","int","int","int","int","float","float","float","float"] }, - {"name":"notifySettingsChanged","parameterTypes":[] } - ] + "type":"com.sun.glass.ui.Screen", + "methods":[{"name":"","parameterTypes":["long","int","int","int","int","int","int","int","int","int","int","int","int","int","int","int","float","float","float","float"] },{"name":"notifySettingsChanged","parameterTypes":[] },{"name":"initIDs","parameterTypes":[] },{"name":"getScreens","parameterTypes":[] }] }, { - "name":"com.sun.glass.ui.Size", + "type":"com.sun.glass.ui.Size", "methods":[{"name":"","parameterTypes":["int","int"] }] }, { - "name":"com.sun.glass.ui.View", + "type":"com.sun.glass.ui.View", "fields":[{"name":"ptr"}], - "methods":[ - {"name":"getAccessible","parameterTypes":[] }, - {"name":"notifyDragDrop","parameterTypes":["int","int","int","int","int"] }, - {"name":"notifyDragEnd","parameterTypes":["int"] }, - {"name":"notifyDragEnter","parameterTypes":["int","int","int","int","int"] }, - {"name":"notifyDragLeave","parameterTypes":[] }, - {"name":"notifyDragOver","parameterTypes":["int","int","int","int","int"] }, - {"name":"notifyInputMethod","parameterTypes":["java.lang.String","int[]","int[]","byte[]","int","int","int"] }, - {"name":"notifyInputMethodCandidatePosRequest","parameterTypes":["int"] }, - {"name":"notifyKey","parameterTypes":["int","int","char[]","int"] }, - {"name":"notifyMenu","parameterTypes":["int","int","int","int","boolean"] }, - {"name":"notifyMouse","parameterTypes":["int","int","int","int","int","int","int","boolean","boolean"] }, - {"name":"notifyRepaint","parameterTypes":["int","int","int","int"] }, - {"name":"notifyResize","parameterTypes":["int","int"] }, - {"name":"notifyView","parameterTypes":["int"] } - ] + "methods":[{"name":"getAccessible","parameterTypes":[] },{"name":"notifyDragDrop","parameterTypes":["int","int","int","int","int"] },{"name":"notifyDragEnd","parameterTypes":["int"] },{"name":"notifyDragEnter","parameterTypes":["int","int","int","int","int"] },{"name":"notifyDragLeave","parameterTypes":[] },{"name":"notifyDragOver","parameterTypes":["int","int","int","int","int"] },{"name":"notifyInputMethod","parameterTypes":["java.lang.String","int[]","int[]","byte[]","int","int","int"] },{"name":"notifyInputMethodCandidatePosRequest","parameterTypes":["int"] },{"name":"notifyKey","parameterTypes":["int","int","char[]","int"] },{"name":"notifyMenu","parameterTypes":["int","int","int","int","boolean"] },{"name":"notifyMouse","parameterTypes":["int","int","int","int","int","int","int","boolean","boolean"] },{"name":"notifyRepaint","parameterTypes":["int","int","int","int"] },{"name":"notifyResize","parameterTypes":["int","int"] },{"name":"notifyView","parameterTypes":["int"] }] }, { - "name":"com.sun.javafx.font.coretext.CGAffineTransform", - "fields":[ - {"name":"a"}, - {"name":"b"}, - {"name":"c"}, - {"name":"d"}, - {"name":"tx"}, - {"name":"ty"} - ], + "type":"com.sun.javafx.font.coretext.CGAffineTransform", + "fields":[{"name":"a"},{"name":"b"},{"name":"c"},{"name":"d"},{"name":"tx"},{"name":"ty"}], "methods":[{"name":"","parameterTypes":[] }] }, { - "name":"com.sun.javafx.font.coretext.CGPoint", - "fields":[ - {"name":"x"}, - {"name":"y"} - ], + "type":"com.sun.javafx.font.coretext.CGPoint", + "fields":[{"name":"x"},{"name":"y"}], "methods":[{"name":"","parameterTypes":[] }] }, { - "name":"com.sun.javafx.font.coretext.CGRect", - "fields":[ - {"name":"origin"}, - {"name":"size"} - ], + "type":"com.sun.javafx.font.coretext.CGRect", + "fields":[{"name":"origin"},{"name":"size"}], "methods":[{"name":"","parameterTypes":[] }] }, { - "name":"com.sun.javafx.font.coretext.CGSize", - "fields":[ - {"name":"height"}, - {"name":"width"} - ], + "type":"com.sun.javafx.font.coretext.CGSize", + "fields":[{"name":"height"},{"name":"width"}], "methods":[{"name":"","parameterTypes":[] }] }, { - "name":"com.sun.javafx.iio.common.ImageLoaderImpl", + "type":"com.sun.javafx.iio.common.ImageLoaderImpl", "methods":[{"name":"emitWarning","parameterTypes":["java.lang.String"] }] }, { - "name":"com.sun.javafx.iio.jpeg.JPEGImageLoader", - "methods":[ - {"name":"setInputAttributes","parameterTypes":["int","int","int","int","int","byte[]"] }, - {"name":"setOutputAttributes","parameterTypes":["int","int"] }, - {"name":"updateImageProgress","parameterTypes":["int"] } - ] + "type":"com.sun.javafx.iio.jpeg.JPEGImageLoader", + "methods":[{"name":"setInputAttributes","parameterTypes":["int","int","int","int","int","byte[]"] },{"name":"setOutputAttributes","parameterTypes":["int","int"] },{"name":"updateImageProgress","parameterTypes":["int"] }] }, { - "name":"com.sun.media.jfxmedia.locator.Locator", + "type":"com.sun.media.jfxmedia.locator.Locator", "methods":[{"name":"getStringLocation","parameterTypes":[] }] }, { - "name":"com.sun.media.jfxmedia.logging.Logger", - "methods":[ - {"name":"logMsg","parameterTypes":["int","java.lang.String"] }, - {"name":"logMsg","parameterTypes":["int","java.lang.String","java.lang.String","java.lang.String"] } - ] + "type":"com.sun.media.jfxmedia.logging.Logger", + "methods":[{"name":"logMsg","parameterTypes":["int","java.lang.String"] },{"name":"logMsg","parameterTypes":["int","java.lang.String","java.lang.String","java.lang.String"] }] }, { - "name":"com.sun.media.jfxmediaimpl.NativeMediaPlayer", - "methods":[ - {"name":"sendAudioSpectrumEvent","parameterTypes":["double","double","boolean"] }, - {"name":"sendAudioTrack","parameterTypes":["boolean","long","java.lang.String","int","java.lang.String","int","int","float"] }, - {"name":"sendBufferProgressEvent","parameterTypes":["double","long","long","long"] }, - {"name":"sendDurationUpdateEvent","parameterTypes":["double"] }, - {"name":"sendFrameSizeChangedEvent","parameterTypes":["int","int"] }, - {"name":"sendMarkerEvent","parameterTypes":["java.lang.String","double"] }, - {"name":"sendNewFrameEvent","parameterTypes":["long"] }, - {"name":"sendPlayerHaltEvent","parameterTypes":["java.lang.String","double"] }, - {"name":"sendPlayerMediaErrorEvent","parameterTypes":["int"] }, - {"name":"sendPlayerStateEvent","parameterTypes":["int","double"] }, - {"name":"sendSubtitleTrack","parameterTypes":["boolean","long","java.lang.String","int","java.lang.String"] }, - {"name":"sendVideoTrack","parameterTypes":["boolean","long","java.lang.String","int","int","int","float","boolean"] }, - {"name":"sendWarning","parameterTypes":["int","java.lang.String"] } - ] + "type":"com.sun.media.jfxmediaimpl.NativeMediaPlayer", + "methods":[{"name":"sendAudioSpectrumEvent","parameterTypes":["double","double","boolean"] },{"name":"sendAudioTrack","parameterTypes":["boolean","long","java.lang.String","int","java.lang.String","int","int","float"] },{"name":"sendBufferProgressEvent","parameterTypes":["double","long","long","long"] },{"name":"sendDurationUpdateEvent","parameterTypes":["double"] },{"name":"sendFrameSizeChangedEvent","parameterTypes":["int","int"] },{"name":"sendMarkerEvent","parameterTypes":["java.lang.String","double"] },{"name":"sendNewFrameEvent","parameterTypes":["long"] },{"name":"sendPlayerHaltEvent","parameterTypes":["java.lang.String","double"] },{"name":"sendPlayerMediaErrorEvent","parameterTypes":["int"] },{"name":"sendPlayerStateEvent","parameterTypes":["int","double"] },{"name":"sendSubtitleTrack","parameterTypes":["boolean","long","java.lang.String","int","java.lang.String"] },{"name":"sendVideoTrack","parameterTypes":["boolean","long","java.lang.String","int","int","int","float","boolean"] },{"name":"sendWarning","parameterTypes":["int","java.lang.String"] }] }, { - "name":"com.sun.media.jfxmediaimpl.platform.osx.OSXMediaPlayer" + "type":"com.sun.media.jfxmediaimpl.platform.osx.OSXMediaPlayer" }, { - "name":"com.sun.media.sound.DirectAudioDevice", + "type":"com.sun.media.sound.DirectAudioDevice", "methods":[{"name":"addFormat","parameterTypes":["java.util.Vector","int","int","int","float","int","boolean","boolean"] }] }, { - "name":"com.sun.media.sound.DirectAudioDeviceProvider$DirectAudioDeviceInfo", + "type":"com.sun.media.sound.DirectAudioDeviceProvider$DirectAudioDeviceInfo", "methods":[{"name":"","parameterTypes":["int","int","int","java.lang.String","java.lang.String","java.lang.String","java.lang.String"] }] }, { - "name":"com.sun.media.sound.PortMixerProvider$PortMixerInfo", + "type":"com.sun.media.sound.PortMixerProvider$PortMixerInfo", "methods":[{"name":"","parameterTypes":["int","java.lang.String","java.lang.String","java.lang.String","java.lang.String"] }] }, { - "name":"com.sun.webkit.BackForwardList", + "type":"com.sun.webkit.BackForwardList", "methods":[{"name":"notifyChanged","parameterTypes":[] }] }, { - "name":"com.sun.webkit.BackForwardList$Entry", - "methods":[ - {"name":"","parameterTypes":["long","long"] }, - {"name":"notifyItemChanged","parameterTypes":[] }, - {"name":"notifyItemDestroyed","parameterTypes":[] } - ] + "type":"com.sun.webkit.BackForwardList$Entry", + "methods":[{"name":"","parameterTypes":["long","long"] },{"name":"notifyItemChanged","parameterTypes":[] },{"name":"notifyItemDestroyed","parameterTypes":[] }] }, { - "name":"com.sun.webkit.CursorManager", - "methods":[ - {"name":"getCursorManager","parameterTypes":[] }, - {"name":"getPredefinedCursorID","parameterTypes":["int"] } - ] + "type":"com.sun.webkit.CursorManager", + "methods":[{"name":"getCursorManager","parameterTypes":[] },{"name":"getPredefinedCursorID","parameterTypes":["int"] }] }, { - "name":"com.sun.webkit.FileSystem", - "methods":[ - {"name":"fwkFileExists","parameterTypes":["java.lang.String"] }, - {"name":"fwkMakeAllDirectories","parameterTypes":["java.lang.String"] }, - {"name":"fwkPathByAppendingComponent","parameterTypes":["java.lang.String","java.lang.String"] } - ] + "type":"com.sun.webkit.FileSystem", + "methods":[{"name":"fwkFileExists","parameterTypes":["java.lang.String"] },{"name":"fwkMakeAllDirectories","parameterTypes":["java.lang.String"] },{"name":"fwkPathByAppendingComponent","parameterTypes":["java.lang.String","java.lang.String"] }] }, { - "name":"com.sun.webkit.MainThread", + "type":"com.sun.webkit.MainThread", "methods":[{"name":"fwkScheduleDispatchFunctions","parameterTypes":[] }] }, { - "name":"com.sun.webkit.Timer", - "methods":[ - {"name":"fwkSetFireTime","parameterTypes":["double"] }, - {"name":"fwkStopTimer","parameterTypes":[] } - ] + "type":"com.sun.webkit.Timer", + "methods":[{"name":"fwkSetFireTime","parameterTypes":["double"] },{"name":"fwkStopTimer","parameterTypes":[] }] }, { - "name":"com.sun.webkit.WCWidget", - "methods":[ - {"name":"fwkDestroy","parameterTypes":[] }, - {"name":"fwkRequestFocus","parameterTypes":[] }, - {"name":"fwkSetBounds","parameterTypes":["int","int","int","int"] }, - {"name":"fwkSetCursor","parameterTypes":["long"] }, - {"name":"fwkSetVisible","parameterTypes":["boolean"] } - ] + "type":"com.sun.webkit.WCWidget", + "methods":[{"name":"fwkDestroy","parameterTypes":[] },{"name":"fwkRequestFocus","parameterTypes":[] },{"name":"fwkSetBounds","parameterTypes":["int","int","int","int"] },{"name":"fwkSetCursor","parameterTypes":["long"] },{"name":"fwkSetVisible","parameterTypes":["boolean"] }] }, { - "name":"com.sun.webkit.WebPage", - "methods":[ - {"name":"fwkAddMessageToConsole","parameterTypes":["java.lang.String","int","java.lang.String"] }, - {"name":"fwkAlert","parameterTypes":["java.lang.String"] }, - {"name":"fwkCanRunBeforeUnloadConfirmPanel","parameterTypes":[] }, - {"name":"fwkChooseFile","parameterTypes":["java.lang.String","boolean","java.lang.String"] }, - {"name":"fwkCloseWindow","parameterTypes":[] }, - {"name":"fwkConfirm","parameterTypes":["java.lang.String"] }, - {"name":"fwkCreateWindow","parameterTypes":["boolean","boolean","boolean","boolean"] }, - {"name":"fwkDidClearWindowObject","parameterTypes":["long","long"] }, - {"name":"fwkFireLoadEvent","parameterTypes":["long","int","java.lang.String","java.lang.String","double","int"] }, - {"name":"fwkFireResourceLoadEvent","parameterTypes":["long","int","int","java.lang.String","double","int"] }, - {"name":"fwkFrameCreated","parameterTypes":["long"] }, - {"name":"fwkFrameDestroyed","parameterTypes":["long"] }, - {"name":"fwkGetPageBounds","parameterTypes":[] }, - {"name":"fwkGetWindowBounds","parameterTypes":[] }, - {"name":"fwkPermitAcceptResourceAction","parameterTypes":["long","java.lang.String"] }, - {"name":"fwkPermitEnableScriptsAction","parameterTypes":["long","java.lang.String"] }, - {"name":"fwkPermitNavigateAction","parameterTypes":["long","java.lang.String"] }, - {"name":"fwkPermitNewWindowAction","parameterTypes":["long","java.lang.String"] }, - {"name":"fwkPermitRedirectAction","parameterTypes":["long","java.lang.String"] }, - {"name":"fwkPermitSubmitDataAction","parameterTypes":["long","java.lang.String","java.lang.String","boolean"] }, - {"name":"fwkPrompt","parameterTypes":["java.lang.String","java.lang.String"] }, - {"name":"fwkRemoveRequestURL","parameterTypes":["long","int"] }, - {"name":"fwkRepaint","parameterTypes":["int","int","int","int"] }, - {"name":"fwkRunBeforeUnloadConfirmPanel","parameterTypes":["java.lang.String"] }, - {"name":"fwkScreenToWindow","parameterTypes":["com.sun.webkit.graphics.WCPoint"] }, - {"name":"fwkSetCursor","parameterTypes":["long"] }, - {"name":"fwkSetFocus","parameterTypes":["boolean"] }, - {"name":"fwkSetRequestURL","parameterTypes":["long","int","java.lang.String"] }, - {"name":"fwkSetScrollbarsVisible","parameterTypes":["boolean"] }, - {"name":"fwkSetStatusbarText","parameterTypes":["java.lang.String"] }, - {"name":"fwkSetTooltip","parameterTypes":["java.lang.String"] }, - {"name":"fwkSetWindowBounds","parameterTypes":["int","int","int","int"] }, - {"name":"fwkShowWindow","parameterTypes":[] }, - {"name":"fwkTransferFocus","parameterTypes":["boolean"] }, - {"name":"fwkWindowToScreen","parameterTypes":["com.sun.webkit.graphics.WCPoint"] }, - {"name":"getHostWindow","parameterTypes":[] }, - {"name":"getPage","parameterTypes":[] }, - {"name":"getRenderTheme","parameterTypes":[] }, - {"name":"setInputMethodState","parameterTypes":["boolean"] } - ] + "type":"com.sun.webkit.WebPage", + "methods":[{"name":"fwkAddMessageToConsole","parameterTypes":["java.lang.String","int","java.lang.String"] },{"name":"fwkAlert","parameterTypes":["java.lang.String"] },{"name":"fwkCanRunBeforeUnloadConfirmPanel","parameterTypes":[] },{"name":"fwkChooseFile","parameterTypes":["java.lang.String","boolean","java.lang.String"] },{"name":"fwkCloseWindow","parameterTypes":[] },{"name":"fwkConfirm","parameterTypes":["java.lang.String"] },{"name":"fwkCreateWindow","parameterTypes":["boolean","boolean","boolean","boolean"] },{"name":"fwkDidClearWindowObject","parameterTypes":["long","long"] },{"name":"fwkFireLoadEvent","parameterTypes":["long","int","java.lang.String","java.lang.String","double","int"] },{"name":"fwkFireResourceLoadEvent","parameterTypes":["long","int","int","java.lang.String","double","int"] },{"name":"fwkFrameCreated","parameterTypes":["long"] },{"name":"fwkFrameDestroyed","parameterTypes":["long"] },{"name":"fwkGetPageBounds","parameterTypes":[] },{"name":"fwkGetWindowBounds","parameterTypes":[] },{"name":"fwkPermitAcceptResourceAction","parameterTypes":["long","java.lang.String"] },{"name":"fwkPermitEnableScriptsAction","parameterTypes":["long","java.lang.String"] },{"name":"fwkPermitNavigateAction","parameterTypes":["long","java.lang.String"] },{"name":"fwkPermitNewWindowAction","parameterTypes":["long","java.lang.String"] },{"name":"fwkPermitRedirectAction","parameterTypes":["long","java.lang.String"] },{"name":"fwkPermitSubmitDataAction","parameterTypes":["long","java.lang.String","java.lang.String","boolean"] },{"name":"fwkPrompt","parameterTypes":["java.lang.String","java.lang.String"] },{"name":"fwkRemoveRequestURL","parameterTypes":["long","int"] },{"name":"fwkRepaint","parameterTypes":["int","int","int","int"] },{"name":"fwkRunBeforeUnloadConfirmPanel","parameterTypes":["java.lang.String"] },{"name":"fwkScreenToWindow","parameterTypes":["com.sun.webkit.graphics.WCPoint"] },{"name":"fwkSetCursor","parameterTypes":["long"] },{"name":"fwkSetFocus","parameterTypes":["boolean"] },{"name":"fwkSetRequestURL","parameterTypes":["long","int","java.lang.String"] },{"name":"fwkSetScrollbarsVisible","parameterTypes":["boolean"] },{"name":"fwkSetStatusbarText","parameterTypes":["java.lang.String"] },{"name":"fwkSetTooltip","parameterTypes":["java.lang.String"] },{"name":"fwkSetWindowBounds","parameterTypes":["int","int","int","int"] },{"name":"fwkShowWindow","parameterTypes":[] },{"name":"fwkTransferFocus","parameterTypes":["boolean"] },{"name":"fwkWindowToScreen","parameterTypes":["com.sun.webkit.graphics.WCPoint"] },{"name":"getHostWindow","parameterTypes":[] },{"name":"getPage","parameterTypes":[] },{"name":"getRenderTheme","parameterTypes":[] },{"name":"setInputMethodState","parameterTypes":["boolean"] }] }, { - "name":"com.sun.webkit.dom.JSObject", + "type":"com.sun.webkit.dom.JSObject", "fields":[{"name":"UNDEFINED"}], "methods":[{"name":"","parameterTypes":["long","int"] }] }, { - "name":"com.sun.webkit.graphics.Ref", - "methods":[ - {"name":"getID","parameterTypes":[] }, - {"name":"ref","parameterTypes":[] } - ] + "type":"com.sun.webkit.graphics.Ref", + "methods":[{"name":"getID","parameterTypes":[] },{"name":"ref","parameterTypes":[] }] }, { - "name":"com.sun.webkit.graphics.ScrollBarTheme", + "type":"com.sun.webkit.graphics.ScrollBarTheme", "methods":[{"name":"getThickness","parameterTypes":[] }] }, { - "name":"com.sun.webkit.graphics.WCFont", - "methods":[ - {"name":"getAscent","parameterTypes":[] }, - {"name":"getCapHeight","parameterTypes":[] }, - {"name":"getDescent","parameterTypes":[] }, - {"name":"getGlyphBoundingBox","parameterTypes":["int"] }, - {"name":"getGlyphCodes","parameterTypes":["char[]"] }, - {"name":"getGlyphWidth","parameterTypes":["int"] }, - {"name":"getLineGap","parameterTypes":[] }, - {"name":"getLineSpacing","parameterTypes":[] }, - {"name":"getTextRuns","parameterTypes":["java.lang.String"] }, - {"name":"getXHeight","parameterTypes":[] }, - {"name":"hasUniformLineMetrics","parameterTypes":[] }, - {"name":"hashCode","parameterTypes":[] } - ] + "type":"com.sun.webkit.graphics.WCFont", + "methods":[{"name":"getAscent","parameterTypes":[] },{"name":"getCapHeight","parameterTypes":[] },{"name":"getDescent","parameterTypes":[] },{"name":"getGlyphBoundingBox","parameterTypes":["int"] },{"name":"getGlyphCodes","parameterTypes":["char[]"] },{"name":"getGlyphWidth","parameterTypes":["int"] },{"name":"getLineGap","parameterTypes":[] },{"name":"getLineSpacing","parameterTypes":[] },{"name":"getTextRuns","parameterTypes":["java.lang.String"] },{"name":"getXHeight","parameterTypes":[] },{"name":"hasUniformLineMetrics","parameterTypes":[] },{"name":"hashCode","parameterTypes":[] }] }, { - "name":"com.sun.webkit.graphics.WCGraphicsManager", - "methods":[ - {"name":"createWCPath","parameterTypes":[] }, - {"name":"getGraphicsManager","parameterTypes":[] }, - {"name":"getWCFont","parameterTypes":["java.lang.String","boolean","boolean","float"] } - ] + "type":"com.sun.webkit.graphics.WCGraphicsManager", + "methods":[{"name":"createWCPath","parameterTypes":[] },{"name":"getGraphicsManager","parameterTypes":[] },{"name":"getWCFont","parameterTypes":["java.lang.String","boolean","boolean","float"] }] }, { - "name":"com.sun.webkit.graphics.WCPoint", - "methods":[ - {"name":"","parameterTypes":["float","float"] }, - {"name":"getX","parameterTypes":[] }, - {"name":"getY","parameterTypes":[] } - ] + "type":"com.sun.webkit.graphics.WCPoint", + "methods":[{"name":"","parameterTypes":["float","float"] },{"name":"getX","parameterTypes":[] },{"name":"getY","parameterTypes":[] }] }, { - "name":"com.sun.webkit.graphics.WCRectangle", - "fields":[ - {"name":"h"}, - {"name":"w"}, - {"name":"x"}, - {"name":"y"} - ] + "type":"com.sun.webkit.graphics.WCRectangle", + "fields":[{"name":"h"},{"name":"w"},{"name":"x"},{"name":"y"}] }, { - "name":"com.sun.webkit.graphics.WCRenderQueue", - "methods":[ - {"name":"fwkAddBuffer","parameterTypes":["java.nio.ByteBuffer"] }, - {"name":"fwkDisposeGraphics","parameterTypes":[] }, - {"name":"refFloatArr","parameterTypes":["float[]"] }, - {"name":"refIntArr","parameterTypes":["int[]"] } - ] + "type":"com.sun.webkit.graphics.WCRenderQueue", + "methods":[{"name":"fwkAddBuffer","parameterTypes":["java.nio.ByteBuffer"] },{"name":"fwkDisposeGraphics","parameterTypes":[] },{"name":"refFloatArr","parameterTypes":["float[]"] },{"name":"refIntArr","parameterTypes":["int[]"] }] }, { - "name":"com.sun.webkit.graphics.WCTextRun", - "methods":[ - {"name":"getCharOffset","parameterTypes":["int"] }, - {"name":"getEnd","parameterTypes":[] }, - {"name":"getGlyph","parameterTypes":["int"] }, - {"name":"getGlyphCount","parameterTypes":[] }, - {"name":"getGlyphPosAndAdvance","parameterTypes":["int"] }, - {"name":"getStart","parameterTypes":[] }, - {"name":"isLeftToRight","parameterTypes":[] } - ] + "type":"com.sun.webkit.graphics.WCTextRun", + "methods":[{"name":"getCharOffset","parameterTypes":["int"] },{"name":"getEnd","parameterTypes":[] },{"name":"getGlyph","parameterTypes":["int"] },{"name":"getGlyphCount","parameterTypes":[] },{"name":"getGlyphPosAndAdvance","parameterTypes":["int"] },{"name":"getStart","parameterTypes":[] },{"name":"isLeftToRight","parameterTypes":[] }] }, { - "name":"com.sun.webkit.network.FormDataElement", - "methods":[ - {"name":"fwkCreateFromByteArray","parameterTypes":["byte[]"] }, - {"name":"fwkCreateFromFile","parameterTypes":["java.lang.String"] } - ] + "type":"com.sun.webkit.network.FormDataElement", + "methods":[{"name":"fwkCreateFromByteArray","parameterTypes":["byte[]"] },{"name":"fwkCreateFromFile","parameterTypes":["java.lang.String"] }] }, { - "name":"com.sun.webkit.network.NetworkContext", - "methods":[ - {"name":"canHandleURL","parameterTypes":["java.lang.String"] }, - {"name":"fwkGetMaximumHTTPConnectionCountPerHost","parameterTypes":[] }, - {"name":"fwkLoad","parameterTypes":["com.sun.webkit.WebPage","boolean","java.lang.String","java.lang.String","java.lang.String","com.sun.webkit.network.FormDataElement[]","long"] } - ] + "type":"com.sun.webkit.network.NetworkContext", + "methods":[{"name":"canHandleURL","parameterTypes":["java.lang.String"] },{"name":"fwkGetMaximumHTTPConnectionCountPerHost","parameterTypes":[] },{"name":"fwkLoad","parameterTypes":["com.sun.webkit.WebPage","boolean","java.lang.String","java.lang.String","java.lang.String","com.sun.webkit.network.FormDataElement[]","long"] }] }, { - "name":"com.sun.webkit.network.URLLoaderBase", + "type":"com.sun.webkit.network.URLLoaderBase", "methods":[{"name":"fwkCancel","parameterTypes":[] }] }, { - "name":"jace.ide.Program" + "type":"jace.ide.Program" }, { - "name":"java.io.File", + "type":"java.io.File", "methods":[{"name":"","parameterTypes":["java.lang.String"] }] }, { - "name":"java.io.InputStream", - "methods":[ - {"name":"read","parameterTypes":["byte[]","int","int"] }, - {"name":"skip","parameterTypes":["long"] } - ] + "type":"java.io.InputStream", + "methods":[{"name":"read","parameterTypes":["byte[]","int","int"] },{"name":"skip","parameterTypes":["long"] }] }, { - "name":"java.lang.Boolean", - "methods":[ - {"name":"booleanValue","parameterTypes":[] }, - {"name":"getBoolean","parameterTypes":["java.lang.String"] } - ] + "type":"java.lang.Boolean", + "methods":[{"name":"booleanValue","parameterTypes":[] },{"name":"getBoolean","parameterTypes":["java.lang.String"] }] }, { - "name":"java.lang.Class", - "methods":[ - {"name":"forName","parameterTypes":["java.lang.String","boolean","java.lang.ClassLoader"] }, - {"name":"isArray","parameterTypes":[] } - ] + "type":"java.lang.Class", + "methods":[{"name":"forName","parameterTypes":["java.lang.String"] },{"name":"getMethod","parameterTypes":["java.lang.String", "[Ljava.lang.Class;"] },{"name":"getField","parameterTypes":["java.lang.String"] },{"name":"forName","parameterTypes":["java.lang.String", "boolean", "java.lang.ClassLoader"] },{"name":"getClassLoader","parameterTypes":[] },{"name":"getDeclaredMethod","parameterTypes":["java.lang.String", "java.lang.Class[]"] },{"name":"getDeclaredMethods","parameterTypes":[] },{"name":"getMethod","parameterTypes":["java.lang.String", "java.lang.Class[]"] },{"name":"getMethods","parameterTypes":[] }] }, { - "name":"java.lang.ClassLoader", - "methods":[ - {"name":"getPlatformClassLoader","parameterTypes":[] }, - {"name":"loadClass","parameterTypes":["java.lang.String"] } - ] + "type":"java.lang.ClassLoader", + "methods":[{"name":"getPlatformClassLoader","parameterTypes":[] },{"name":"loadClass","parameterTypes":["java.lang.String"] },{"name":"defineClass","parameterTypes":["java.lang.String", "byte[]", "int", "int", "java.security.ProtectionDomain"] },{"name":"findLoadedClass","parameterTypes":["java.lang.String"] },{"name":"findLibrary","parameterTypes":["java.lang.String"] },{"name":"findBuiltinLib","parameterTypes":["java.lang.String"] },{"name":"getResourceAsStream","parameterTypes":["java.lang.String"] }] }, { - "name":"java.lang.Integer", - "methods":[ - {"name":"","parameterTypes":["int"] }, - {"name":"intValue","parameterTypes":[] } - ] + "type":"java.lang.Integer", + "methods":[{"name":"","parameterTypes":["int"] },{"name":"intValue","parameterTypes":[] }] }, { - "name":"java.lang.Long", + "type":"java.lang.Long", "methods":[{"name":"longValue","parameterTypes":[] }] }, { - "name":"java.lang.Number" + "type":"java.lang.Number" }, { - "name":"java.lang.Object", + "type":"java.lang.Object", "methods":[{"name":"getClass","parameterTypes":[] }] }, { - "name":"java.lang.Runnable", + "type":"java.lang.Runnable", "methods":[{"name":"run","parameterTypes":[] }] }, { - "name":"java.lang.String", - "methods":[ - {"name":"lastIndexOf","parameterTypes":["int"] }, - {"name":"substring","parameterTypes":["int"] } - ] + "type":"java.lang.String", + "methods":[{"name":"lastIndexOf","parameterTypes":["int"] },{"name":"substring","parameterTypes":["int"] }] }, { - "name":"java.lang.System", - "methods":[ - {"name":"getProperty","parameterTypes":["java.lang.String"] }, - {"name":"setProperty","parameterTypes":["java.lang.String","java.lang.String"] } - ] + "type":"java.lang.System", + "methods":[{"name":"getProperty","parameterTypes":["java.lang.String"] },{"name":"setProperty","parameterTypes":["java.lang.String","java.lang.String"] }] }, { - "name":"java.util.ArrayList", + "type":"java.util.ArrayList", "methods":[{"name":"","parameterTypes":[] }] }, { - "name":"java.util.List", + "type":"java.util.List", "methods":[{"name":"add","parameterTypes":["java.lang.Object"] }] }, { - "name":"java.util.Map", + "type":"java.util.Map", "methods":[{"name":"get","parameterTypes":["java.lang.Object"] }] }, { - "name":"jdk.internal.loader.ClassLoaders$PlatformClassLoader" + "type":"jdk.internal.loader.ClassLoaders$PlatformClassLoader" }, { - "name":"org.graalvm.jniutils.JNIExceptionWrapperEntryPoints", + "type":"org.graalvm.jniutils.JNIExceptionWrapperEntryPoints", "methods":[{"name":"getClassName","parameterTypes":["java.lang.Class"] }] }, { - "name":"sun.launcher.LauncherHelper$FXHelper", + "type":"sun.launcher.LauncherHelper$FXHelper", "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "type":"java.lang.reflect.Method", + "methods":[{"name":"invoke","parameterTypes":["java.lang.Object", "[Ljava.lang.Object;"] }] +}, +{ + "type":"org.lwjgl.system.JNI", + "methods":[{"name":"invokePPP","parameterTypes":["long", "long", "long"] },{"name":"invokePP","parameterTypes":["long", "long"] },{"name":"invokeP","parameterTypes":["long"] }] +}, +{ + "type":"com.sun.glass.ui.mac.MacApplication", + "methods":[{"name":"initIDs","parameterTypes":[] },{"name":"_initSysProps","parameterTypes":["java.lang.String", "java.lang.String"] }] +}, +{ + "type":"com.sun.glass.ui.mac.MacView", + "methods":[{"name":"initIDs","parameterTypes":[] }] +}, +{ + "type":"com.sun.prism.es2.ES2Pipeline", + "methods":[{"name":"nInitialize","parameterTypes":["java.lang.Class", "java.lang.Class", "java.lang.Class", "java.lang.Class"] }] +}, +{ + "type":"java.io.FileInputStream", + "methods":[{"name":"readBytes","parameterTypes":["byte[]", "int", "int"] },{"name":"close","parameterTypes":[] }] } ] diff --git a/Platform/Apple/tools/jace/src/main/resources/META-INF/native-image/native-image.properties b/Platform/Apple/tools/jace/src/main/resources/META-INF/native-image/native-image.properties new file mode 100644 index 00000000..c38980cf --- /dev/null +++ b/Platform/Apple/tools/jace/src/main/resources/META-INF/native-image/native-image.properties @@ -0,0 +1 @@ +Args = --no-fallback -H:+ReportExceptionStackTraces --initialize-at-build-time=jace --initialize-at-build-time=javafx --initialize-at-run-time=com.sun.glass.ui.mac.MacApplication --initialize-at-run-time=com.sun.glass.ui.mac.MacCommonDialogs --initialize-at-run-time=com.sun.glass.ui.mac.MacGestureSupport --initialize-at-run-time=com.sun.glass.ui.mac.MacPasteboard --initialize-at-run-time=com.sun.glass.ui.mac.MacView --initialize-at-run-time=com.sun.javafx.font.FontConfigManager --initialize-at-run-time=com.sun.javafx.font.PrismFontFactory --initialize-at-run-time=com.sun.javafx.tk.quantum.QuantumToolkit --initialize-at-run-time=sun.font.FontManagerNativeLibrary -H:EnableURLProtocols=http,https -Dprism.targetvram=192m diff --git a/Platform/Apple/tools/jace/src/main/resources/META-INF/native-image/reflect-config.json b/Platform/Apple/tools/jace/src/main/resources/META-INF/native-image/reflect-config.json index ad3e9926..34a701ff 100644 --- a/Platform/Apple/tools/jace/src/main/resources/META-INF/native-image/reflect-config.json +++ b/Platform/Apple/tools/jace/src/main/resources/META-INF/native-image/reflect-config.json @@ -1,1196 +1,88 @@ [ -{ - "name":"[D" -}, -{ - "name":"apple.security.AppleProvider", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"com.sun.crypto.provider.AESCipher$General", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"com.sun.crypto.provider.ARCFOURCipher", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"com.sun.crypto.provider.ChaCha20Cipher$ChaCha20Poly1305", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"com.sun.crypto.provider.DESCipher", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"com.sun.crypto.provider.DESedeCipher", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"com.sun.crypto.provider.DHParameters", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"com.sun.crypto.provider.GaloisCounterMode$AESGCM", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"com.sun.crypto.provider.TlsMasterSecretGenerator", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"com.sun.glass.ui.Application" -}, -{ - "name":"com.sun.glass.ui.CommonDialogs$ExtensionFilter" -}, -{ - "name":"com.sun.glass.ui.CommonDialogs$FileChooserResult" -}, -{ - "name":"com.sun.glass.ui.EventLoop" -}, -{ - "name":"com.sun.glass.ui.Menu" -}, -{ - "name":"com.sun.glass.ui.MenuItem$Callback" -}, -{ - "name":"com.sun.glass.ui.Size" -}, -{ - "name":"com.sun.glass.ui.View" -}, -{ - "name":"com.sun.javafx.font.coretext.CTFactory", - "methods":[{"name":"getFactory","parameterTypes":[] }] -}, -{ - "name":"com.sun.javafx.logging.PrintLogger", - "methods":[{"name":"createInstance","parameterTypes":[] }] -}, -{ - "name":"com.sun.javafx.logging.jfr.JFRPulseLogger", - "methods":[{"name":"createInstance","parameterTypes":[] }] -}, -{ - "name":"com.sun.javafx.reflect.Trampoline", - "methods":[{"name":"invoke","parameterTypes":["java.lang.reflect.Method","java.lang.Object","java.lang.Object[]"] }] -}, -{ - "name":"com.sun.javafx.scene.control.skin.Utils", - "methods":[{"name":"getResource","parameterTypes":["java.lang.String"] }] -}, -{ - "name":"com.sun.javafx.tk.quantum.QuantumToolkit", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"com.sun.javafx.webkit.theme.ScrollBarWidget" -}, -{ - "name":"com.sun.media.jfxmediaimpl.platform.gstreamer.GSTPlatform", - "methods":[{"name":"getPlatformInstance","parameterTypes":[] }] -}, -{ - "name":"com.sun.media.jfxmediaimpl.platform.osx.OSXPlatform", - "methods":[{"name":"getPlatformInstance","parameterTypes":[] }] -}, -{ - "name":"com.sun.prism.GraphicsPipeline", - "methods":[ - {"name":"getFontFactory","parameterTypes":[] }, - {"name":"getPipeline","parameterTypes":[] } - ] -}, -{ - "name":"com.sun.prism.shader.DrawRoundRect_Color_Loader", - "methods":[{"name":"loadShader","parameterTypes":["com.sun.prism.ps.ShaderFactory","java.io.InputStream"] }] -}, -{ - "name":"com.sun.prism.shader.FillPgram_Color_Loader", - "methods":[{"name":"loadShader","parameterTypes":["com.sun.prism.ps.ShaderFactory","java.io.InputStream"] }] -}, -{ - "name":"com.sun.prism.shader.FillPgram_LinearGradient_PAD_Loader", - "methods":[{"name":"loadShader","parameterTypes":["com.sun.prism.ps.ShaderFactory","java.io.InputStream"] }] -}, -{ - "name":"com.sun.prism.shader.FillRoundRect_Color_Loader", - "methods":[{"name":"loadShader","parameterTypes":["com.sun.prism.ps.ShaderFactory","java.io.InputStream"] }] -}, -{ - "name":"com.sun.prism.shader.FillRoundRect_LinearGradient_PAD_Loader", - "methods":[{"name":"loadShader","parameterTypes":["com.sun.prism.ps.ShaderFactory","java.io.InputStream"] }] -}, -{ - "name":"com.sun.prism.shader.Mask_TextureSuper_Loader", - "methods":[{"name":"loadShader","parameterTypes":["com.sun.prism.ps.ShaderFactory","java.io.InputStream"] }] -}, -{ - "name":"com.sun.prism.shader.Solid_TextureRGB_Loader", - "methods":[{"name":"loadShader","parameterTypes":["com.sun.prism.ps.ShaderFactory","java.io.InputStream"] }] -}, -{ - "name":"com.sun.prism.shader.Texture_Color_Loader", - "methods":[{"name":"loadShader","parameterTypes":["com.sun.prism.ps.ShaderFactory","java.io.InputStream"] }] -}, -{ - "name":"com.sun.prism.shader.Texture_LinearGradient_PAD_Loader", - "methods":[{"name":"loadShader","parameterTypes":["com.sun.prism.ps.ShaderFactory","java.io.InputStream"] }] -}, -{ - "name":"com.sun.scenario.effect.impl.prism.PrRenderer", - "methods":[{"name":"createRenderer","parameterTypes":["com.sun.scenario.effect.FilterContext"] }] -}, -{ - "name":"com.sun.scenario.effect.impl.prism.ps.PPSLinearConvolveShadowPeer", - "methods":[{"name":"","parameterTypes":["com.sun.scenario.effect.FilterContext","com.sun.scenario.effect.impl.Renderer","java.lang.String"] }] -}, -{ - "name":"com.sun.scenario.effect.impl.prism.ps.PPSRenderer", - "methods":[{"name":"createRenderer","parameterTypes":["com.sun.scenario.effect.FilterContext"] }] -}, -{ - "name":"com.sun.xml.internal.stream.XMLInputFactoryImpl", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"jace.EmulatorUILogic", - "allPublicFields":true, - "queryAllPublicMethods":true, - "methods":[ - {"name":"runFile","parameterTypes":[] }, - {"name":"scaleIntegerRatio","parameterTypes":[] }, - {"name":"showAboutWindow","parameterTypes":[] }, - {"name":"showConfig","parameterTypes":[] }, - {"name":"showIDE","parameterTypes":[] }, - {"name":"toggleFullscreen","parameterTypes":[] } - ] -}, -{ - "name":"jace.JaceUIController", - "allDeclaredFields":true, - "queryAllDeclaredMethods":true, - "methods":[ - {"name":"","parameterTypes":[] }, - {"name":"initialize","parameterTypes":[] } - ] -}, -{ - "name":"jace.LawlessLegends", - "methods":[ - {"name":"","parameterTypes":[] }, - {"name":"main","parameterTypes":["java.lang.String[]"] } - ] -}, -{ - "name":"jace.apple2e.Apple2e", - "fields":[ - {"name":"PRODUCTION_MODE"}, - {"name":"acceleratorEnabled"}, - {"name":"card1"}, - {"name":"card2"}, - {"name":"card3"}, - {"name":"card4"}, - {"name":"card5"}, - {"name":"card6"}, - {"name":"card7"}, - {"name":"cheatEngine"}, - {"name":"clockEnabled"}, - {"name":"enableHints"}, - {"name":"joy1enabled"}, - {"name":"joy2enabled"}, - {"name":"ramCard"}, - {"name":"showSpeedMonitors"}, - {"name":"useDebugRom"}, - {"name":"videoRenderer"} - ] -}, -{ - "name":"jace.apple2e.MOS65C02", - "allPublicFields":true, - "queryAllPublicMethods":true -}, -{ - "name":"jace.apple2e.MOS65C02$AddressCalculator" -}, -{ - "name":"jace.apple2e.MOS65C02$CommandProcessor" -}, -{ - "name":"jace.apple2e.Speaker", - "allPublicFields":true, - "queryAllPublicMethods":true, - "methods":[{"name":"toggleFileOutput","parameterTypes":[] }] -}, -{ - "name":"jace.apple2e.VideoDHGR" -}, -{ - "name":"jace.apple2e.VideoNTSC", - "fields":[ - {"name":"enableVideo7"}, - {"name":"useTextPalette"} - ] -}, -{ - "name":"jace.cheat.MetaCheat" -}, -{ - "name":"jace.cheat.MontezumasRevengeCheats" -}, -{ - "name":"jace.cheat.PrinceOfPersiaCheats" -}, -{ - "name":"jace.config.Configuration", - "allPublicFields":true, - "queryAllPublicMethods":true -}, -{ - "name":"jace.config.ConfigurationUIController", - "allDeclaredFields":true, - "queryAllDeclaredMethods":true, - "methods":[ - {"name":"","parameterTypes":[] }, - {"name":"applyConfig","parameterTypes":["javafx.scene.input.MouseEvent"] }, - {"name":"initialize","parameterTypes":[] }, - {"name":"saveConfig","parameterTypes":["javafx.scene.input.MouseEvent"] } - ] -}, -{ - "name":"jace.config.Reconfigurable" -}, -{ - "name":"jace.core.CPU", - "fields":[ - {"name":"trace"}, - {"name":"traceLength"} - ] -}, -{ - "name":"jace.core.Computer", - "fields":[{"name":"enableStateManager"}], - "methods":[{"name":"invokeWarmStart","parameterTypes":[] }] -}, -{ - "name":"jace.core.Debugger" -}, -{ - "name":"jace.core.KeyHandler" -}, -{ - "name":"jace.core.Keyboard", - "allPublicFields":true, - "queryAllPublicMethods":true, - "methods":[ - {"name":"openApple","parameterTypes":["boolean"] }, - {"name":"solidApple","parameterTypes":["boolean"] } - ] -}, -{ - "name":"jace.core.Motherboard", - "allPublicFields":true, - "queryAllPublicMethods":true -}, -{ - "name":"jace.core.RAMEvent$RAMEventHandler" -}, -{ - "name":"jace.core.SoftSwitch" -}, -{ - "name":"jace.core.SoundMixer", - "allPublicFields":true, - "queryAllPublicMethods":true -}, -{ - "name":"jace.core.TimedDevice", - "fields":[ - {"name":"maxspeed"}, - {"name":"speedRatio"} - ] -}, -{ - "name":"jace.core.Video", - "fields":[ - {"name":"MIN_SCREEN_REFRESH"}, - {"name":"hblankOffsetX"}, - {"name":"hblankOffsetY"}, - {"name":"waitsPerCycle"} - ] -}, -{ - "name":"jace.core.VideoWriter" -}, -{ - "name":"jace.hardware.CardAppleMouse", - "allPublicFields":true -}, -{ - "name":"jace.hardware.CardDiskII", - "allPublicFields":true, - "methods":[{"name":"","parameterTypes":["jace.core.Computer"] }] -}, -{ - "name":"jace.hardware.CardExt80Col" -}, -{ - "name":"jace.hardware.CardHayesMicromodem", - "allPublicFields":true -}, -{ - "name":"jace.hardware.CardMockingboard", - "methods":[{"name":"","parameterTypes":["jace.core.Computer"] }] -}, -{ - "name":"jace.hardware.CardRamFactor", - "allPublicFields":true, - "methods":[{"name":"","parameterTypes":["jace.core.Computer"] }] -}, -{ - "name":"jace.hardware.CardRamworks", - "allPublicFields":true, - "methods":[{"name":"","parameterTypes":["jace.core.Computer"] }] -}, -{ - "name":"jace.hardware.CardSSC", - "allPublicFields":true -}, -{ - "name":"jace.hardware.CardThunderclock", - "allPublicFields":true -}, -{ - "name":"jace.hardware.Joystick", - "allPublicFields":true, - "queryAllPublicMethods":true -}, -{ - "name":"jace.hardware.NoSlotClock", - "allPublicFields":true, - "queryAllPublicMethods":true -}, -{ - "name":"jace.hardware.PassportMidiInterface" -}, -{ - "name":"jace.hardware.ProdosDriver" -}, -{ - "name":"jace.hardware.SmartportDriver" -}, -{ - "name":"jace.hardware.ZipWarpAccelerator", - "allPublicFields":true, - "queryAllPublicMethods":true -}, -{ - "name":"jace.hardware.massStorage.CardMassStorage", - "allPublicFields":true, - "methods":[{"name":"","parameterTypes":["jace.core.Computer"] }] -}, -{ - "name":"jace.hardware.massStorage.DiskNode" -}, -{ - "name":"jace.hardware.massStorage.IDisk" -}, -{ - "name":"jace.hardware.mockingboard.TimedGenerator" -}, -{ - "name":"jace.ide.CompileResult" -}, -{ - "name":"jace.ide.IdeController", - "allDeclaredFields":true, - "queryAllDeclaredMethods":true, - "methods":[ - {"name":"","parameterTypes":[] }, - {"name":"executeClicked","parameterTypes":["javafx.event.ActionEvent"] }, - {"name":"initialize","parameterTypes":[] }, - {"name":"newApplesoftBasicClicked","parameterTypes":["javafx.event.ActionEvent"] }, - {"name":"newApplesoftBasicFromMemoryClicked","parameterTypes":["javafx.event.ActionEvent"] }, - {"name":"newAssemblyListingClicked","parameterTypes":["javafx.event.ActionEvent"] }, - {"name":"newHexdataClicked","parameterTypes":["javafx.event.ActionEvent"] }, - {"name":"onCloseClicked","parameterTypes":["javafx.event.ActionEvent"] }, - {"name":"testCompileClicked","parameterTypes":["javafx.event.ActionEvent"] }, - {"name":"viewCompilerOutputClicked","parameterTypes":["javafx.event.ActionEvent"] } - ] -}, -{ - "name":"jace.ide.LanguageHandler" -}, -{ - "name":"jace.ide.Program" -}, -{ - "name":"jace.lawless.LawlessComputer", - "allPublicFields":true, - "queryAllPublicMethods":true -}, -{ - "name":"jace.lawless.LawlessHacks", - "allPublicFields":true, - "queryAllPublicMethods":true -}, -{ - "name":"jace.lawless.LawlessVideo", - "allPublicFields":true, - "methods":[{"name":"","parameterTypes":["jace.core.Computer"] }] -}, -{ - "name":"jace.library.MediaConsumer" -}, -{ - "name":"jace.library.MediaConsumerParent" -}, -{ - "name":"java.io.FileFilter" -}, -{ - "name":"java.io.Serializable" -}, -{ - "name":"java.lang.Character", - "methods":[{"name":"isIdeographic","parameterTypes":["int"] }] -}, -{ - "name":"java.lang.Class", - "methods":[ - {"name":"forName","parameterTypes":["java.lang.Module","java.lang.String"] }, - {"name":"getModule","parameterTypes":[] } - ] -}, -{ - "name":"java.lang.Comparable" -}, -{ - "name":"java.lang.Enum" -}, -{ - "name":"java.lang.Module", - "queriedMethods":[ - {"name":"getDescriptor","parameterTypes":[] }, - {"name":"getLayer","parameterTypes":[] }, - {"name":"getName","parameterTypes":[] }, - {"name":"getResourceAsStream","parameterTypes":["java.lang.String"] } - ] -}, -{ - "name":"java.lang.ModuleLayer", - "methods":[ - {"name":"boot","parameterTypes":[] }, - {"name":"findModule","parameterTypes":["java.lang.String"] } - ] -}, -{ - "name":"java.lang.Runnable" -}, -{ - "name":"java.lang.String", - "methods":[{"name":"valueOf","parameterTypes":["java.lang.Object"] }] -}, -{ - "name":"java.lang.StringBuilder" -}, -{ - "name":"java.lang.annotation.Annotation" -}, -{ - "name":"java.lang.invoke.CallSite" -}, -{ - "name":"java.net.URL" -}, -{ - "name":"java.net.URLConnection", - "methods":[{"name":"getContentLengthLong","parameterTypes":[] }] -}, -{ - "name":"java.nio.Buffer", - "allDeclaredFields":true -}, -{ - "name":"java.nio.ByteBuffer", - "allDeclaredFields":true, - "methods":[{"name":"order","parameterTypes":["java.nio.ByteOrder"] }] -}, -{ - "name":"java.nio.ByteOrder", - "methods":[{"name":"nativeOrder","parameterTypes":[] }] -}, -{ - "name":"java.nio.DirectByteBuffer", - "allDeclaredFields":true, - "unsafeAllocated":true -}, -{ - "name":"java.nio.DirectCharBufferU", - "allDeclaredFields":true -}, -{ - "name":"java.nio.DirectDoubleBufferU", - "allDeclaredFields":true -}, -{ - "name":"java.nio.DirectFloatBufferU", - "allDeclaredFields":true -}, -{ - "name":"java.nio.DirectIntBufferU", - "allDeclaredFields":true, - "unsafeAllocated":true -}, -{ - "name":"java.nio.DirectLongBufferU", - "allDeclaredFields":true -}, -{ - "name":"java.nio.DirectShortBufferU", - "allDeclaredFields":true, - "unsafeAllocated":true -}, -{ - "name":"java.nio.MappedByteBuffer", - "allDeclaredFields":true -}, -{ - "name":"java.security.AlgorithmParametersSpi" -}, -{ - "name":"java.security.KeyStoreSpi" -}, -{ - "name":"java.security.SecureRandomParameters" -}, -{ - "name":"java.util.Comparator" -}, -{ - "name":"java.util.HashMap" -}, -{ - "name":"java.util.List", - "queriedMethods":[{"name":"copyOf","parameterTypes":["java.util.Collection"] }] -}, -{ - "name":"java.util.Map$Entry" -}, -{ - "name":"java.util.Optional", - "queriedMethods":[{"name":"isEmpty","parameterTypes":[] }] -}, -{ - "name":"java.util.TreeMap" -}, -{ - "name":"java.util.TreeSet" -}, -{ - "name":"java.util.function.Function" -}, -{ - "name":"java.util.zip.DeflaterInputStream" -}, -{ - "name":"javafx.animation.KeyValue" -}, -{ - "name":"javafx.application.Application" -}, -{ - "name":"javafx.collections.FXCollections", - "methods":[{"name":"observableArrayList","parameterTypes":[] }] -}, -{ - "name":"javafx.fxml.FXMLLoader" -}, -{ - "name":"javafx.geometry.Insets", - "queryAllPublicMethods":true, - "queryAllPublicConstructors":true, - "methods":[ - {"name":"","parameterTypes":["double"] }, - {"name":"","parameterTypes":["double","double","double","double"] } - ] -}, -{ - "name":"javafx.geometry.NodeOrientation", - "methods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }] -}, -{ - "name":"javafx.geometry.Pos", - "methods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }] -}, -{ - "name":"javafx.scene.Camera" -}, -{ - "name":"javafx.scene.Group" -}, -{ - "name":"javafx.scene.Node", - "queryAllDeclaredMethods":true, - "methods":[ - {"name":"getId","parameterTypes":[] }, - {"name":"getStyleClass","parameterTypes":[] }, - {"name":"setId","parameterTypes":["java.lang.String"] }, - {"name":"setLayoutX","parameterTypes":["double"] }, - {"name":"setLayoutY","parameterTypes":["double"] }, - {"name":"setMouseTransparent","parameterTypes":["boolean"] }, - {"name":"setNodeOrientation","parameterTypes":["javafx.geometry.NodeOrientation"] }, - {"name":"setOnMouseClicked","parameterTypes":["javafx.event.EventHandler"] }, - {"name":"setPickOnBounds","parameterTypes":["boolean"] }, - {"name":"setStyle","parameterTypes":["java.lang.String"] }, - {"name":"setVisible","parameterTypes":["boolean"] } - ] -}, -{ - "name":"javafx.scene.ParallelCamera" -}, -{ - "name":"javafx.scene.Parent", - "queryAllDeclaredMethods":true, - "methods":[{"name":"getStylesheets","parameterTypes":[] }] -}, -{ - "name":"javafx.scene.Scene" -}, -{ - "name":"javafx.scene.control.Button", - "queryAllDeclaredMethods":true, - "queryAllPublicConstructors":true, - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"javafx.scene.control.ButtonBase", - "queryAllDeclaredMethods":true -}, -{ - "name":"javafx.scene.control.CheckMenuItem", - "queryAllDeclaredMethods":true, - "queryAllPublicConstructors":true, - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"javafx.scene.control.ComboBox", - "queryAllDeclaredMethods":true, - "queryAllPublicConstructors":true, - "methods":[ - {"name":"","parameterTypes":[] }, - {"name":"setItems","parameterTypes":["javafx.collections.ObservableList"] } - ] -}, -{ - "name":"javafx.scene.control.ComboBoxBase", - "queryAllDeclaredMethods":true, - "methods":[{"name":"setValue","parameterTypes":["java.lang.Object"] }] -}, -{ - "name":"javafx.scene.control.ContentDisplay", - "methods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }] -}, -{ - "name":"javafx.scene.control.Control", - "queryAllDeclaredMethods":true -}, -{ - "name":"javafx.scene.control.CustomMenuItem", - "queryAllDeclaredMethods":true -}, -{ - "name":"javafx.scene.control.Label", - "queryAllDeclaredMethods":true, - "queryAllPublicConstructors":true, - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"javafx.scene.control.Labeled", - "queryAllDeclaredMethods":true, - "methods":[ - {"name":"setAlignment","parameterTypes":["javafx.geometry.Pos"] }, - {"name":"setContentDisplay","parameterTypes":["javafx.scene.control.ContentDisplay"] }, - {"name":"setGraphic","parameterTypes":["javafx.scene.Node"] }, - {"name":"setMnemonicParsing","parameterTypes":["boolean"] }, - {"name":"setText","parameterTypes":["java.lang.String"] } - ] -}, -{ - "name":"javafx.scene.control.Menu", - "queryAllDeclaredMethods":true, - "queryAllPublicConstructors":true, - "methods":[ - {"name":"","parameterTypes":[] }, - {"name":"getItems","parameterTypes":[] } - ] -}, -{ - "name":"javafx.scene.control.MenuBar", - "queryAllDeclaredMethods":true, - "queryAllPublicConstructors":true, - "methods":[ - {"name":"","parameterTypes":[] }, - {"name":"getMenus","parameterTypes":[] } - ] -}, -{ - "name":"javafx.scene.control.MenuItem", - "queryAllDeclaredMethods":true, - "queryAllPublicConstructors":true, - "methods":[ - {"name":"","parameterTypes":[] }, - {"name":"getId","parameterTypes":[] }, - {"name":"setAccelerator","parameterTypes":["javafx.scene.input.KeyCombination"] }, - {"name":"setDisable","parameterTypes":["boolean"] }, - {"name":"setId","parameterTypes":["java.lang.String"] }, - {"name":"setMnemonicParsing","parameterTypes":["boolean"] }, - {"name":"setOnAction","parameterTypes":["javafx.event.EventHandler"] }, - {"name":"setText","parameterTypes":["java.lang.String"] } - ] -}, -{ - "name":"javafx.scene.control.RadioMenuItem", - "queryAllDeclaredMethods":true, - "queryAllPublicConstructors":true, - "methods":[ - {"name":"","parameterTypes":[] }, - {"name":"setSelected","parameterTypes":["boolean"] }, - {"name":"setToggleGroup","parameterTypes":["javafx.scene.control.ToggleGroup"] } - ] -}, -{ - "name":"javafx.scene.control.ScrollPane", - "queryAllDeclaredMethods":true, - "queryAllPublicConstructors":true, - "methods":[ - {"name":"","parameterTypes":[] }, - {"name":"setContent","parameterTypes":["javafx.scene.Node"] }, - {"name":"setFitToHeight","parameterTypes":["boolean"] }, - {"name":"setFitToWidth","parameterTypes":["boolean"] } - ] -}, -{ - "name":"javafx.scene.control.SeparatorMenuItem", - "queryAllDeclaredMethods":true, - "queryAllPublicConstructors":true, - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"javafx.scene.control.Slider", - "queryAllDeclaredMethods":true, - "queryAllPublicConstructors":true, - "methods":[ - {"name":"","parameterTypes":[] }, - {"name":"setBlockIncrement","parameterTypes":["double"] }, - {"name":"setMajorTickUnit","parameterTypes":["double"] }, - {"name":"setMax","parameterTypes":["double"] }, - {"name":"setMinorTickCount","parameterTypes":["int"] }, - {"name":"setShowTickLabels","parameterTypes":["boolean"] }, - {"name":"setShowTickMarks","parameterTypes":["boolean"] }, - {"name":"setSnapToTicks","parameterTypes":["boolean"] }, - {"name":"setValue","parameterTypes":["double"] } - ] -}, -{ - "name":"javafx.scene.control.SplitPane", - "queryAllDeclaredMethods":true, - "queryAllPublicConstructors":true, - "methods":[ - {"name":"","parameterTypes":[] }, - {"name":"getItems","parameterTypes":[] }, - {"name":"setDividerPositions","parameterTypes":["double[]"] } - ] -}, -{ - "name":"javafx.scene.control.TabPane", - "queryAllDeclaredMethods":true, - "queryAllPublicConstructors":true, - "methods":[ - {"name":"","parameterTypes":[] }, - {"name":"setTabClosingPolicy","parameterTypes":["javafx.scene.control.TabPane$TabClosingPolicy"] } - ] -}, -{ - "name":"javafx.scene.control.TabPane$TabClosingPolicy", - "methods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }] -}, -{ - "name":"javafx.scene.control.ToggleGroup", - "queryAllPublicConstructors":true, - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"javafx.scene.control.ToolBar", - "queryAllDeclaredMethods":true, - "queryAllPublicConstructors":true, - "methods":[ - {"name":"","parameterTypes":[] }, - {"name":"getItems","parameterTypes":[] } - ] -}, -{ - "name":"javafx.scene.control.TreeItem" -}, -{ - "name":"javafx.scene.control.TreeView", - "queryAllDeclaredMethods":true, - "queryAllPublicConstructors":true, - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"javafx.scene.effect.Effect" -}, -{ - "name":"javafx.scene.image.Image" -}, -{ - "name":"javafx.scene.image.ImageView", - "queryAllDeclaredMethods":true, - "queryAllPublicConstructors":true, - "methods":[ - {"name":"","parameterTypes":[] }, - {"name":"setFitHeight","parameterTypes":["double"] }, - {"name":"setFitWidth","parameterTypes":["double"] }, - {"name":"setImage","parameterTypes":["javafx.scene.image.Image"] } - ] -}, -{ - "name":"javafx.scene.input.KeyCode", - "methods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }] -}, -{ - "name":"javafx.scene.input.KeyCodeCombination", - "queryAllPublicMethods":true, - "queryAllPublicConstructors":true, - "methods":[{"name":"","parameterTypes":["javafx.scene.input.KeyCode","javafx.scene.input.KeyCombination$ModifierValue","javafx.scene.input.KeyCombination$ModifierValue","javafx.scene.input.KeyCombination$ModifierValue","javafx.scene.input.KeyCombination$ModifierValue","javafx.scene.input.KeyCombination$ModifierValue"] }] -}, -{ - "name":"javafx.scene.input.KeyCombination$ModifierValue", - "methods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }] -}, -{ - "name":"javafx.scene.layout.AnchorPane", - "queryAllDeclaredMethods":true, - "queryAllPublicConstructors":true, - "methods":[ - {"name":"","parameterTypes":[] }, - {"name":"setBottomAnchor","parameterTypes":["javafx.scene.Node","java.lang.Double"] }, - {"name":"setLeftAnchor","parameterTypes":["javafx.scene.Node","java.lang.Double"] }, - {"name":"setRightAnchor","parameterTypes":["javafx.scene.Node","java.lang.Double"] }, - {"name":"setTopAnchor","parameterTypes":["javafx.scene.Node","java.lang.Double"] } - ], - "queriedMethods":[ - {"name":"getBottomAnchor","parameterTypes":["javafx.scene.Node"] }, - {"name":"getLeftAnchor","parameterTypes":["javafx.scene.Node"] }, - {"name":"getRightAnchor","parameterTypes":["javafx.scene.Node"] }, - {"name":"getTopAnchor","parameterTypes":["javafx.scene.Node"] } - ] -}, -{ - "name":"javafx.scene.layout.BorderPane", - "queryAllDeclaredMethods":true, - "queryAllPublicConstructors":true, - "methods":[ - {"name":"","parameterTypes":[] }, - {"name":"setAlignment","parameterTypes":["javafx.scene.Node","javafx.geometry.Pos"] }, - {"name":"setBottom","parameterTypes":["javafx.scene.Node"] }, - {"name":"setCenter","parameterTypes":["javafx.scene.Node"] }, - {"name":"setTop","parameterTypes":["javafx.scene.Node"] } - ], - "queriedMethods":[{"name":"getAlignment","parameterTypes":["javafx.scene.Node"] }] -}, -{ - "name":"javafx.scene.layout.HBox", - "queryAllDeclaredMethods":true, - "queryAllPublicConstructors":true, - "methods":[ - {"name":"","parameterTypes":[] }, - {"name":"setAlignment","parameterTypes":["javafx.geometry.Pos"] }, - {"name":"setFillHeight","parameterTypes":["boolean"] }, - {"name":"setHgrow","parameterTypes":["javafx.scene.Node","javafx.scene.layout.Priority"] }, - {"name":"setMargin","parameterTypes":["javafx.scene.Node","javafx.geometry.Insets"] } - ], - "queriedMethods":[{"name":"getHgrow","parameterTypes":["javafx.scene.Node"] }] -}, -{ - "name":"javafx.scene.layout.Pane", - "queryAllDeclaredMethods":true, - "queryAllPublicConstructors":true, - "methods":[ - {"name":"","parameterTypes":[] }, - {"name":"getChildren","parameterTypes":[] } - ] -}, -{ - "name":"javafx.scene.layout.Priority", - "methods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }] -}, -{ - "name":"javafx.scene.layout.Region", - "queryAllDeclaredMethods":true, - "methods":[ - {"name":"setMaxHeight","parameterTypes":["double"] }, - {"name":"setMinHeight","parameterTypes":["double"] }, - {"name":"setPadding","parameterTypes":["javafx.geometry.Insets"] }, - {"name":"setPrefHeight","parameterTypes":["double"] }, - {"name":"setPrefWidth","parameterTypes":["double"] } - ] -}, -{ - "name":"javafx.scene.layout.StackPane", - "queryAllDeclaredMethods":true, - "queryAllPublicConstructors":true, - "methods":[ - {"name":"","parameterTypes":[] }, - {"name":"setAlignment","parameterTypes":["javafx.scene.Node","javafx.geometry.Pos"] }, - {"name":"setMargin","parameterTypes":["javafx.scene.Node","javafx.geometry.Insets"] } - ], - "queriedMethods":[{"name":"getAlignment","parameterTypes":["javafx.scene.Node"] }] -}, -{ - "name":"javafx.scene.layout.TilePane", - "queryAllDeclaredMethods":true, - "queryAllPublicConstructors":true, - "methods":[ - {"name":"","parameterTypes":[] }, - {"name":"setAlignment","parameterTypes":["javafx.geometry.Pos"] }, - {"name":"setAlignment","parameterTypes":["javafx.scene.Node","javafx.geometry.Pos"] }, - {"name":"setHgap","parameterTypes":["double"] }, - {"name":"setVgap","parameterTypes":["double"] } - ], - "queriedMethods":[{"name":"getAlignment","parameterTypes":["javafx.scene.Node"] }] -}, -{ - "name":"javafx.scene.layout.VBox", - "queryAllDeclaredMethods":true, - "queryAllPublicConstructors":true, - "methods":[ - {"name":"","parameterTypes":[] }, - {"name":"setVgrow","parameterTypes":["javafx.scene.Node","javafx.scene.layout.Priority"] } - ], - "queriedMethods":[{"name":"getVgrow","parameterTypes":["javafx.scene.Node"] }] -}, -{ - "name":"javafx.scene.shape.LineTo" -}, -{ - "name":"javafx.scene.shape.MoveTo" -}, -{ - "name":"javafx.scene.shape.Path" -}, -{ - "name":"javafx.scene.shape.PathElement" -}, -{ - "name":"javafx.scene.shape.Rectangle" -}, -{ - "name":"javafx.scene.shape.SVGPath" -}, -{ - "name":"javafx.scene.shape.Shape" -}, -{ - "name":"javafx.scene.text.Font" -}, -{ - "name":"javafx.scene.text.Text" -}, -{ - "name":"javafx.scene.transform.Transform" -}, -{ - "name":"javafx.scene.web.WebView" -}, -{ - "name":"javafx.stage.PopupWindow" -}, -{ - "name":"javafx.stage.Stage" -}, -{ - "name":"javafx.stage.Window" -}, -{ - "name":"javafx.util.StringConverter" -}, -{ - "name":"javafx.util.converter.IntegerStringConverter" -}, -{ - "name":"javax.security.auth.x500.X500Principal", - "fields":[{"name":"thisX500Name"}], - "queriedMethods":[{"name":"","parameterTypes":["sun.security.x509.X500Name"] }] -}, -{ - "name":"javax.swing.tree.TreeModel" -}, -{ - "name":"org.ibex.nestedvm.RuntimeCompiler", - "queriedMethods":[{"name":"compile","parameterTypes":["org.ibex.nestedvm.util.Seekable","java.lang.String","java.lang.String"] }] -}, -{ - "name":"org.ibex.nestedvm.UnixRuntime" -}, -{ - "name":"org.ibex.nestedvm.util.Platform" -}, -{ - "name":"org.ibex.nestedvm.util.Platform$Jdk14", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"org.ibex.nestedvm.util.Seekable" -}, -{ - "name":"org.lwjgl.system.CustomBuffer", - "fields":[ - {"name":"capacity"}, - {"name":"container"}, - {"name":"limit"}, - {"name":"mark"}, - {"name":"position"} - ] -}, -{ - "name":"org.lwjgl.system.Pointer$Default", - "fields":[{"name":"address"}] -}, -{ - "name":"sun.misc.Unsafe", - "allDeclaredFields":true -}, -{ - "name":"sun.security.pkcs12.PKCS12KeyStore", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.pkcs12.PKCS12KeyStore$DualFormatPKCS12", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.provider.DSA$SHA224withDSA", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.provider.DSA$SHA256withDSA", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.provider.JavaKeyStore$JKS", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.provider.MD5", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.provider.NativePRNG", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.provider.SHA", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.provider.SHA2$SHA224", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.provider.SHA2$SHA256", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.provider.SHA5$SHA384", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.provider.SHA5$SHA512", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.provider.X509Factory", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.rsa.PSSParameters", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.rsa.RSAKeyFactory$Legacy", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.rsa.RSAPSSSignature", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.rsa.RSASignature$SHA224withRSA", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.ssl.KeyManagerFactoryImpl$SunX509", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.ssl.SSLContextImpl$DefaultSSLContext", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.ssl.TrustManagerFactoryImpl$PKIXFactory", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.security.x509.AuthorityInfoAccessExtension", - "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] -}, -{ - "name":"sun.security.x509.AuthorityKeyIdentifierExtension", - "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] -}, -{ - "name":"sun.security.x509.BasicConstraintsExtension", - "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] -}, -{ - "name":"sun.security.x509.CRLDistributionPointsExtension", - "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] -}, -{ - "name":"sun.security.x509.CertificatePoliciesExtension", - "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] -}, -{ - "name":"sun.security.x509.ExtendedKeyUsageExtension", - "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] -}, -{ - "name":"sun.security.x509.IssuerAlternativeNameExtension", - "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] -}, -{ - "name":"sun.security.x509.KeyUsageExtension", - "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] -}, -{ - "name":"sun.security.x509.NetscapeCertTypeExtension", - "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] -}, -{ - "name":"sun.security.x509.PrivateKeyUsageExtension", - "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] -}, -{ - "name":"sun.security.x509.SubjectAlternativeNameExtension", - "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] -}, -{ - "name":"sun.security.x509.SubjectKeyIdentifierExtension", - "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] -} + { + "name": "jace.LawlessLegends", + "allDeclaredConstructors": true, + "allPublicConstructors": true, + "allDeclaredMethods": true, + "allPublicMethods": true, + "allDeclaredFields": true, + "allPublicFields": true + }, + { + "name": "jace.JaceUIController", + "allDeclaredConstructors": true, + "allPublicConstructors": true, + "allDeclaredMethods": true, + "allPublicMethods": true, + "allDeclaredFields": true, + "allPublicFields": true + }, + { + "name": "jace.ui.MetacheatUI", + "allDeclaredConstructors": true, + "allPublicConstructors": true, + "allDeclaredMethods": true, + "allPublicMethods": true, + "allDeclaredFields": true, + "allPublicFields": true + }, + { + "name": "jace.core.Computer", + "allDeclaredConstructors": true, + "allPublicConstructors": true, + "allDeclaredMethods": true, + "allPublicMethods": true + }, + { + "name": "jace.lawless.LawlessComputer", + "allDeclaredConstructors": true, + "allPublicConstructors": true, + "allDeclaredMethods": true, + "allPublicMethods": true + }, + { + "name": "javafx.application.Application", + "allDeclaredConstructors": true, + "allPublicConstructors": true, + "allDeclaredMethods": true, + "allPublicMethods": true + }, + { + "name": "javafx.scene.Scene", + "allDeclaredConstructors": true, + "allPublicConstructors": true + }, + { + "name": "javafx.stage.Stage", + "allDeclaredConstructors": true, + "allPublicConstructors": true, + "allDeclaredMethods": true, + "allPublicMethods": true + }, + { + "name": "javafx.fxml.FXMLLoader", + "allDeclaredConstructors": true, + "allPublicConstructors": true, + "allDeclaredMethods": true, + "allPublicMethods": true + }, + { + "name": "java.lang.reflect.Method", + "allDeclaredConstructors": true, + "allPublicConstructors": true, + "allDeclaredMethods": true, + "allPublicMethods": true + }, + { + "name": "java.lang.Class", + "allDeclaredConstructors": true, + "allPublicConstructors": true, + "allDeclaredMethods": true, + "allPublicMethods": true + }, + { + "name": "java.util.ArrayList", + "allDeclaredConstructors": true, + "allPublicConstructors": true + } ] diff --git a/Platform/Apple/tools/jace/src/main/resources/META-INF/native-image/resource-config.json b/Platform/Apple/tools/jace/src/main/resources/META-INF/native-image/resource-config.json index dfeaf7e3..bf387760 100644 --- a/Platform/Apple/tools/jace/src/main/resources/META-INF/native-image/resource-config.json +++ b/Platform/Apple/tools/jace/src/main/resources/META-INF/native-image/resource-config.json @@ -1,105 +1,24 @@ { - "resources":{ - "includes":[ - { - "pattern":".*\\.bin$" - }, - { - "pattern":".*\\.bmp$" - }, - { - "pattern":".*\\.css$" - }, - { - "pattern":".*\\.dat$" - }, - { - "pattern":".*\\.frag$" - }, - { - "pattern":".*\\.fxml$" - }, - { - "pattern":".*\\.gif$" - }, - { - "pattern":".*\\.gls$" - }, - { - "pattern":".*\\.html$" - }, - { - "pattern":".*\\.jpeg$" - }, - { - "pattern":".*\\.jpg$" - }, - { - "pattern":".*\\.js$" - }, - { - "pattern":".*\\.json$" - }, - { - "pattern":".*\\.license$" - }, - { - "pattern":".*\\.ogg$" - }, - { - "pattern":".*\\.mtl$" - }, - { - "pattern":".*\\.obj$" - }, - { - "pattern":".*\\.png$" - }, - { - "pattern":".*\\.raw$" - }, - { - "pattern":".*\\.rom$" - }, - { - "pattern":".*\\.ttf$" - }, - { - "pattern":".*\\.txt$" - }, - { - "pattern":".*\\.vert$" - }, - { - "pattern":".*\\.xml$" - }, - { - "pattern":"\\QMETA-INF/macos/x64/org/lwjgl/liblwjgl.dylib.sha1\\E" - }, - { - "pattern":"\\QMETA-INF/macos/x64/org/lwjgl/openal/libopenal.dylib.sha1\\E" - }, - { - "pattern":"\\QMETA-INF/macos/x64/org/lwjgl/stb/liblwjgl_stb.dylib.sha1\\E" - }, - { - "pattern":"\\Qmacos/x64/org/lwjgl/liblwjgl.dylib\\E" - }, - { - "pattern":"\\Qmacos/x64/org/lwjgl/openal/libopenal.dylib\\E" - }, - { - "pattern":"\\Qmacos/x64/org/lwjgl/stb/liblwjgl_stb.dylib\\E" - } - ]}, - "bundles":[ - { - "name":"com.sun.javafx.tk.quantum.QuantumMessagesBundle", - "locales":[""] - }, - { - "name":"com/sun/javafx/scene/control/skin/resources/controls", - "locales":[""] - } + "resources": { + "includes": [ + {"pattern": "\\QMETA-INF/services/\\E.*"}, + {"pattern": "\\Qfxml/\\E.*\\.fxml$"}, + {"pattern": "\\Qjace/data/\\E.*\\.png$"}, + {"pattern": "\\Qjace/data/\\E.*\\.gif$"}, + {"pattern": "\\Qjace/data/\\E.*\\.rom$"}, + {"pattern": "\\Qjace/data/\\E.*\\.bin$"}, + {"pattern": "\\Qjace/data/\\E.*\\.txt$"}, + {"pattern": "\\Qjace/data/\\E.*\\.ogg$"}, + {"pattern": "\\Qicons/\\E.*\\.png$"}, + {"pattern": "\\Qcss/\\E.*\\.css$"}, + {"pattern": "\\Qcom/sun/javafx/\\E.*"}, + {"pattern": "\\Qcom/sun/prism/\\E.*"}, + {"pattern": ".*\\.properties$"}, + {"pattern": "META-INF/MANIFEST.MF"} + ] + }, + "bundles": [ + {"name": "jace.lawless.Message", "locales": ["en", "en_US"]}, + {"name": "com.sun.javafx.tk.quantum.QuantumMessagesBundle", "locales": ["en", "en_US"]} ] } diff --git a/Platform/Apple/tools/jace/src/main/resources/META-INF/native-image/serialization-config.json b/Platform/Apple/tools/jace/src/main/resources/META-INF/native-image/serialization-config.json index b74bf575..71aab123 100644 --- a/Platform/Apple/tools/jace/src/main/resources/META-INF/native-image/serialization-config.json +++ b/Platform/Apple/tools/jace/src/main/resources/META-INF/native-image/serialization-config.json @@ -23,5 +23,7 @@ } ], "lambdaCapturingTypes":[ + ], + "proxies":[ ] } diff --git a/Platform/Apple/tools/jace/src/main/resources/fxml/JaceUI.fxml b/Platform/Apple/tools/jace/src/main/resources/fxml/JaceUI.fxml index 5432eae9..720df9fd 100644 --- a/Platform/Apple/tools/jace/src/main/resources/fxml/JaceUI.fxml +++ b/Platform/Apple/tools/jace/src/main/resources/fxml/JaceUI.fxml @@ -18,8 +18,9 @@ + - + @@ -90,7 +91,7 @@ - + @@ -98,9 +99,11 @@ + + - + @@ -113,8 +116,18 @@ - diff --git a/Platform/Apple/tools/jace/src/main/resources/jace/data/icon.icns b/Platform/Apple/tools/jace/src/main/resources/jace/data/icon.icns new file mode 100644 index 00000000..3b3e9fab Binary files /dev/null and b/Platform/Apple/tools/jace/src/main/resources/jace/data/icon.icns differ