emulator: ruffle type: standalone core_classification: game_engine source: "https://github.com/ruffle-rs/ruffle" upstream: "https://github.com/ruffle-rs/ruffle" profiled_date: "2026-08-08" source_commit: "1636c780671f5f751504240c462524ae6cfcc4bb" core_version: "0.5.0" display_name: "Adobe Flash (Ruffle)" cores: - ruffle systems: - flash mode: standalone notes: | Flash Player and Adobe AIR runtime written in Rust, playing SWF files of any ActionScript version, as a desktop binary or as a WebAssembly browser build. Distribution is by nightly build: Batocera compiles the nightly-2026-01-31 tag and installs ruffle_desktop as ruffle, RetroDECK pulls the rs.ruffle.Ruffle Flathub build. ES-DE runs it as `ruffle --fullscreen `, Batocera as `ruffle `, RetroBat as `ruffle.exe --graphics --force-align -q `, RetroDECK as `ruffle --graphics vulkan --config /var/data/ruffle --save-directory /ruffle `. The ActionScript class library is compiled by build_playerglobal into playerglobal_avm1.swf and playerglobal_avm2.swf and linked into the binary from OUT_DIR (core/src/avm1/globals.rs:89, core/src/avm2/globals.rs:548), so startup reads nothing. Locale texts, wgsl shaders, the window icon and the OpenH264 license are embedded the same way (desktop/src/gui/locale.rs:7-12, desktop/src/app.rs:464, render/wgpu/src/shaders.rs:28-76). H.264 video is the one external dependency. external_video is a default feature and pulls ruffle_video_external with openh264 (desktop/Cargo.toml:26,83,90), and enable_openh264 defaults to true (desktop/src/preferences.rs:291,316). OpenH264Codec::load first dlopens the system sonames libopenh264.so.7, libopenh264.so.2.4.1 and libopenh264.so on Linux, then falls back to /ruffle/video/ and fetches the Cisco binary from ciscobinary.openh264.org bz2-compressed into it (video/external/src/decoder/openh264.rs:53-56,109-133,173-191, desktop/src/player.rs:234-241). Whether the library was already there or was just downloaded, its SHA-256 is checked before loading and the size is read only to format the mismatch message (video/external/src/decoder/openh264.rs:135-146), and WelsGetCodecVersion must answer 2.4.1 exactly (video/external/src/decoder/openh264.rs:46,153-166). The cache root comes from dirs::cache_dir(), ~/.cache/ruffle by default, and --cache-directory moves it (desktop/src/cli.rs:29-33,140). Without the library the player still starts: ExternalVideoBackend wraps SoftwareVideoBackend, so H.263, Screen Video and VP6 keep decoding and only H.264 streams fail (video/external/src/backend.rs:41,51-69,73-80). Text uses system fonts. fontdb::Database::load_system_fonts() fills the database at startup (desktop/src/app.rs:433-434), and both the Flash device fonts and the egui menu bar resolve family names against it and take whatever face the host answers with. How that face is read now depends on the renderer: freetype joined the desktop default features, so on Linux it goes through FreetypeFontRenderer, and the plain memory map of the file is the other branch (desktop/src/backends/ui.rs:366-406,518-562, desktop/src/gui/controller.rs:760-803). The families asked for are Times New Roman, Arial, Courier New and their metric-compatible substitutes, plus the CJK, Hebrew, Arabic and Thai faces (desktop/src/player.rs:361-412, desktop/src/gui/controller.rs:639-711), and on Unix fontconfig sorts the fallback chain (desktop/src/backends/ui.rs:363-376,536-550). No name, path, size or hash is fixed anywhere. The compiled-in Noto Sans subset sits behind the default_font feature, which the desktop build does not enable (core/src/player.rs:84-85, core/Cargo.toml:82,95, desktop/Cargo.toml:22), so an unmatched family leaves the run without that face rather than falling back to a bundled one. Files the player writes rather than expects: preferences.toml, bookmarks.toml and recents.toml under --config, each defaulted when absent (desktop/src/preferences.rs:54-96), .sol SharedObjects under --save-directory (frontend-utils/src/backends/storage.rs:31-60), and the log file (desktop/src/main.rs:156-166). ruffle-bundle.toml is the manifest inside a .ruf bundle, which is content alongside the .swf rather than a runtime input (frontend-utils/src/bundle/info.rs:11, frontend-utils/src/bundle.rs:42-53). mms.cfg is not implemented, the name appears only in an AVM2 error string (core/src/avm2/error_messages.rs:237). files: # -- OpenH264 2.4.1 decoder, one build per OS and architecture -- - name: libopenh264-2.4.1-linux64.7.so path: "video/libopenh264-2.4.1-linux64.7.so" system: flash required: false description: "OpenH264 2.4.1 decoder library, Linux x86_64" sha256: "1392d21466bc638e68151b716d5b2086d54cd812afd43253f1adb5b6e0185f51" validation: [sha256] source_ref: "video/external/src/decoder/openh264.rs:65-68, 104-146, 173-191" - name: libopenh264-2.4.1-linux-arm64.7.so path: "video/libopenh264-2.4.1-linux-arm64.7.so" system: flash required: false description: "OpenH264 2.4.1 decoder library, Linux aarch64" sha256: "e8ea7e42855ceb4a90e7bd0b3abeba0c58b5f97166e8b0a30eefd58e099557a4" validation: [sha256] source_ref: "video/external/src/decoder/openh264.rs:73-76, 104-146, 173-191" - name: libopenh264-2.4.1-linux-arm.7.so path: "video/libopenh264-2.4.1-linux-arm.7.so" system: flash required: false description: "OpenH264 2.4.1 decoder library, Linux arm" sha256: "fd1dfb27d30bb72e903c9d2b4c650104a4369d2e7ffe8a4a533e8db2e7e9b19e" validation: [sha256] source_ref: "video/external/src/decoder/openh264.rs:69-72, 104-146, 173-191" - name: libopenh264-2.4.1-linux32.7.so path: "video/libopenh264-2.4.1-linux32.7.so" system: flash required: false description: "OpenH264 2.4.1 decoder library, Linux x86" sha256: "b7cf0e407f99056d90cbf62787a34820a7595b2129b165319d50766e00a66704" validation: [sha256] source_ref: "video/external/src/decoder/openh264.rs:61-64, 104-146, 173-191" - name: libopenh264-2.4.1-mac-arm64.dylib path: "video/libopenh264-2.4.1-mac-arm64.dylib" system: flash required: false description: "OpenH264 2.4.1 decoder library, macOS aarch64" sha256: "213ff93831cfa3dd6d7ad0c3a3403a6ceedf4ac1341e1278b5b869d42fefb496" validation: [sha256] source_ref: "video/external/src/decoder/openh264.rs:81-84, 104-146, 173-191" - name: libopenh264-2.4.1-mac-x64.dylib path: "video/libopenh264-2.4.1-mac-x64.dylib" system: flash required: false description: "OpenH264 2.4.1 decoder library, macOS x86_64" sha256: "cc0ba518a63791c37571f3c851f0aa03a4fbda5410acc214ecd4f24f8d1c478e" validation: [sha256] source_ref: "video/external/src/decoder/openh264.rs:77-80, 104-146, 173-191" - name: openh264-2.4.1-win64.dll path: "video/openh264-2.4.1-win64.dll" system: flash required: false description: "OpenH264 2.4.1 decoder library, Windows x86_64" sha256: "081b0c081480d177cbfddfbc90b1613640e702f875897b30d8de195cde73dd34" validation: [sha256] source_ref: "video/external/src/decoder/openh264.rs:89-92, 104-146, 173-191" - name: openh264-2.4.1-win32.dll path: "video/openh264-2.4.1-win32.dll" system: flash required: false description: "OpenH264 2.4.1 decoder library, Windows x86" sha256: "83270149640469c994a62cc32a6d8c0413cd7b802b7f1f2f532159f5bdc1cedd" validation: [sha256] source_ref: "video/external/src/decoder/openh264.rs:85-88, 104-146, 173-191"