From 4886578fc5b549febf368936b42e8c4490b5c2ea Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Thu, 15 Oct 2026 22:12:46 -0400 Subject: [PATCH] Oops forgot to include a file for Tekken installations. --- .includes/prism-wine.sh | 96 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 .includes/prism-wine.sh diff --git a/.includes/prism-wine.sh b/.includes/prism-wine.sh new file mode 100644 index 0000000..0fb428b --- /dev/null +++ b/.includes/prism-wine.sh @@ -0,0 +1,96 @@ +#!/usr/bin/env bash + +# Build the host bridge from the same release as the application's Prism DLL. +# Wine does not implement RpcMgmtInqIfIds, which Prism uses to detect NVDA. +build_prism_speech_bridge() ( + local prismVersion="$1" + local bridgeDir="$2" + local buildRoot sourceRoot tool + local -a missingTools=() + + for tool in curl tar cmake make winegcc wineg++ winebuild pkg-config; do + command -v "$tool" >/dev/null || missingTools+=("$tool") + done + if [[ ${#missingTools[@]} -gt 0 ]]; then + echo "Prism Wine speech requires: ${missingTools[*]}" >&2 + return 1 + fi + if ! pkg-config --exists speech-dispatcher; then + echo "Prism Wine speech requires the Speech Dispatcher development files (libspeechd)." >&2 + return 1 + fi + mkdir -p "${bridgeDir%/*}" || return 1 + buildRoot="$(mktemp -d "${bridgeDir%/*}/.build.XXXXXX")" || return 1 + trap 'rm -rf "$buildRoot"' EXIT + echo "Preparing Prism ${prismVersion} Wine speech support..." + if ! curl -fsSL --retry 3 "https://codeload.github.com/ethindp/prism/tar.gz/refs/tags/v${prismVersion}" -o "${buildRoot}/source.tar.gz" || + ! tar -xzf "${buildRoot}/source.tar.gz" -C "$buildRoot"; then + echo "Could not download or extract Prism ${prismVersion}." >&2 + return 1 + fi + sourceRoot="${buildRoot}/prism-${prismVersion}" + if ! cmake -S "${sourceRoot}/winelibs" -B "${buildRoot}/build" \ + -DCMAKE_TOOLCHAIN_FILE="${sourceRoot}/cmake/winelib-toolchain.cmake" \ + -DCMAKE_BUILD_TYPE=Release || + ! cmake --build "${buildRoot}/build" --target \ + prism_speech_dispatcher_bridge prism_speech_dispatcher_bridge_placeholder -j2; then + echo "Could not build Prism ${prismVersion} Wine speech support." >&2 + return 1 + fi + mkdir -p "$bridgeDir" || return 1 + cp "${buildRoot}/build/speechd/prism_speech_dispatcher_bridge.dll.so" \ + "${buildRoot}/build/speechd/placeholder/prism_speech_dispatcher_bridge.dll" \ + "$bridgeDir/" || return 1 +) + +prepare_arcadelux_prism_bridge() { + local gameDir="$1" + local prismVersion + local -a metadataFiles=("${gameDir}"/_internal/prismatoid-*.dist-info/METADATA) + if [[ ${#metadataFiles[@]} -ne 1 || ! -f "${metadataFiles[0]}" ]]; then + echo "Could not identify Arcadelux's bundled Prism version." >&2 + return 1 + fi + prismVersion="$(sed -n 's/^Version: //p' "${metadataFiles[0]}" | tr -d '\r')" + if [[ ! "$prismVersion" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "Unsupported Prism version: ${prismVersion}" >&2 + return 1 + fi + prepare_prism_bridge "$gameDir" "$prismVersion" "Arcadelux.exe" +} + +# App wrappers identify their bundled Prism release before sharing bridge setup. +prepare_prism_bridge() { + local gameDir="$1" + local prismVersion="$2" + local gameExecutable="$3" + local bridgeDir + if [[ ! "$prismVersion" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "Unsupported Prism version: ${prismVersion}" >&2 + return 1 + fi + if [[ "$(uname -m)" != "x86_64" ]] || ! file -b "${gameDir}/${gameExecutable}" | grep -q 'PE32+'; then + echo "Prism Wine speech requires an x86_64 host and 64-bit game." >&2 + return 1 + fi + bridgeDir="${XDG_CACHE_HOME:-$HOME/.cache}/audiogame-manager/prism-wine/${prismVersion}-x86_64" + if [[ ! -f "${bridgeDir}/prism_speech_dispatcher_bridge.dll" || + ! -f "${bridgeDir}/prism_speech_dispatcher_bridge.dll.so" ]]; then + build_prism_speech_bridge "$prismVersion" "$bridgeDir" || return 1 + fi + # Updates replace the game directory, so restore the placeholder each launch. + cp "${bridgeDir}/prism_speech_dispatcher_bridge.dll" "$gameDir/" || return 1 + export WINEDLLPATH="${bridgeDir}${WINEDLLPATH:+:$WINEDLLPATH}" +} + +prepare_tekken3_prism_bridge() { + local gameDir="$1" + local prismHash + # Access 1.0 ships this exact Prism 0.18.3 DLL. Refuse an unverified update. + prismHash="$(sha256sum "${gameDir}/T3Access/prism.dll")" || return 1 + if [[ "${prismHash%% *}" != "7c7d09c8c7306e8e1a0c46d603ccb2a391c194c77843400c11b746e7dd56a467" ]]; then + echo "Tekken 3 Access has an unrecognized Prism DLL; update its AGM integration before launching." >&2 + return 1 + fi + prepare_prism_bridge "$gameDir" "0.18.3" "Tekken3.exe" +}