summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Le Cuirot <chewi@gentoo.org>2023-06-24 21:59:16 +0100
committerJames Le Cuirot <chewi@gentoo.org>2023-06-24 21:59:16 +0100
commitb1988d72f5a434d9eedb52fd25b6324a16b0922d (patch)
tree4b8339ced801e13c4c32cafab119cca542d8e28e /games-arcade/shovel-knight
parentdev-ruby/rchardet: drop 1.8.0 (diff)
downloadgentoo-b1988d72f5a434d9eedb52fd25b6324a16b0922d.tar.gz
gentoo-b1988d72f5a434d9eedb52fd25b6324a16b0922d.tar.bz2
gentoo-b1988d72f5a434d9eedb52fd25b6324a16b0922d.zip
games-arcade/shovel-knight: Work around crash when a controller is connected
Signed-off-by: James Le Cuirot <chewi@gentoo.org>
Diffstat (limited to 'games-arcade/shovel-knight')
-rw-r--r--games-arcade/shovel-knight/shovel-knight-4.1b-r1.ebuild110
1 files changed, 110 insertions, 0 deletions
diff --git a/games-arcade/shovel-knight/shovel-knight-4.1b-r1.ebuild b/games-arcade/shovel-knight/shovel-knight-4.1b-r1.ebuild
new file mode 100644
index 000000000000..185cfa3f331a
--- /dev/null
+++ b/games-arcade/shovel-knight/shovel-knight-4.1b-r1.ebuild
@@ -0,0 +1,110 @@
+# Copyright 1999-2022 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+inherit desktop unpacker wrapper xdg
+
+MY_PN="ShovelKnight"
+DESCRIPTION="Sweeping classic action adventure with an 8-bit retro aesthetic"
+HOMEPAGE="https://yachtclubgames.com/games/shovel-knight-treasure-trove/"
+SRC_URI="${PN//-/_}_treasure_trove_4_1b_arby_s_46298.sh"
+S="${WORKDIR}/data/noarch/game"
+
+LICENSE="Yacht-Club-Games-EULA"
+SLOT="0"
+KEYWORDS="-* ~amd64 ~x86"
+IUSE="+joystick"
+RESTRICT="bindist fetch splitdebug"
+
+# I packaged Box2D in the hope of unbundling it but it turns out this
+# game uses a custom version. -- Chewi :(
+
+RDEPEND="
+ media-libs/glew:1.10
+ virtual/opengl
+ !x86? ( media-libs/libsdl2[joystick?,opengl,sound,video] )
+ x86? ( !joystick? ( media-libs/libsdl2[opengl,sound,video] ) )
+"
+
+BDEPEND="
+ dev-util/patchelf
+"
+
+DIR="/opt/${PN}"
+QA_PREBUILT="${DIR#/}/*"
+
+pkg_nofetch() {
+ einfo "Please buy and download ${SRC_URI} from:"
+ einfo " https://www.gog.com/game/${PN//-/_}"
+ einfo "and move it to your distfiles directory."
+}
+
+src_unpack() {
+ unpack_zip ${A}
+}
+
+src_install() {
+ local BITS=$(usex amd64 64 32) LIB=
+
+ exeinto "${DIR}"
+ doexe ${BITS}/${MY_PN}
+ make_wrapper ${MY_PN} ./${MY_PN} "${DIR}"
+
+ exeinto "${DIR}"/lib
+ doexe ${BITS}/lib/lib{Box2D.so.*,fmod*-*.so}
+
+ for LIB in ${BITS}/lib/libfmod*-*.so; do
+ LIB=${LIB##*/}
+
+ # The FMOD libraries are duplicated rather than symlinked, which is
+ # silly, so create our own symlinks. Both sets of names are needed.
+ dosym "${LIB}" "${DIR}/lib/${LIB%-*}.so"
+
+ # The SONAMEs are also unset, which upsets our QA check, so fix.
+ patchelf --set-soname "${LIB%-*}.so" "${ED}${DIR}/lib/${LIB}" || die
+ done
+
+ if use joystick; then
+ local SDL=libSDL2-2.0.so.0
+ local SDLj=libSDL2-joystick.so
+
+ if use x86; then
+ # Under x86, using our own SDL2 causes the game to crash when a
+ # controller is connected, even after applying the workaround below.
+ # It is seemingly caused by a change to the SDL_GetJoystickGUIDInfo
+ # signature. We must therefore use the bundled SDL2.
+ doexe ${BITS}/lib/${SDL}
+ else
+ # The game uses internal SDL2 joystick functions. These functions
+ # have since been hidden and some have been removed. Using our own
+ # SDL2 therefore causes the game to crash when a controller is
+ # connected. We still want to use our own SDL2 for things like
+ # Wayland, but we can work around this by loading both, using the
+ # bundled one as a fallback.
+ newexe ${BITS}/lib/${SDL} ${SDLj}
+
+ # The bundled SDL2 SONAME has to be set to something different.
+ patchelf --set-soname ${SDLj} "${ED}${DIR}"/lib/${SDLj} || die
+
+ # We need to add the new SONAME as a NEEDED entry, but the order is
+ # important, so we also need to remove the existing NEEDED entry
+ # first and add it back again afterwards.
+ patchelf \
+ --remove-needed ${SDL} \
+ --add-needed ${SDLj} \
+ --add-needed ${SDL} \
+ "${ED}${DIR}"/${MY_PN} || die
+ fi
+ fi
+
+ # The RUNPATHs are not entirely correct so fix up.
+ patchelf --set-rpath '$ORIGIN/lib' "${ED}${DIR}"/${MY_PN} || die
+ patchelf --set-rpath '$ORIGIN' "${ED}${DIR}"/lib/libfmodevent*.so || die
+
+ insinto "${DIR}"
+ doins -r data/
+
+ newicon -s 256 ../support/icon.png ${PN}.png
+ make_desktop_entry ${MY_PN} "Shovel Knight"
+}